输入类控件和多元素控件【QT】

ops/2025/2/7 17:06:33/

输入类控件

QLineEdit

例如: 实现一个用户输入姓名 密码 电话 性别 的功能

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_pushButton_submit_clicked();private:Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->lineEdit_name->setPlaceholderText("请输入姓名");ui->lineEdit_name->setClearButtonEnabled(true) ;ui->lineEdit_password->setPlaceholderText("请输入密码");ui->lineEdit_password->setClearButtonEnabled(true) ;ui->lineEdit_password->setEchoMode(QLineEdit::Password) ; //让密码不回显ui->lineEdit_phone->setPlaceholderText("请输入电话");ui->lineEdit_phone->setClearButtonEnabled(true) ;//手机号码是有固定格式的 , 这里的0代表数字ui->lineEdit_phone->setInputMask("000-0000-0000") ;
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_submit_clicked()
{QString gender =  ui->radioButton_male->isChecked() ? "男" :"女";qDebug() << "姓名: " << ui->lineEdit_name->text()<< "密码: " << ui->lineEdit_password->text()<< "性别: " << gender<< "电话: " << ui->lineEdit_phone->text();}

正则表达式:本质上就是一个带有特殊字符的字符串.特殊字符用来表示另一个字符串的特征.

此时就可以借助正则表达式来描述出一些具有一定特点的字符串

例如:

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_lineEdit_textEdited(const QString &arg1);private:Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QRegExpValidator>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//使用正则表达式来验证//这是一个简单的验证手机号码的正则表达式。 ^ 表示以 xxx 开头。 ^ 后面跟着的 1,意思就是以 1 开头。 \d 表示数字,为了在 C++ 字符串中使用,需要写作 \d {10} 表示前面的内容重复出现 10 次。\d 数字要重复出现 10 次。 $ 表示结尾了QRegExp regExp("^1\\d{10}$") ;ui->lineEdit->setValidator(new QRegExpValidator(regExp));
}Widget::~Widget()
{delete ui;
}void Widget::on_lineEdit_textEdited(const QString &text)
{QString content = text;int pos =0 ;//验证通过if(ui->lineEdit->validator()->validate(content,pos )  ==QValidator::Acceptable   ){ui->pushButton->setEnabled(true) ;}//未验证通过else{ui->pushButton->setEnabled(false) ;}
}

根据QLineEdit控件实现一个功能:验证两次输入的密码一致

widget

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_lineEdit_textEdited(const QString &arg1);void on_lineEdit_2_textEdited(const QString &arg1);void compare() ;
private:Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->lineEdit->setEchoMode(QLineEdit::Password);ui->lineEdit_2->setEchoMode(QLineEdit::Password);//使用textEdited信号,来触发对于两个输入框内容的判定ui->label->setText("密码为空");
}Widget::~Widget()
{delete ui;
}void Widget::on_lineEdit_textEdited(const QString &arg1)
{( void)arg1 ; //这个写法对于代码的实际逻辑是没有任何影响的."骗过"编译器,警告就没了this->compare();}void Widget::on_lineEdit_2_textEdited(const QString &arg1)
{( void)arg1 ; //这个写法对于代码的实际逻辑是没有任何影响的."骗过"编译器,警告就没了this->compare();
}void Widget::compare()
{
const   QString  & s1 =  ui->lineEdit->text() ;const   QString  & s2 =  ui->lineEdit_2->text() ;if(s1.isEmpty() ==true   && s2.isEmpty()==true ){ui->label->setText("密码为空");}else if (s1 ==s2){ui->label->setText("密码一致");}else{ui->label->setText("密码不一致");}
}

使用QLineEdit , 实现功能: 针对密码,可以切换“ 显示密码”状态

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_checkBox_toggled(bool checked);private:Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->lineEdit->setEchoMode(QLineEdit::Password) ;
}Widget::~Widget()
{delete ui;
}void Widget::on_checkBox_toggled(bool checked)
{if(checked ==true ){ui->lineEdit->setEchoMode(QLineEdit::Normal) ;}else{ui->lineEdit->setEchoMode(QLineEdit::Password) ;}}

Text Edit

例1: 实现输入文字的功能

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_textEdit_textChanged();private:Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}void Widget::on_textEdit_textChanged()
{const QString & text=   ui->textEdit->toPlainText();ui->label->setText(text) ;
}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

例2: 实现输入文字的功能,且能够选中 ,能够撤销(ctrl +z),能够撤销之前的撤销(ctrl +y)

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_textEdit_textChanged();void on_textEdit_selectionChanged();void on_textEdit_cursorPositionChanged();void on_textEdit_undoAvailable(bool b);void on_textEdit_redoAvailable(bool b);void on_textEdit_copyAvailable(bool b);private:Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}void Widget::on_textEdit_textChanged()
{qDebug()<<"textChanged :" <<ui->textEdit->toPlainText();
}void Widget::on_textEdit_selectionChanged()
{QTextCursor cursor = ui->textEdit->textCursor();qDebug()<<"selectionChanged :" <<cursor.selectedText();
}void Widget::on_textEdit_cursorPositionChanged()
{QTextCursor cursor = ui->textEdit->textCursor();qDebug()<<"cursorPositionChanged :" <<cursor.position();
}void Widget::on_textEdit_undoAvailable(bool b)
{qDebug()<<"undoAvailable"<<b;
}void Widget::on_textEdit_redoAvailable(bool b)
{
qDebug()<<"redoAvailable"<<b;
}void Widget::on_textEdit_copyAvailable(bool b)
{
qDebug()<<"copyAvailable"<<b;
}

Combo Box

例如:实现麦当劳点餐界面

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_pushButton_clicked();private:Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->comboBox->addItem("麦辣鸡腿堡");ui->comboBox->addItem("巨无霸");ui->comboBox->addItem("培根蔬萃双层牛堡");ui->comboBox_2->addItem("中薯条");ui->comboBox_2->addItem("麦乐鸡块");ui->comboBox_2->addItem("麦辣鸡翅");ui->comboBox_3->addItem("可乐");ui->comboBox_3->addItem("雪碧");
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_clicked()
{
qDebug()<<ui->comboBox->currentText()<<" , " <<ui->comboBox_2->currentText()<<" , " <<ui->comboBox_3->currentText();
}

或者通过ui界面的方式来添加麦辣鸡腿堡

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

例2:读取文件内容,把文件中的每一行读取出来,作为一个ComboBox的选项

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
#include<fstream>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//读取文件内容,把文件中的每一行读取出来,作为一个ComboBox的选项//如何理解文件流的输入和输出//文件流的输入和输出一般是考虑在CPU的视角中,从文件/磁盘将数据输入到CPU中 ,从CPU中输出数据到硬盘/文件std::ifstream file("C:/Users/cxq/Desktop/leetcode.txt");if(file.is_open() ==false){qDebug()<<"file open error" ;return ;}//换行读取文本内容std::string line ;while(std::getline (file ,line) ){//把文件中的每一行读取出来,作为一个ComboBox的选项ui->comboBox->addItem(QString::fromStdString(line));}file.close() ;}Widget::~Widget()
{delete ui;
}

Spin Box

例如:实现点餐界面功能

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_pushButton_clicked();private:Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->comboBox->addItem("麦辣鸡腿堡");ui->comboBox->addItem("巨无霸");ui->comboBox->addItem("培根蔬萃双层牛堡");ui->comboBox_2->addItem("中薯条");ui->comboBox_2->addItem("麦乐鸡块");ui->comboBox_2->addItem("麦辣鸡翅");ui->comboBox_3->addItem("可乐");ui->comboBox_3->addItem("雪碧");ui->spinBox->setRange(1,5) ;ui->spinBox_2->setRange(1,5) ;ui->spinBox_3->setRange(1,5) ;ui->spinBox->setValue(1) ;ui->spinBox_2->setValue(1) ;ui->spinBox_3->setValue(1) ;
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_clicked()
{
qDebug()<<ui->comboBox->currentText()<<" , " <<ui->comboBox_2->currentText()<<" , " <<ui->comboBox_3->currentText();
qDebug()<<ui->spinBox->value()<<" , " <<ui->spinBox_2->value()<<" , " <<ui->spinBox_3->value();
}
# Date Edit  && Time Edit 

例如:

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_pushButton_clicked();private:Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_clicked()
{QDateTime timeOld =  ui->dateTimeEdit->dateTime();QDateTime timeNew =  ui->dateTimeEdit_2->dateTime();qDebug()<<timeOld<<timeNew;//计算日期的差值//计算秒数的差值int seconds =timeOld.secsTo(timeNew);int hours = (seconds/3600) %24;qDebug()<<hours<<timeNew;//  int days =timeOld.daysTo(timeNew);int days =(seconds/3600)/24;qDebug()<<days<<timeNew;ui->label->setText(QString::number(hours)) ;
}

Dial

例如: 通过旋钮控制窗口的不透明度

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_dial_valueChanged(int value);private:Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}void Widget::on_dial_valueChanged(int value)
{qDebug()<<value;//不透明度的取值范围是 0到1  , 0为完全透明 ,1 为完全不透明//通过打印value的值 , 发现value值是 0到100 ,所以需要除以100this->setWindowOpacity((double)value/100) ;
}

Slider

例如:

在窗口上放两个滑动条,一个是水平,垂直.滑动这两个滑动条,就能够调整窗口的大小

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_verticalSlider_valueChanged(int value);void on_horizontalSlider_valueChanged(int value);private:Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QRect>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->horizontalSlider->setMinimum(100) ;ui->horizontalSlider->setMaximum(2000) ;ui->horizontalSlider->setValue(800) ;ui->horizontalSlider->setSingleStep(50) ;ui->verticalSlider->setMinimum(100) ;ui->verticalSlider->setMaximum(1500) ;ui->verticalSlider->setValue(600) ;ui->verticalSlider->setSingleStep(50) ;}Widget::~Widget()
{delete ui;
}void Widget::on_verticalSlider_valueChanged(int value)
{const  QRect & rect =  this->geometry();this->setGeometry(rect.x() ,rect.y() , rect.width(),value ) ;}void Widget::on_horizontalSlider_valueChanged(int value)
{const  QRect & rect =  this->geometry();this->setGeometry(rect.x() ,rect.y() , value,rect.height() ) ;
}

例2:

自定义快捷键,通过快捷键来操作滑动条.

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_horizontalSlider_valueChanged(int value);void SubValue();void AddValue();
private:Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QShortcut>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//创建+ 和 - 的快捷键, = 和+ 属于同一个键位QShortcut *     shortCut1 = new QShortcut (this) ;shortCut1->setKey(QKeySequence("-" ) )  ;QShortcut *     shortCut2 = new QShortcut (this) ;shortCut2->setKey(QKeySequence("=" ) )  ;//信号槽connect (shortCut1 ,&QShortcut::activated , this , &Widget::SubValue);connect (shortCut2 ,&QShortcut::activated , this , &Widget::AddValue);
}Widget::~Widget()
{delete ui;
}void Widget::on_horizontalSlider_valueChanged(int value)
{ui->label->setText(QString::number(value));
}void Widget::SubValue()
{int value = ui->horizontalSlider->value();if(value <= ui->horizontalSlider->minimum()){return ;}ui->horizontalSlider->setValue(value-5) ;
}void Widget::AddValue()
{int value = ui->horizontalSlider->value();if(value >= ui->horizontalSlider->maximum()){return ;}ui->horizontalSlider->setValue(value+5) ;
}

多元素控件

QListWidget

例如:

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include<QListWidgetItem>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_pushButton_insert_clicked();void on_pushButton_delete_clicked();void on_listWidget_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous);private:Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->listWidget->addItem("java");ui->listWidget->addItem("c++");ui->listWidget->addItem("go");//在 QListWidgetItem中,可以设置字体属性,设置图标,设置文字大小,设置是否被选中等状态//第二种添加listWidget方式:ui->listWidget->addItem(new QListWidgetItem("c#") );}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_insert_clicked()
{//获取lineEdit输入框的内容, 添加到listWidget中const QString & text =  ui->lineEdit->text();ui->listWidget->addItem(text) ;
}void Widget::on_pushButton_delete_clicked()
{//获取被选中的元素位置int row  = ui->listWidget->currentRow();if(row<0)  //位置不存在{return ;}//根据元素位置删除对应的元素ui->listWidget->takeItem(row);}void Widget::on_listWidget_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
{if(current!=nullptr){qDebug()<<"当前元素:"<<current->text();}if(previous!=nullptr){qDebug()<<"上一个元素"<<previous->text();}
}

TableWidet

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_pushButton_insertRow_clicked();void on_pushButton_insertColumn_clicked();void on_pushButton_deleteRow_clicked();void on_pushButton_deleteColumn_clicked();private:Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->lineEdit->setText("");//创建三行三列ui->tableWidget->insertRow(0);ui->tableWidget->insertRow(1);ui->tableWidget->insertRow(2);ui->tableWidget->insertColumn(0);ui->tableWidget->insertColumn(1);ui->tableWidget->insertColumn(2);//设置水平方向的表头ui->tableWidget->setHorizontalHeaderItem(0 , new QTableWidgetItem("学号"));ui->tableWidget->setHorizontalHeaderItem(1 , new QTableWidgetItem("姓名"));ui->tableWidget->setHorizontalHeaderItem(2 , new QTableWidgetItem("年龄"));//向表格中添加数据ui->tableWidget->setItem(0,0,new QTableWidgetItem("1001"));ui->tableWidget->setItem(0,1,new QTableWidgetItem("张三"));ui->tableWidget->setItem(0,2,new QTableWidgetItem("20"));ui->tableWidget->setItem(1,0,new QTableWidgetItem("1001"));ui->tableWidget->setItem(1,1,new QTableWidgetItem("张三"));ui->tableWidget->setItem(1,2,new QTableWidgetItem("20"));ui->tableWidget->setItem(2,0,new QTableWidgetItem("1001"));ui->tableWidget->setItem(2,1,new QTableWidgetItem("张三"));ui->tableWidget->setItem(2,2,new QTableWidgetItem("20"));
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_insertRow_clicked()
{//当前一共多少行int rowcount = ui->tableWidget->rowCount();//在最后一行之后新增新行//注意:  此处的参数是“下标",表示你新增之后的这一行是第几行qDebug()<<"rowcount: "<<rowcount;ui->tableWidget->insertRow(rowcount) ;
}void Widget::on_pushButton_insertColumn_clicked()
{//获取当前一共多少列int colCount = ui->tableWidget->columnCount();//新增列ui->tableWidget->insertColumn(colCount);//设置列名,列名从输入框中获取const  QString & text = ui->lineEdit->text();ui->tableWidget->setHorizontalHeaderItem(colCount, new QTableWidgetItem(text)) ;}void Widget::on_pushButton_deleteRow_clicked()
{//获取选中的行号int curRow = ui->tableWidget->currentRow();ui->tableWidget->removeRow(curRow);
}void Widget::on_pushButton_deleteColumn_clicked()
{//获取选中的行号int curColumn = ui->tableWidget->currentColumn();ui->tableWidget->removeColumn(curColumn);
}

TreeWidget

TreeWidget不是从根节点开始添加或删除节点 , 可以理解为没有根节点 ,从第二层开始添加或删除节点

TreeWidget的顶层节点是第二层开始计算的

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_pushButton_insertTopItem_clicked();void on_pushButton_insertItem_clicked();void on_pushButton_deleteItem_clicked();private:Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->treeWidget->setHeaderLabel("动物"); //设置表头//新增顶层节点QTreeWidgetItem * item1  = new QTreeWidgetItem() ;//每个节点都可以设置多个列item1->setText(0 ,"猫");ui->treeWidget->addTopLevelItem(item1);QTreeWidgetItem * item2  = new QTreeWidgetItem() ;//每个节点都可以设置多个列item2->setText(0 ,"狗");ui->treeWidget->addTopLevelItem(item2);QTreeWidgetItem * item3  = new QTreeWidgetItem() ;//每个节点都可以设置多个列item3->setText(0 ,"鸟");ui->treeWidget->addTopLevelItem(item3);//添加子节点QTreeWidgetItem * item4  = new QTreeWidgetItem() ;item4->setText(0,"中华田园猫");item1->addChild(item4) ;QTreeWidgetItem * item5  = new QTreeWidgetItem() ;item5->setText(0,"猫2");item1->addChild(item5) ;QTreeWidgetItem * item6  = new QTreeWidgetItem() ;item6->setText(0,"猫3");item1->addChild(item6) ;}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_insertTopItem_clicked()   //插入顶层节点
{//获取输入框的内容const QString & text = ui->lineEdit->text() ;//构造一个QTreeWidgetItemQTreeWidgetItem * item  = new QTreeWidgetItem () ;item->setText(0,text);//  添加到顶层节点中ui->treeWidget->addTopLevelItem(item) ;
}void Widget::on_pushButton_insertItem_clicked()  //插入到选中节点的子节点中
{//获取当前选中的节点QTreeWidgetItem * currentItem  = ui->treeWidget->currentItem();if(currentItem ==nullptr){return ;}//获取输入框的内容const QString & text = ui->lineEdit->text() ;//构造一个QTreeWidgetItemQTreeWidgetItem * item  = new QTreeWidgetItem () ;item->setText(0,text);//  插入到选中节点的子节点中currentItem->addChild(item) ;
}void Widget::on_pushButton_deleteItem_clicked()
{//获取选中的元素QTreeWidgetItem * currentItem   = ui->treeWidget->currentItem();if(currentItem ==nullptr){return ;}//删除选中的元素,首先需要获取其父元素, 通过父元素进行删除QTreeWidgetItem * parent =     currentItem->parent();//顶层元素if(parent ==nullptr){int index = ui->treeWidget->indexOfTopLevelItem(currentItem) ;ui->treeWidget->takeTopLevelItem(index);}//普通元素else{parent->removeChild(currentItem);}}

QGroupBox

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->comboBox->addItem("麦辣鸡腿堡");ui->comboBox->addItem("巨无霸");ui->comboBox->addItem("培根蔬萃双层牛堡");ui->comboBox_2->addItem("中薯条");ui->comboBox_2->addItem("麦乐鸡块");ui->comboBox_2->addItem("麦辣鸡翅");ui->comboBox_3->addItem("可乐");ui->comboBox_3->addItem("雪碧");ui->comboBox_3->addItem("咖啡");
}Widget::~Widget()
{delete ui;
}

Tab Widget

创建一个程序,带有一个TableWidget 作为标签页.
提供两个按钮,分别创建新的标签页,关闭当前选中的标签页.当切换标签页的时候,也能感知到变化.

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_pushButton_clicked();void on_pushButton_2_clicked();void on_tabWidget_currentChanged(int index);private:Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QLabel>
#include<QDebug>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//在每个标签页中添加一个labelQLabel * label = new QLabel(ui->tab) ;label->setText("标签页1");label->resize(100,50) ;QLabel * label2 = new QLabel(ui->tab_2) ;label2->setText("标签页2");label2->resize(100,50) ;
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_clicked()  //增加标签页
{//addTab参数//参数1:指定一个QWidget//参数2:指定这个标签页的名字QWidget * w = new QWidget() ;int count = ui->tabWidget->count();ui->tabWidget->addTab(w ,QString("Tab") + QString::number(count+1)) ; //count是标签页的下标//添加QLabel * label   = new QLabel(w) ;label->setText(QString("标签页") +QString::number(count+1));label->resize(100,50) ;//设置新标签页被选中ui->tabWidget->setCurrentIndex(count) ;
}void Widget::on_pushButton_2_clicked()  //删除标签页
{//获取选中的标签页的下标int index = ui->tabWidget->currentIndex() ;//删除ui->tabWidget->removeTab(index) ;
}{
qDebug() <<index;
}void Widget::on_tabWidget_currentChanged(int index)

# QVBoxLayout

Qt中提供了很多种布局管理器

  1. 垂直布局
  2. 水平布局
  3. 网格布局
  4. 表单布局

每个widget中只能设置一个布局管理器.

例如:垂直布局

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QPushButton>
#include<QVBoxLayout>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//创建三个按钮,使用垂直布局管理器管理QPushButton*button1 = new QPushButton("button1");QPushButton*button2 = new QPushButton("button2");QPushButton*button3 = new QPushButton("button3");//创建布局管理器QVBoxLayout * layout = new QVBoxLayout() ;layout->addWidget(button1);layout->addWidget(button2);layout->addWidget(button3);//将布局管理器添加到窗口中this->setLayout(layout);
}Widget::~Widget()
{delete ui;
}

如果在代码中创建layout,其实是只创建了一个layout.
如果在QtDesigner中创建的 layout,先创建了一个Widget,然后再在这个新的 Widget中添加了一个layout.

# QHBoxLayout

嵌套管理器

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QPushButton>
#include<QHBoxLayout>
#include<QVBoxLayout>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 创建2个按钮,使用垂直布局管理器管理QVBoxLayout * vlayout = new QVBoxLayout ( ) ;QPushButton*button1 = new QPushButton("button1");QPushButton*button2 = new QPushButton("button2");vlayout->addWidget(button1) ;vlayout->addWidget(button2) ;// 创建2个按钮,使用水平布局管理器管理QVBoxLayout * hlayout = new QVBoxLayout ( ) ;QPushButton*button3= new QPushButton("button3");QPushButton*button4 = new QPushButton("button4");hlayout->addWidget(button3) ;hlayout->addWidget(button4) ;// 把水平布局管理器添加到垂直布局管理器内部vlayout->addLayout(hlayout);//将垂直布局管理器添加到窗口中this->setLayout(vlayout);}Widget::~Widget()
{delete ui;
}

QGridLayout

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QPushButton>
#include<QGridLayout>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//创建4个按钮QPushButton*button1 = new QPushButton("button1");QPushButton*button2 = new QPushButton("button2");QPushButton*button3 = new QPushButton("button3");QPushButton*button4 = new QPushButton("button4");//创建网格布局管理器QGridLayout*layout = new QGridLayout();layout->addWidget(button1);layout->addWidget(button2);layout->addWidget(button3);layout->addWidget(button4);//                            layout->addWidget(button1, 0, 0);
//                            layout->addWidget(button2, 0, 1);
//                            layout->addWidget(button3, 1, 0);
//                            layout->addWidget(button4, 1, 1);// 这个写法就相当于水平布局了// 此时大家的行数只要是一样的即可,不一定非得是0
//                            layout->addWidget(button1, 0, 0);
//                            layout->addWidget(button2, 0, 1);
//                            layout->addWidget(button3, 0, 2);
//                            layout->addWidget(button4, 0, 3);// 这个写法就相当于垂直布局了layout->addWidget(button1, 0, 0);layout->addWidget(button2, 1, 0);layout->addWidget(button3, 2, 0);layout->addWidget(button4, 3, 0);// 这种写法是每个按钮独占一行和一列// 即使设置成 100, 100, 也不会在中间搞出很大的空白空间。// 此处设置的行数和列数,只是用来决定控件之间的相对位置。
//                            layout->addWidget(button1, 0, 0);
//                            layout->addWidget(button2, 1, 1);
//                            layout->addWidget(button3, 2, 2);
//                            layout->addWidget(button4, 100, 100);//将布局管理器添加到窗口中this->setLayout(layout);
}Widget::~Widget()
{delete ui;
}

例2:

设置水平拉伸系数

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QPushButton>
#include<QGridLayout>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 创建 6 个按钮,使用网格布局按照 2 * 3 的方式来排列QPushButton* button1 = new QPushButton("按钮1");QPushButton* button2 = new QPushButton("按钮2");QPushButton* button3 = new QPushButton("按钮3");QPushButton* button4 = new QPushButton("按钮4");QPushButton* button5 = new QPushButton("按钮5");QPushButton* button6 = new QPushButton("按钮6");// 创建网格布局管理器,把这些控件添加进去QGridLayout* layout = new QGridLayout();layout->addWidget(button1, 0, 0);layout->addWidget(button2, 0, 1);layout->addWidget(button3, 0, 2);layout->addWidget(button4, 1, 0);layout->addWidget(button5, 1, 1);layout->addWidget(button6, 1, 2);//将布局管理器添加到窗口中this->setLayout(layout);// 设置水平拉伸系数layout->setColumnStretch(0, 1);layout->setColumnStretch(1, 1);layout->setColumnStretch(2, 2);
}Widget::~Widget()
{delete ui;
}

QFormLayout

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QPushButton>
#include<QGridLayout>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 设置成 3 行 2 列。
QFormLayout* layout = new QFormLayout();
this->setLayout(layout);// 创建 3 个 label 作为第一列
QLabel* label1 = new QLabel("姓名");
QLabel* label2 = new QLabel("年龄");
QLabel* label3 = new QLabel("电话");// 创建 3 个 输入框 作为第二列
QLineEdit* edit1 = new QLineEdit();
QLineEdit* edit2 = new QLineEdit();
QLineEdit* edit3 = new QLineEdit();// 把上述控件添加到表单布局中
layout->addRow(label1, edit1);
layout->addRow(label2, edit2);
layout->addRow(label3, edit3);// 创建一个 "提交按钮"
QPushButton* button = new QPushButton("提交");
layout->addRow(nullptr, button);}Widget::~Widget()
{delete ui;
}

http://www.ppmy.cn/ops/156487.html

相关文章

leetcode——爬楼梯(java)

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到楼顶。 1. 1 阶 1 阶 2. 2 阶 示例 2&#x…

第三章:黑石谜影,能源帝国的起点

夜幕降临&#xff0c;山林间的寒意愈发浓重。微风吹拂&#xff0c;树梢摇曳&#xff0c;发出沙沙作响的声音&#xff0c;宛如无形的低语&#xff0c;回荡在群山之间。夜空幽深&#xff0c;星光被茂密的枝叶遮挡&#xff0c;森林里笼罩着一层神秘的阴影。 李武踩着厚厚的落叶&am…

OpenCV4.8 开发实战系列专栏之 30 - OpenCV中的自定义滤波器

欢迎大家学习OpenCV4.8 开发实战专栏&#xff0c;长期更新&#xff0c;不断分享源码。 专栏代码全部基于C 与Python双语演示。 送相关学习资料, V&#xff1a; OpenCVXueTang_Asst 本文关键知识点&#xff1a;OpenCV中的自定义滤波器 图像卷积最主要功能有图像模糊、锐化、梯…

ubuntu linux 内核锁定

Ubuntu的内核锁定操作&#xff1a; 查看已有内核&#xff1a; sudo dpkg --get-selections | grep linux-查看信息如下&#xff1a; 锁定对应版本内容&#xff1a; sudo apt-mark hold linux-image-<version> sudo apt-mark hold linux-headers-<version> sudo …

MySQL:表的设计原则和聚合函数

所属专栏&#xff1a;MySQL学习 ??1. 表的设计原则 1. 从需求中找到类&#xff0c;类对应到数据库中的实体&#xff0c;实体在数据库中表现为一张一张的表&#xff0c;类中的属性对应着表中的字段 2. 确定类与类的对应关系 3. 使用SQL去创建具体的表 范式&#xff1a;范式描述…

如何本地部署DeepSeek

第一步&#xff1a;安装ollama https://ollama.com/download 打开官网&#xff0c;选择对应版本 第二步&#xff1a;选择合适的模型 https://ollama.com/ 模型名称中的 1.5B、7B、8B 等数字代表模型的参数量&#xff08;Parameters&#xff09;&#xff0c;其中 B 是英文 B…

LabVIEW如何高频采集温度数据?

在LabVIEW中进行高频温度数据采集时&#xff0c;选择合适的传感器&#xff08;如热电偶或热电阻&#xff09;和采集硬件是关键。下面是一些建议&#xff0c;帮助实现高效的温度数据采集&#xff1a; 1. 传感器选择&#xff1a; 热电偶&#xff08;Thermocouple&#xff09;&am…

vim-plug的自动安装与基本使用介绍

vim-plug介绍 Vim-plug 是一个轻量级的 Vim 插件管理器&#xff0c;它允许你轻松地管理 Vim 插件的安装、更新和卸载。相较于其他插件管理器&#xff0c;vim-plug 的优点是简单易用&#xff0c;速度较快&#xff0c;而且支持懒加载插件&#xff08;即按需加载&#xff09; 自动…