Widget 是 Qt 中的核⼼概念. 英⽂原义是 “⼩部件”, 我们此处也把它翻译为 “控件” 。控件是构成⼀个图形化界⾯的基本要素.
在 Qt 中, 使⽤ QWidget 类表⽰ “控件”. 像按钮, 视图, 输⼊框, 滚动条等具体的控件类, 都是继承⾃QWidget;可以说, QWidget 中就包含了 Qt 整个控件体系中, 通⽤的部分.
在 Qt Designer 中, 随便拖⼀个控件过来, 选中该控件, 即可在右下⽅看到 QWidget 中的属性
这些属性既可以通过 QtDesigner 会直接修改, 也可以通过代码的⽅式修改.
接下来我们会介绍其中⼀些⽐较重要⽐较常⽤的属性, 并附有代码⽰例
widget.cpp
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QPushButton* btn = new QPushButton(this);
btn->setText("这是个被禁⽤的按钮");
btn->setEnabled(false);
}
位置和尺⼨. 其实是四个属性的统称:
代码⽰例: 控制按钮的位置 在界⾯中拖五个按钮. 五个按钮的 objectName 分别为 pushButton_target , pushButton_up , pushButton_down , pushButton_left , pushButton_right 五个按钮的初始位置和⼤⼩都随意.
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_pushButton_up_clicked()
{
QRect Target = ui->pushButton_target->geometry();
// Target.setY(Target.y() - 5);
// ui->pushButton_target->setGeometry(Target);
ui->pushButton_target->setGeometry(Target.x(), Target.y() - 5, Target.width(), Target.height());
}
void Widget::on_pushButton_down_clicked()
{
QRect Target = ui->pushButton_target->geometry();
ui->pushButton_target->setGeometry(Target.x(), Target.y() + 5, Target.width(), Target.height());
}
void Widget::on_pushButton_left_clicked()
{
QRect Target = ui->pushButton_target->geometry();
ui->pushButton_target->setGeometry(Target.x() - 5, Target.y(), Target.width(), Target.height());
}
void Widget::on_pushButton_right_clicked()
{
QRect Target = ui->pushButton_target->geometry();
ui->pushButton_target->setGeometry(Target.x() + 5, Target.y(), Target.width(), Target.height());
}
一个demo程序:点击关闭的时候,该按钮会跑
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
srand(time(nullptr));
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_clicked()
{
ui->label->setText("已点击确认!");
}
//void Widget::on_pushButton_2_clicked()
//{
// // 获取窗口的宽度和高度
// int width = this->geometry().width();
// int height = this->geometry().height();
// qDebug() << "width: " << width;
// qDebug() << "height: " << height;
// // 重新生成按钮的位置
// int x = rand() % width;
// int y = rand() % height;
// qDebug() << "x: " << x;
// qDebug() << "y: " << y;
// // 设置新的位置
// ui->pushButton_2->move(x, y);
//}
void Widget::on_pushButton_2_pressed()
{
// 获取窗口的宽度和高度
int width = this->geometry().width();
int height = this->geometry().height();
// 重新生成按钮的位置
int x = rand() % width;
int y = rand() % height;
// 设置新的位置
ui->pushButton_2->move(x, y);
}
windowTitle :
windowIcon:
#include "widget.h"
#include "ui_widget.h"
#include <QIcon>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
this->setWindowTitle("这是一个标题");
QIcon icon(":/p.jpg");
this->setWindowIcon(icon);
}
Widget::~Widget()
{
delete ui;
}
通过 qrc 管理图片作为图标
代码⽰例: 调整窗⼝透明度 (1) 在界⾯上拖放两个按钮, 分别⽤来增加不透明度和减少不透明度
(2)编写 wdiget.cpp, 编写两个按钮的 slot 函数 • 点击 pushButton_sub 会减少不透明度, 也就是窗⼝越来越透明. • 点击 pushButton_add 会增加不透明度, 窗⼝会逐渐恢复
void Widget::on_pushButton_add_clicked()
{
float value = this->windowOpacity();
if(value >= 1.0){
return;
}
value += 0.1;
this->setWindowOpacity(value);
}
void Widget::on_pushButton_sub_clicked()
{
float value = this->windowOpacity();
if(value <= 0.0){
return;
}
value -= 0.1;
this->setWindowOpacity(value);
}
代码示例:
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 创建一个按钮
QPushButton* button = new QPushButton(this);
button->resize(100, 50);
button->move(300, 300);
button->setText("按钮");
// 设置按钮的 cursor
button->setCursor(QCursor(Qt::IBeamCursor));
}
直接在控件的右下角 font 选项中可以设置:
代码实现
#include <QLabel>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 创建一段标签
QLabel* label = new QLabel(this);
label->setText("一段标签");
label->move(300, 300);
// 创建字体对象,并设置字体属性
QFont font;
font.setFamily("黑体");
font.setPointSize(20);
font.setBold(true); // 加粗
font.setItalic(true); // 倾斜
font.setUnderline(true); // 下划线
font.setStrikeOut(true); // 删除线
// 最后设置字体对象到label上
label->setFont(font);
}
toolTip 只是给⽤⼾看的. 在代码中⼀般不需要获取到 toolTip.
在 ui 界面上拖拽两个按钮:
在代码中设置:
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
ui->pushButton_yes->setToolTip("这是一个 Yes 按钮");
ui->pushButton_yes->setToolTipDuration(3000);
ui->pushButton_no->setToolTip("这是一个 No 按钮");
ui->pushButton_no->setToolTipDuration(3000);
}
设置控件获取到焦点的策略. ⽐如某个控件能否⽤⿏标选中或者能否通过 tab 键选中.
Qt::FocusPolicy 是⼀个枚举类型. 取值如下:
通过 CSS 设置 widget 的样式.
创建一个标签,右键标签选中改变样式表:
此处的语法格式同 CSS, 使⽤键值对的⽅式设置样式. 其中键和值之间使⽤ : 分割. 键值对之间使⽤ ; 分割
代码示例,实现切换夜间模式.
在界⾯上创建⼀个多⾏输⼊框 (Text Edit) 和两个按钮. objectName 分别为 pushButton_light 和 pushButton_dark
编写按钮的 slot 函数,即槽函数:
#333 是深⾊, 但是没那么⿊.
#fff 是纯⽩⾊.
#000 是纯⿊⾊.
void Widget::on_pushButton_light_clicked()
{
this->setStyleSheet("background-color: #f3f3f3");
ui->textEdit->setStyleSheet("background-color: #fff; color: #000");
ui->pushButton_light->setStyleSheet("color: #000");
ui->pushButton_dark->setStyleSheet("color: #000");
}
void Widget::on_pushButton_dark_clicked()
{
this->setStyleSheet("background-color: #333");
ui->textEdit->setStyleSheet("background-color: #333; color: #fff");
ui->pushButton_light->setStyleSheet("color: #fff");
ui->pushButton_dark->setStyleSheet("color: #fff");
}
日间模式:
夜间模式: