目录
[1. QPushButton](#1. QPushButton)
[1.1 设置图标](#1.1 设置图标)
[1.2 设置快捷键](#1.2 设置快捷键)
[1.3 鼠标设置连点](#1.3 鼠标设置连点)
[2. RadioButton](#2. RadioButton)
[2.1 autoexclusive](#2.1 autoexclusive)
[2.2 将小料的autoexclusive给熄灭](#2.2 将小料的autoexclusive给熄灭)
[2.3 信号](#2.3 信号)
[3. Checkbox](#3. Checkbox)
[4. QLabel](#4. QLabel)
[4.1 设置图片](#4.1 设置图片)
[4.2 调整位置](#4.2 调整位置)
[4.3 调整方位](#4.3 调整方位)
[4.4 设置伙伴](#4.4 设置伙伴)
[5. LCDNumber](#5. LCDNumber)
[6. ProgressBar](#6. ProgressBar)
[7. QCalendarWidget](#7. QCalendarWidget)
[8. LineEdit](#8. LineEdit)
[9. TextEdit](#9. TextEdit)
[10. ComboBox](#10. ComboBox)
[11. SpinBox](#11. SpinBox)
[12. DateTimeEdit](#12. DateTimeEdit)
[13. QDial](#13. QDial)
[14. QSlider](#14. QSlider)
[15. 多元控件](#15. 多元控件)
[16. ListWidget](#16. ListWidget)
[17. TableWidget](#17. TableWidget)
[18. QGroupBox](#18. QGroupBox)
[19. QTabWidget](#19. QTabWidget)
[20. QBoxLayout](#20. QBoxLayout)
[21. QGridLayout](#21. QGridLayout)
1. QPushButton
1.1 设置图标
ui->pushButton->setIcon(QIcon(":/tu.png"));
ui->pushButton->setIconSize(QSize(80, 80));
在构造函数里设置icon对象
1.2 设置快捷键
快捷键的对象为QKeySequence
ui->pushButton->setShortcut(QKeySequence(" "));
也可以两个快捷键拼在一起
ui->pushButton->setShortcut(QKeySequence("ctrl+ "));
还可以使用枚举值
ui->pushButton->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_Space));
1.3 鼠标设置连点
cpp
ui->pushButton->setAutoRepeat(1);
2. RadioButton
可以选择的按钮
2.1 autoexclusive
所有按钮默认只能单选,如果要多选,就将打开的autoexclusive给关掉。
模拟点餐程序:
主菜3选1,小料可以多选
2.2 将小料的autoexclusive给熄灭
由于只支持单/多选,因此需要给按钮分组
QButtonGroup* q1 = new QButtonGroup(this);
QButtonGroup* q2 = new QButtonGroup(this);
QButtonGroup* q3 = new QButtonGroup(this);
q1->addButton(ui->radioButton);
q1->addButton(ui->radioButton_2);
q1->addButton(ui->radioButton_3);
q2->addButton(ui->radioButton_4);
q2->addButton(ui->radioButton_5);
q2->addButton(ui->radioButton_6);
q3->addButton(ui->radioButton_7);
q3->addButton(ui->radioButton_8);
q3->addButton(ui->radioButton_9);

这样就能运行了
2.3 信号
Clicked和toggled
Clicked只要点击就会发出信号
而toggled是状态变化发出信号

3. Checkbox
默认可以多选的radio button
简单的任务表
cpp
void Widget::on_pushButton_clicked()
{
QString s1 = "你今天干什么:";
if(ui->checkBox->isChecked())
{
s1 = s1 + ui->checkBox->text() + " ";
}
if(ui->checkBox_2->isChecked())
{
s1 = s1 + ui->checkBox_2->text() + " ";
}
if(ui->checkBox_3->isChecked())
{
s1 = s1 + ui->checkBox_3->text();
}
ui->label->setText(s1);
}

4. QLabel
4.1 设置图片
cpp
QRect w = this->geometry();
ui->label->setGeometry(0, 0, w.width(), w.height());
QPixmap p1(":/a.png");
ui->label->setPixmap(p1);
ui->label->setScaledContents(1);
setScaledContents:将照片拉伸铺满对应控件,这样,图片就能铺满窗口
但是,之后调节窗口大小,照片不会一起动,因为放在构造函数里
可以修改父类的resizeevent的事件,构成多态,以修改窗口大小时会自动调整大小
cpp
void Widget::resizeEvent(QResizeEvent *event)
{
ui->label->setGeometry(0, 0, event->size().width(), event->size().height());
}
4.2 调整位置
cpp
ui->label->setAlignment(Qt::AlignCenter | Qt::AlignHCenter);
设置成正中间
4.3 调整方位
-
setWordWrap:设置换行 -
setIndent:设置缩进(每行) -
setMargin:设置页边距
4.4 设置伙伴
cpp
ui->label->setBuddy(ui->radioButton);
ui->label_2->setBuddy(ui->radioButton_2);

在label写&b就代表将快捷键设置为b
5. LCDNumber
设置10秒倒计时
cpp
ui->lcdNumber->display("10");
QTimer* q1 = new QTimer(this);
connect(q1, &QTimer::timeout, this, &Widget::handle);
q1->start(1000);
QTimer为Qt的倒计时组件,设置多少ms发出信号并关联到槽函数
cpp
void Widget::handle()
{
int t = ui->lcdNumber->intValue();
if(t == 0)
{
q1->stop();
return;
}
t--;
ui->lcdNumber->display(t);
}
槽函数控制数的显示
6. ProgressBar
进度条
cpp
t1 = new QTimer(this);
t1->start(100);
connect(t1, &QTimer::timeout, this, &Widget::handle);
void Widget::handle()
{
int s = ui->progressBar->value();
if(s == 100)
{
t1->stop();
return;
}
s++;
ui->progressBar->setValue(s);
}
同样关联时间信号和槽函数
由于Qt有统一前置声明所有类的机制,因此头文件在.cpp包也可以,这是为了加快编译速度
7. QCalendarWidget
日历
cpp
void Widget::on_calendarWidget_selectionChanged()
{
QDate d1 = ui->calendarWidget->selectedDate();
ui->label->setText(d1.toString());
}
显示点击日期
QDate为日期类,d1.toString()可以转为字符串
8. LineEdit
设置信息输入

要求电话输入符合格式要求,并且信息全部填入才可以按下确认键
cpp
QRegExp q1("^1\\d{10}$");
ui->lineEdit_phone->setValidator(new QRegExpValidator(q1));
正则表达式:
-
^1:开头是1 -
\\d:整数,由于C++,因此要加转义字符 -
{10}:前面的\\d重复10次 -
$:结尾
cpp
bool Widget::check()
{
bool f1 = ui->checkBox->checkState();
bool f2 = ui->checkBox_2->checkState();
bool fl = 0;
if((f1 == 1 && f2 == 0) || (f2 == 1 && f1 == 0))
fl = 1;
const QString& s1 = ui->lineEdit_name->text();
QString s2 = ui->lineEdit_phone->text();
int pos = 0;
bool f = ui->lineEdit_phone->validator()->validate(s2, pos);
if(fl && f && s1.size())
{
ui->pushButton->setEnabled(1);
}
else
{
ui->pushButton->setEnabled(0);
}
}
void Widget::on_pushButton_clicked()
{
qDebug() << "成功输入";
}
void Widget::on_lineEdit_name_textEdited(const QString &arg1)
{
check();
}
void Widget::on_lineEdit_phone_textEdited(const QString &arg1)
{
check();
}
void Widget::on_checkBox_toggled(bool checked)
{
check();
}
void Widget::on_checkBox_2_toggled(bool checked)
{
check();
}
当任何组件变化,都调用check判断函数
密码输入相同激活按钮
cpp
ui->lineEdit->setPlaceholderText("请输入密码");
ui->lineEdit_2->setPlaceholderText("请再次输入密码");
ui->lineEdit->setClearButtonEnabled(1);
ui->lineEdit_2->setClearButtonEnabled(1);
ui->lineEdit->setEchoMode(QLineEdit::Password);
ui->lineEdit_2->setEchoMode(QLineEdit::Password);
-
setPlaceholderText:设置输入提示 -
setClearButtonEnabled:多出清空按钮 -
setEchoMode:显示为专门的密码显示模式
cpp
void Widget::checked()
{
QString s1 = ui->lineEdit->text();
QString s2 = ui->lineEdit_2->text();
if(s1.size() && s2.size() && s1 == s2)
{
ui->pushButton->setEnabled(1);
}
}
void Widget::on_lineEdit_textEdited(const QString &arg1)
{
checked();
}
void Widget::on_lineEdit_2_textEdited(const QString &arg1)
{
checked();
}
同样有变化就会检查
9. TextEdit
可以用html/markdown格式
信号:
-
textChanged:文本变化 -
selectionChanged:选择变化 -
cursorPositionChanged:光标位置变化 -
undoAvailable:撤销 -
redoAvailable:重做
10. ComboBox
下拉选框
cpp
ui->comboBox->addItem("1");
右键编辑项目添加选项
从文件读取选项:
cpp
std::fstream f("D:\\cdoee\\code\\QT\\4widget2\\test.txt");
std::string s;
while(getline(f, s))
{
ui->comboBox->addItem(QString(QString::fromStdString(s)));
}
fromStdString函数可以将string转为QString
11. SpinBox
调整数量的输入框
cpp
ui->spinBox->setRange(1, 5);
ui->spinBox->setValue(1);
设置范围,默认值

可以有范围选择
12. DateTimeEdit
显示时间的按钮
日期计算器
cpp
QDateTime t2 = ui->dateTimeEdit->dateTime();
QDateTime t1 = ui->dateTimeEdit_2->dateTime();
int d = t1.daysTo(t2);
int s = t1.secsTo(t2);
s = s / 3600 % 24;
ui->label->setText(QString("间隔") + QString(QString::number(d)) +
QString("天") + QString(QString::number(s)) + QString("小时"));

按下按钮计算时间间隔
-
daysTo:计算天数 -
secsTo:计算秒数
13. QDial
旋钮
-
NotchVisible:显示刻度 -
Wrapping:是否允许转到中间
设置透明度
cpp
void Widget::on_dial_valueChanged(int value)
{
this->setWindowOpacity((double)value / 100);
}
由于透明度是0~1的小数,因此/100
14. QSlider
-
setMinimum:最小值 -
setMaximum:最大值 -
setValue:设置值 -
setSingleStep:一次调节多少
两个滑块调节窗口
cpp
void Widget::on_horizontalSlider_valueChanged(int value)
{
const QRect& q = this->geometry();
this->setGeometry(q.x(), q.y(), value, q.height());
}
void Widget::on_verticalSlider_valueChanged(int value)
{
const QRect& q = this->geometry();
this->setGeometry(q.x(), q.y(), q.width(), value);
}
设快捷键
cpp
ui->setupUi(this);
QShortcut* add = new QShortcut(this);
add->setKey(QKeySequence("+"));
QShortcut* sub = new QShortcut(this);
sub->setKey(QKeySequence("-"));
connect(add, &QShortcut::activated, this, &Widget::addfunc1);
connect(sub, &QShortcut::activated, this, &Widget::addfunc2);
快捷键类指定信号函数、编写槽函数调整对应值
cpp
void Widget::addfunc1()
{
int a = ui->verticalSlider->value();
ui->verticalSlider->setValue(a + 50);
}
void Widget::addfunc2()
{
int a = ui->verticalSlider->value();
ui->verticalSlider->setValue(a - 50);
}
15. 多元控件
-
......View:更底层 -
......Widget:为......View的封装 -
......View为MVC结构的实现
M:数据 C:控制器 V:视图
......View需要自己实现M,C部分
16. ListWidget
类似于备忘录
-
addItem:添加元素 -
currentRow:获取停留的行 -
takeItem:删除
cpp
void Widget::on_pushButton_clicked()
{
QString s = ui->lineEdit->text();
ui->listWidget->addItem(s);
}
void Widget::on_pushButton_2_clicked()
{
int r = ui->listWidget->currentRow();
ui->listWidget->takeItem(r);
}
添加,删除备忘录
17. TableWidget
简易表格
-
rowCount,columnCount:获取行列数据 -
insertRow,insertColumn:插入行列 -
setHorizontalHeaderItem:设置表头
void Widget::on_pushButton_clicked() // 新增行
{
int cow = ui->tableWidget->rowCount();
ui->tableWidget->insertRow(cow);
}
void Widget::on_pushButton_2_clicked() // 新增列
{
int col = ui->tableWidget->columnCount();
ui->tableWidget->insertColumn(col);
const QString& str = ui->lineEdit->text();
ui->tableWidget->setHorizontalHeaderItem(col, new QTableWidgetItem(str));
}
void Widget::on_pushButton_3_clicked() // 删除行
{
int row = ui->tableWidget->currentRow();
ui->tableWidget->removeRow(row);
}
void Widget::on_pushButton_4_clicked() // 删除列
{
int col = ui->tableWidget->currentColumn();
ui->tableWidget->removeColumn(col);
}
18. QGroupBox
将控件放成一组,简洁化界面,更好管理
19. QTabWidget
容器类控件
标签页
void Widget::on_pushButton_clicked()
{
int count = ui->tabWidget->count();
QWidget* w = new QWidget();
ui->tabWidget->addTab(w, QString("tab") + QString::number(count + 1));
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);
}
增删标签页
setCurrentIndex(count):设置光标选择的页
20. QBoxLayout
代码放置组件
QPushButton* b = new QPushButton(this);
QVBoxLayout* lay = new QVBoxLayout();
lay->addWidget(b);
放置按钮
和QHBoxLayout组合
QVBoxLayout* lay = new QVBoxLayout();
this->setLayout(lay);
QPushButton* b1 = new QPushButton(this);
QPushButton* b2 = new QPushButton(this);
QPushButton* b3 = new QPushButton(this);
QPushButton* b4 = new QPushButton(this);
lay->addWidget(b1);
lay->addWidget(b2);
QHBoxLayout* lay2 = new QHBoxLayout();
lay2->addWidget(b3);
lay2->addWidget(b4);
lay->addLayout(lay2);

将水平和垂直放置组合形成图案
21. QGridLayout
网格摆放
lay->addWidget(q1, 0, 0);
lay->addWidget(q2, 0, 1);
lay->addWidget(q3, 0, 2);
lay->addWidget(q4, 1, 0);
lay->addWidget(q5, 1, 1);
lay->addWidget(q6, 1, 2);
伸缩尺寸
cpp
lay->setColumnStretch(0, 0);
lay->setColumnStretch(1, 1);
lay->setColumnStretch(2, 2);
第一个数字指定列
第二个数字:0表示不伸缩,1,2表示比例
行伸缩
由于按钮默认列不伸缩
修改:
cpp
q1->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
q2->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
q3->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
列伸缩:
cpp
lay->setRowStretch(0, 1);