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

devtools/2025/2/6 20:48:16/

输入类控件

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/devtools/156614.html

相关文章

SQL高级技巧:高效获取两表交集数据的三种方法(JOIN、IN、EXISTS)

一、引言 在SQL开发中&#xff0c;获取两表交集数据是常见的需求&#xff0c;而实现这一目标的主要方法有三种&#xff1a;JOIN、IN 和 EXISTS。虽然它们都能完成任务&#xff0c;但语法、性能和应用场景却各有不同。 我们将通过对比分析这三种方法的区别与优缺点&#xff0c…

基于最近邻数据进行分类

人工智能例子汇总&#xff1a;AI常见的算法和例子-CSDN博客 完整代码&#xff1a; import torch import numpy as np from sklearn.neighbors import KNeighborsClassifier from sklearn.metrics import accuracy_score import matplotlib.pyplot as plt# 生成一个简单的数据…

Linux:文件系统(软硬链接)

目录 inode ext2文件系统 Block Group 超级块&#xff08;Super Block&#xff09; GDT&#xff08;Group Descriptor Table&#xff09; 块位图&#xff08;Block Bitmap&#xff09; inode位图&#xff08;Inode Bitmap&#xff09; i节点表&#xff08;inode Tabl…

第五章 Linux网络编程基础API

在网络编程中&#xff0c;“网络字节序”&#xff08;Network Byte Order&#xff09;指的是一种统一的字节排列方式&#xff0c;即大端字节序&#xff08;Big-Endian&#xff09;&#xff0c;用于在网络上传输数据。这样做的目的是确保不同主机之间&#xff08;可能采用不同的…

剑指offer 字符串 持续更新中...

文章目录 1. 替换空格1.1 题目描述1.2 从前向后替换空格1.3 从后向前替换空格 持续更新中… 1. 替换空格 替换空格 1.1 题目描述 题目描述&#xff1a;将一个字符串s中的每个空格替换成“%20”。 示例&#xff1a; 输入&#xff1a;"We Are Happy" 返回&#xf…

STM32使用VScode开发

文章目录 Makefile形式创建项目新建stm项目下载stm32cubemx新建项目IED makefile保存到本地arm gcc是编译的工具链G++配置编译Cmake +vscode +MSYS2方式bilibiliMSYS2 统一环境配置mingw32-make -> makewindows环境变量Cmake CmakeListnijia 编译输出elfCMAKE_GENERATOR查询…

入行FPGA设计工程师需要提前学习哪些内容?

FPGA作为一种灵活可编程的硬件平台&#xff0c;广泛应用于嵌入式系统、通信、数据处理等领域。很多人选择转行FPGA设计工程师&#xff0c;但对于新手来说&#xff0c;可能在学习过程中会遇到一些迷茫和困惑。为了帮助大家更好地准备&#xff0c;本文将详细介绍入行FPGA设计工程…

生成式AI安全最佳实践 - 抵御OWASP Top 10攻击 (下)

今天小李哥将开启全新的技术分享系列&#xff0c;为大家介绍生成式AI的安全解决方案设计方法和最佳实践。近年来生成式 AI 安全市场正迅速发展。据IDC预测&#xff0c;到2025年全球 AI 安全解决方案市场规模将突破200亿美元&#xff0c;年复合增长率超过30%&#xff0c;而Gartn…