1.控件概述
2.QWidget核心属性
属性 | 作⽤ |
---|---|
enabled | 设置控件是否可使⽤. true 表⽰可⽤, false 表⽰禁⽤. |
geometry | 位置和尺⼨.包含 x, y, width, height 四个部分.其中坐标是以⽗元素为参考进⾏设置的. |
windowTitle | 设置 widget 标题 |
windowIcon | 设置 widget 图标 |
windowOpacity | 设置 widget 透明度 |
cursor | ⿏标悬停时显⽰的图标形状.是普通箭头, 还是沙漏, 还是⼗字等形状.在 Qt Designer 界⾯中可以清楚看到可选项. |
font | 字体相关属性.涉及到字体家族, 字体⼤⼩, 粗体, 斜体, 下划线等等样式. |
toolTip | ⿏标悬停在 widget 上会在状态栏中显⽰的提⽰信息. |
toolTipDuring | toolTip 显⽰的持续时间. |
statusTip | Widget 状态发⽣改变时显⽰的提⽰信息(⽐如按钮被按下等). |
whatsThis | ⿏标悬停并按下 alt+F1 时,显⽰的帮助信息(显⽰在⼀个弹出的窗中). |
styleSheet | 允许使⽤ CSS 来设置 widget 中的样式.Qt 中⽀持的样式⾮常丰富,对于前端开发⼈员上⼿是⾮常友好的. |
focusPolicy | 该 widget 如何获取到焦点. • Qt::NoFocus:控件不参与焦点管理,即⽆法通过键盘或⿏标获取焦点 • Qt::TabFocus:控件可以通过Tab键获得焦点 • Qt::ClickFocus:控件可以通过⿏标点击获得焦点 • Qt::StrongFocus:控件可以通过键盘和⿏标获得焦点 • Qt::WheelFocus:控件可以通过⿏标滚轮获得焦点(在某些平台或样式中可能不可⽤) |
contextMenuPolicy | 上下⽂菜单的显⽰策略. • Qt::DefaultContextMenu:默认的上下⽂菜单策略,⽤⼾可以通过⿏标右键或键盘,快捷键触发上下⽂菜单 • Qt::NoContextMenu:禁⽤上下⽂菜单,即使⽤⼾点击⿏标右键也不会显⽰菜单 • Qt::PreventContextMenu:防⽌控件显⽰上下⽂菜单,即使⽤⼾点击⿏标右键也不会显⽰菜单 • Qt::ActionsContextMenu:将上下⽂菜单替换为控件的“动作”菜单,⽤⼾可以通过⿏标右键或键盘快捷键触发这个菜单 • Qt::CustomContextMenu:使⽤⾃定义的上下⽂菜单,⽤⼾可以通过⿏标右键或键盘快捷键触发这个菜单 |
locale | 设置语⾔和国家地区. |
acceptDrops | 该部件是否接受拖放操作。如果设置为true,那么该部件就可以接收来⾃其他部件的拖放操作。当⼀个部件被拖放到该部件上时,该部件会接收到相应的拖放事件(如dropEvent)。如果设置为false,那么该部件将不会接收任何拖放操作。 |
minimumSize | 控件的最⼩尺⼨. 包含最⼩宽度和最⼩⾼度. |
maximumSize | 控件的最⼤尺⼨.包含最⼤宽度和最⼤⾼度. |
sizePolicy | 尺⼨策略.设置控件在布局管理器中的缩放⽅式. |
windowModality | 指定窗⼝是否具有 “模态” ⾏为. |
sizeIncrement | 拖动窗⼝⼤⼩时的增量单位. |
baseSize | 窗⼝的基础⼤⼩,⽤来搭配 sizeIncrement 调整组件尺⼨是计算组件应该调整到的合适的值. |
palette | 调⾊板. 可以设置 widget 的颜⾊⻛格. |
mouseTracking | 是否要跟踪⿏标移动事件. 如果设为 true, 表⽰需要跟踪, 则⿏标划过的时候该 widget 就能持续收到⿏标移动事件. 如果设为 false, 表⽰不需要跟踪, 则⿏标划过的时候 widget 不会收到⿏标移动事件, 只能收到⿏标按下或者释放的事件. |
tabletTracking | 是否跟踪触摸屏的移动事件. 类似于 mouseTracking. Qt 5.9 中引⼊的新属性. |
layoutDirection | 布局⽅向. • Qt::LeftToRight:⽂本从左到右排列,也是默认值。 • Qt::RightToLeft:⽂本从右到左排列。 • Qt::GlobalAtomics:部件的布局⽅向由全局原⼦性决定(PS这个翻译其实有点尴尬. 其实就是根据应⽤程序中的其他 widget 布局⽅向确定的). |
autoFillBackground | 是否⾃动填充背景颜⾊. |
windowFilePath | 能够把 widget 和⼀个本地⽂件路径关联起来. PS: 其实作⽤不⼤. |
accessibleName | 设置 widget 的可访问名称. 这个名称可以被辅助技术 (像屏幕阅读器) 获取到. 这个属性⽤于实现⽆障碍程序的场景中(也就是给盲⼈写的程序). PS: 其实盲⼈也是可以使⽤电脑和⼿机的. 甚⾄盲⼈还能成为程序猿. 参⻅https://www.bilibili.com/video/BV1954y1d7z9 |
accessibleDescription | 设置 widget 的详细描述. 作⽤同 accessibleName |
inputMethodHints | 针对输⼊框有效, ⽤来提⽰⽤⼾当前能输⼊的合法数据的格式. ⽐如只能输⼊数字, 只能输⼊⽇期等. |
2.1 enabled
API | 说明 |
---|---|
isEnabled() | 获取到控件的可⽤状态. |
setEnabled | 设置控件是否可使⽤. true 表⽰可⽤, false 表⽰禁⽤. |
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QPushButton* btn = new QPushButton(this);
btn->setText("这是个被禁⽤的按钮");
btn->setEnabled(false);
}
2.2 geometry
API | 说明 |
---|---|
geometry() | 获取到控件的位置和尺⼨.返回结果是⼀个 QRect, 包含了 x, y, width, height.其中 x, y 是左上⻆的坐标. |
setGeometry(QRect) setGeometry(int x, int y,int width, int height) | 设置控件的位置和尺⼨. 可以直接设置⼀个 QRect, 也可以分四个属性单独设置 |
void Widget::on_pushButton_up_clicked()
{
QRect rect = ui->pushButton_target->geometry();
rect.setY(rect.y() - 5);
ui->pushButton_target->setGeometry(rect);
}
void Widget::on_pushButton_down_clicked()
{
QRect rect = ui->pushButton_target->geometry();
rect.setY(rect.y() + 5);
ui->pushButton_target->setGeometry(rect);
}
void Widget::on_pushButton_left_clicked()
{
QRect rect = ui->pushButton_target->geometry();
rect.setX(rect.x() - 5);
ui->pushButton_target->setGeometry(rect);
}
void Widget::on_pushButton_right_clicked()
{
QRect rect = ui->pushButton_target->geometry();
rect.setX(rect.x() + 5);
ui->pushButton_target->setGeometry(rect);
}
void Widget::on_pushButton_up_clicked()
{
QRect rect = ui->pushButton_target->geometry();
ui->pushButton_target->setGeometry(rect.x(), rect.y() - 5, rect.width(),
rect.height();
}
void Widget::on_pushButton_down_clicked()
{
QRect rect = ui->pushButton_target->geometry();
ui->pushButton_target->setGeometry(rect.x(), rect.y() + 5, rect.width(),
rect.height();
}
void Widget::on_pushButton_left_clicked()
{
QRect rect = ui->pushButton_target->geometry();
ui->pushButton_target->setGeometry(rect.x() - 5, rect.y(), rect.width(),
rect.height();
}
void Widget::on_pushButton_right_clicked()
{
QRect rect = ui->pushButton_target->geometry();
ui->pushButton_target->setGeometry(rect.x() + 5, rect.y(), rect.width(),
rect.height();
}
- 往界⾯上拖拽两个按钮和⼀个 Label.
Label 的 objectName 为 pushButton_accept 和 pushButton_reject , label 的
objectName 为 label
控件中⽂本如下图所⽰
- 在 widget.cpp 中添加 slot 函数
void Widget::on_pushButton_accept_clicked()
{
ui->label->setText("⼥神快来嘴⼀个! mua~~");
}
void Widget::on_pushButton_reject_pressed()
{
// 获取窗⼝的宽度和⾼度
int width = this->geometry().width();
int height = this->geometry().height();
// 重新⽣成按钮的位置.
int x = rand() % width;
int y = rand() % height;
// 设置新的位置
ui->pushButton_reject->move(x, y);
}
3.WindowsFrame的影响
相关 API
API | 说明 |
---|---|
x() | 获取横坐标 计算时包含 window frame |
y() | 获取纵坐标 计算时包含 window frame |
pos() | 返回 QPoint 对象,里面包含 x(),y(),setX(),setY()等方法计算时包含 window frame |
frameSize() | 返回 QSize 对象,里面包含 width(),height(),setWidth(),setHeight()等方法计算时包含 window frame |
frameGeometry() | 返回 ORect 对象.QRect 相当于 QPoint 和 QSize 的结合体,可以获取x,y,width, size.计算时包含 window frame 对象 |
width() | 获取宽度 计算时不包含 window frame |
height() | 获取高度 计算时不包含 window frame |
size() | 返回 QSize 对象,里面包含 width(),height(),setWidth(),setHeight()等方法计算时不包含 window frame |
rect() | 返回 QRect 对象.QRect 相当于 QPoint和 QSize 的结合体, 可以获取并设置 x,y, width, size. 计算时不包含 window frame 对象, |
geometry() | 返回 QRect 对象. QRect 相当于 QPoint和 QSize 的结合体.可以获取 x,y,width, size. 计算时不包含 window frame 对象, |
setGeometry() | 直接设置窗口的位置和尺寸.可以设置 x,y,width,height,或者 QRect 对象计算时不包含 window frame 对象. |
- 在界⾯上放置⼀个按钮.
- 在按钮的 slot 函数中, 编写代码
void Widget::on_pushButton_clicked()
{
QRect rect1 = this->geometry();
QRect rect2 = this->frameGeometry();
qDebug() << rect1;
qDebug() << rect2;
}
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QRect rect1 = this->geometry();
QRect rect2 = this->frameGeometry();
qDebug() << rect1;
qDebug() << rect2;
}
4. Window Title
API | 说明 |
---|---|
windowTitle() | 获取到控件的窗口标题 |
setWindowTitle(constQString& title) | 设置控件的窗口标题 |
5.Windowlcon属性
API | 说明 |
---|---|
windowlcon() | 获取到控件的窗口图标.返回 Olcon 对象 |
setWindowlcon(constQlcon& icon) |
#include <QIcon>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 创建图标对象
QIcon icon("d:/rose.jpg");
// 设置图标
this->setWindowIcon(icon);
}
6.qrc文件资源管理器
- 右键项⽬, 创建⼀个 Qt Resource File (qrc ⽂件), ⽂件名随意起(不要带中⽂), 此处叫 resource.qrc .
- 在 qrc 编辑器中, 添加前缀
此处我们前缀设置成 / 即可.
所谓的前缀,可以理解成 “⽬录” . 这个前缀决定了后续我们如何在代码中访问资源. - 在资源编辑器中, 点击 add Files 添加资源⽂件.此处我们需要添加的是 rose.jpg
- 在代码中使用 rose.jpg
编辑 widget.cpp
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 访问到 rose.jpg 资源
QIcon icon(":/rose.jpg");
// 设置图标
this->setWindowIcon(icon);
}
7.windowOpacity属性
API | 说明 |
---|---|
windowOpacity() | 获取到控件的不透明数值,返回 float,取值为 0.0->1.0 其中 0.0 表示全透明,1.0 表示完全不透明. |
setWindowOpacity(float n) | 设置控件的不透明数值 |
- 在界面上拖放两个按钮,分别用来增加不透明度和减少不透明度objectName分别为 pushButton add 和 pushButton sub
- 编写 wdiget.cpp,编写两个按钮的 slot 函数
点击 pushButton_sub 会减少不透明度,也就是窗口越来越透明。
点击 pushButton_add 会增加不透明度,窗口会逐渐恢复
void Widget::on_pushButton_add_clicked()
{
float opacity = this->windowOpacity();
if (opacity >= 1.0) {
return;
}
qDebug() << opacity;
opacity += 0.1;
this->setWindowOpacity(opacity);
}
void Widget::on_pushButton_sub_clicked()
{
float opacity = this->windowOpacity();
if (opacity <= 0.0) {
return;
}
qDebug() << opacity;
opacity -= 0.1;
this->setWindowOpacity(opacity);
}
EEE 754 标准
规定了浮点数要使用 二进制 科学计数法 的方式来表示~~
把一个浮点数分成三个部分:
1)符号位
2)有效数字
3)指数部分
使用二进制表示的有效数字,而且这里是小于 0 的小数部分(默认整数部分是 1)
第一个有效数字位表示 0.5
第二个有效数字位表示 0.25
第三个表示 0.125
101 => 0.625门优化的)
0.1 这样的小数
由于 float 和 double 有效数字部分长度都是有限的导致无法凑出一个非常非常接近 0.1 这样的数字
8.cursor属性
API | 说明 |
---|---|
cursor() | 获取到当前 widget 的 cursor属性,返回 OCursor 对象当鼠标悬停在该 widget 上时,就会显示出对应的形状 |
setCursor(const QCursor& cursor) | 设置该 widget 光标的形状,仅在鼠标停留在该 widget 上时生效 |
OGuiApplication::setOverrideCursor(const OCursor& cursor) | 设置全局光标的形状.对整个程序中的所有 widget 都会生效.覆盖上面的 setCursor 设置的内容. |
- 在界⾯中创建⼀个按钮.
- 直接在右侧属性编辑区修改 cursor 属性为 “等待”
- 运行程序,鼠标悬停到按钮上,即可看到光标的变化
- 编写 widget.cpp
其中 Qt::WaitCursor就是自带的沙漏形状的光标
#include <QPushButton>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
// 创建按钮
QPushButton* button = new QPushButton(this);
button->resize(100, 50);
button->move(100, 100);
button->setText("这是⼀个按钮");
// 设置按钮的 cursor
button->setCursor(QCursor(Qt::WaitCursor));
}
enum CursorShape {
ArrowCursor,
UpArrowCursor,
CrossCursor,
WaitCursor,
IBeamCursor,
SizeVerCursor,
SizeHorCursor,
SizeBDiagCursor,
SizeFDiagCursor,
SizeAllCursor,
BlankCursor,
SplitVCursor,
SplitHCursor,
PointingHandCursor,
ForbiddenCursor,
WhatsThisCursor,
BusyCursor,
OpenHandCursor,
ClosedHandCursor,
DragCopyCursor,
DragMoveCursor,
DragLinkCursor,
LastCursor = DragLinkCursor,
BitmapCursor = 24,
CustomCursor = 25
}
Qt ⾃带的光标形状有限. 我们也可以⾃⼰找个图⽚, 做成⿏标的光标.⽐如我们有请滑稽⽼铁.
- 创建 qrc 资源⽂件, 添加前缀 / , 并加⼊ huaji.png
- 编写 widget.cpp
#include <QPixmap>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
// 创建⼀个位图对象, 加载⾃定义光标图⽚
QPixmap pixmap(":/huaji.png");
// 缩放图⽚为 64 * 64 的尺⼨.
pixmap = pixmap.scaled(64, 64);
// 创建 QCursor 对象, 并指定 "热点" 为 (2, 2) 坐标位置.
// 所谓 "热点" 就是⿏标点击时⽣效的位置.
QCursor cursor(pixmap, 2, 2);
// 设置光标
this->setCursor(cursor);
}
9.font属性
API | 说明 |
---|---|
font() | 获取当前 widget 的字体信息,返回 QFont 对象, |
setFont(const QFont& font) | 设置当前 widget 的字体信息. |
属性 | 说明 |
---|---|
family | 字体家族.比如"楷体”"宋体”"微软雅黑"等 |
pointSize | 字体大小 |
weight | 字体粗细,以数值方式表示粗细程度取值范围为[0,99],数值越大,越智 |
bold | 是否加粗.设置为 true,相当于 weight为 75.设置为 false 相当于weight 为50. |
italic | 是否倾斜 |
underline | 是否带有下划线 |
strikeOut | 是否带有删除线 |
- 在界⾯上创建⼀个 label
- 在右侧的属性编辑区,设置该 label的 font 相关属性
在这里调整上述属性,可以实时的看到文字的变化
- 执⾏程序, 观察效果
- 在界⾯中创建 label, objectName 使⽤默认的 label 即可.
- 修改 widget.cpp
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 设置 label 的⽂本内容
ui->label->setText("这是⼀段⽂本");
// 创建字体对象
QFont font;
// 设置字体家族
font.setFamily("仿宋");
// 设置字体⼤⼩
font.setPointSize(20);
// 设置字体加粗
font.setBold(true);
// 设置字体倾斜
font.setItalic(true);
// 设置字体下划线
font.setUnderline(true);
// 设置字体删除线
font.setStrikeOut(true);
// 设置字体对象到 label 上
ui->label->setFont(font);
}
10.toolTip属性
API | 说明 |
---|---|
setToolTip | 设置 toolTip. 鼠标悬停在该 widget 上时会有提示说明 |
setToolTipDuring | 设置 toolTip 提示的时间.单位 ms. 时间到后 toolTip 自动消失. |
- 在界⾯上拖放两个按钮. objectName 设置为 pushButton_yes 和 pushButton_no
- 编写 widget.cpp
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(10000);
}
11.focusPolicy属性
API | 说明 |
---|---|
focusPolicy() | 获取该 widget 的 focusPolicy,返回 Qt::FocusPolicy |
setFocusPolicy(Qt::FocusPolicy policy) | 设置 widget 的 focusPolicy. |
- 在界⾯上创建四个单⾏输⼊框 (Line Edit)
- 修改四个输⼊框的 focusPolicy 属性为 Qt::StrongFocus (默认取值, ⼀般不⽤额外修改)
此时运⾏程序, 可以看到, 使⽤⿏标单击/tab, 就可以移动光标所在输⼊框. 从⽽接下来的输⼊就是针对这个获取焦点的输⼊框展开的了. - 修改第⼆个输⼊框的 focusPolicy 为 Qt::NoFocus ,则第⼆个输⼊框不会被 tab / ⿏标左键选中.
此时这个输⼊框也就⽆法输⼊内容了 - 修改第⼆个输⼊框 focusPolicy 为 Qt::TabFocus , 则只能通过 tab 选中, ⽆法通过⿏标选中.
- 修改第⼆个输⼊框 focusPolicy 为 Qt::ClickFocus , 则只能通过 tab 选中, ⽆法通过⿏标选中.
2.11 styleSheet
- 在界⾯上创建 label
- 编辑右侧的 styleSheet 属性, 设置样式
此处的语法格式同 CSS,使用键值对的方式设置样式,其中键和值之间使用 : 分割.键值对之间使用;分割.
另外,Qt Designer 只能对样式的基本格式进行校验,不能检测出哪些样式不被 Qt 支持.比如 text-align: center 这样的文本居中操作,就无法支持
编辑完成样式之后,可以看到在 Qt Designer 中能够实时预览出效果
- 运⾏程序, 可以看到实际效果和预览效果基本⼀致
- 在界⾯上创建⼀个多⾏输⼊框 (TextEdit)和两个按钮.
objectName 分别为 pushButton_light 和 pushButton_dark
- 编写按钮的 slot 函数.