输入类控件和多元素控件【QT】
文章目录
- 输入类控件
- 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_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
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_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
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_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
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_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
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_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
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_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
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_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
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_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
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_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
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_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
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_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
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 ,所以需要除以100
this->setWindowOpacity((double)value/100) ;
}
Slider
例如:
在窗口上放两个滑动条,一个是水平,垂直.滑动这两个滑动条,就能够调整窗口的大小
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
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_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
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_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
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_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
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_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
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() ;
//构造一个QTreeWidgetItem
QTreeWidgetItem * 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() ;
//构造一个QTreeWidgetItem
QTreeWidgetItem * 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_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
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_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
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);
//在每个标签页中添加一个label
QLabel * 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_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
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_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
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_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
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_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
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_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
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;
}