文章目录
- 输入类控件
- Text Edit
- Combo Box
- Spin Box
- Dial
- Slider
- 多元素控件
- QListWidget
- TableWidet
- TreeWidget
- QGroupBox
- Tab Widget
- # QVBoxLayout
- # QHBoxLayout
- QGridLayout
- QFormLayout
输入类控件
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中提供了很多种布局管理器
- 垂直布局
- 水平布局
- 网格布局
- 表单布局
每个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;
}