1、何为控件?
在Qtcreator中,访问UI设计界面,左侧的控件列表中就是我们Qt开发所使用到的常用控件,通过这些空间,我们可以设计出丰富美观的前端界面,对于单个控件而言,我们还可以添加槽函数,根据控件不同的信号,定义不同的槽函数,从而可以给控件添加不同的功能。
2、QWidget
在 Qt 中, 使⽤ QWidget 类表⽰ "控件". 像按钮, 视图, 输⼊框, 滚动条等具体的控件类, 都是继承⾃ QWidget. 可以说, QWidget 中就包含了 Qt 整个控件体系中, 通⽤的部分.
在 Qt Designer 中, 随便拖⼀个控件过来, 选中该控件, 即可在右下⽅看到 QWidget 中的属性
2.1QWidget核心属性一览
属性 | 作用 |
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:使⽤⾃定义的上下⽂菜单,⽤⼾可以通过⿏标右键或键 盘快捷键触发这个菜单 |
ocale | 设置语⾔和国家地区. |
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 |
accessibleDescripti on | 设置 widget 的详细描述. 作⽤同 accessibleName |
inputMethodHints | 针对输⼊框有效, ⽤来提⽰⽤⼾当前能输⼊的合法数据的格式. ⽐如只能输⼊数字, 只能 输⼊⽇期等. |
2.2 enabled
API | 说明 |
isEnabled() | 获取控件的可用状态 |
setEnabled() | 设置控件的可用状态 |
案例:按钮被禁用
通过另一个按钮来设置该按钮的禁用状态
结果如图:
widget.cpp
在编写该代码的过程中,我们有一下几点需要注意
1)要控制的QPushButton按钮必须要添加到widget类的成员变量中,由此可以被槽函数访问到
2)槽函数一定要在头文件中声明
3)使用QPushbutton时要包含对应的头文件
#include "widget.h"
#include "ui_widget.h"
#include<QPushButton>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
,button(nullptr)
{
ui->setupUi(this);
button=new QPushButton(this);
button->setText("这是一个被禁用的按钮");
button->setEnabled(false);
QPushButton* button2=new QPushButton(this);
button2->setText("切换按钮1 的状态");
button2->move(100,50);
//将按钮2的点击信号与槽函数绑定
connect(button2,&QPushButton::clicked,this,&Widget::handle);
}
void Widget::handle()
{
if(button->isEnabled())
{
button->setEnabled(false);
}
else{
button->setEnabled(true);
}
}
Widget::~Widget()
{
delete ui;
}
2.3 geometry
位置和尺寸
如图,以桌面左上角为原点,Widget距离原点的横向长度长度为x,纵向长度为y,而Widget的高度为height,宽度为width
常用API
小小案例
对上个控件的槽函数代码稍加修改,就可以给按钮二同时添加上移动按钮一 功能
Window frame的影响
如果 widget 作为⼀个窗⼝ (带有标题栏, 最⼩化, 最⼤化, 关闭按钮), 那么在计算尺⼨和坐标的 时候就有两种算法. 包含 window frame 和 不包含 window frame. 其中 x(), y(), frameGeometry(), pos(), move() 都是按照包含 window frame 的⽅式来计算 的.
其中 geometry(), width(), height(), rect(), size() 则是按照不包含 window frame 的⽅式来计 算的. 当然, 如果⼀个不是作为窗⼝的 widget , 上述两类⽅式得到的结果是⼀致的.
2.4windowTitle
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 设置窗⼝标题
this->setWindowTitle("这是标题");
}
2.5 windowIcon
1) 先在 D 盘中放⼀个图⽚, 名字为 rose.jpg
2)widget.cpp
#include <QIcon>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 创建图标对象
QIcon icon("d:/rose.jpg");
// 设置图标
this->setWindowIcon(icon);
}
效果:
2.6 windowOpacity
该控件可以控制窗口透明度
两个按钮的槽函数
效果
2.7 cursor
可以改变某一个鼠标停留在某个鼠标的样式,样式不限于Qt库中的几种样式,可以自定义图片生成光标样式
创建自定义光标之前,我们需要现将图片引入,根据图片的路径构建一个Qpixmap对象,然后根据Qpixmap对象构建出cursor对象,在通过要改变放置图标的按钮的API设置图标即可。
案例
#include "widget.h"
#include "ui_widget.h"
#include<QPushButton>
#include<QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//引入图片
QPixmap pixmap(":/basketball.png");
//创建光标对象
QCursor cursor(pixmap,0,0);
//根据光标对象设置光标
this->setCursor(cursor);
QPushButton* button1=new QPushButton(this);
button1->setText("Low");
button1->move(200,200);
connect(button1,&QPushButton::clicked,this,&Widget::handle);
}
void Widget::handle()
{
float opacity = this->windowOpacity();
qDebug()<<opacity;
opacity-=0.1;
this->setWindowOpacity(opacity);
}
Widget::~Widget()
{
delete ui;
}
2.8 font
设置对应控件的字体
API
属性
实用案例
2.9 toolTip
光标防止在该部分就会生成对应的提示文本
核心设置代码
2.10 focusPolicy
获取焦点的策略,鼠标所选中的地方就是焦点
使用案例:线上笔试的时候,焦点应该停留在答题网站上,焦点一旦离开答题网站,就会识别出可能作弊的可能