QT跨平台应用程序开发框架(4)—— 常用控件QWidget
一,前言
1.1 关于控件
一个图形化界面上的内容,我们是不需要从零去实现,Qt中已经提供了很多内置的控件了,可以直接使用,因为编程这件事讲究“站在巨人的肩膀上”
- 控件,英文就是 Widget ,界面上的各种元素(按钮,文本框等),都可以称为控件
- Qt 的控件很多,但是整体来说,颜值还是比现代的控件体系差了一点,但是Qt Designer 中展示的控件都是默认的样子,还提供了一些优化手段,可以让控件变得更好看
- 简单来说,Qt 在不断更新迭代,不断适应时代要求
1.2 关于属性
在Qt Creator右侧,可以看到 QWidget 的各种属性,并且也可以直接编辑:
属性有很多,但是我们也可以通过 Qt 文档来进行了解,但是这些属性我们不需要全部了解,只要了解一些重要的,常见的属性即可,后面需要用的时候直接查文档即可
(所有属性的大致内容列举在文章结尾)
二,enabled属性
2.1 API使用
enable 表示一个控件是否处于“可用”状态,“可用”相对的就是“禁用”
- 所谓"禁用"指的是该控件不能接收任何用户的输入事件,并且外观上往往是灰色的
- 如果⼀个widget被禁用,则该控件的子元素也被禁用
相关API有两个:
API | 说明 |
---|---|
isEnabled | 获取控件的可用状态 |
setEnabled | 设置控件是否可用,true表示可用,否则false |
假设我们创建一个禁用状态的按钮:
2.2 简单示例
下面我们来实现一个按钮切换另一个按钮的状态,先通过拖拽方式创建两个按钮:
然后右键按钮转到槽:
然后编写槽函数:
void Widget::on_pushButton_clicked()
{qDebug() << "按钮被点击了";
}void Widget::on_pushButton_2_clicked()
{//切换上面按钮的可用状态bool enable = ui->pushButton->isEnabled();if(enable) //为true时{ui->pushButton->setText("不可点击");ui->pushButton->setEnabled(false);}else{ui->pushButton->setText("可点击");ui->pushButton->setEnabled(true);}
}
效果如下:
三,geometry属性
3.1 API使用
这个单词中文翻译是“几何”的意思,简单来说就是“x,y,width,height”,这四个属性的统称,表示当前控件的位置和尺寸,如下图:
常用API如下:
API | 说明 |
---|---|
geometry() | 获取当前控件的位置和尺寸,返回结果是一个QRect对象,包含了x,y,width,height |
setGeometry(QRect) setGeometry(int x, int y, int width, int height) | 设置控件的位置和尺寸,也可以通过QRect来设置 |
Qt针对一些几何上的概念也进行了封装:
- QPoint表示一个点,QRect表示一个矩形
- 都是小对象,属性很少,所以占用很小
我们仍然先通过拖拽方式创建一个按钮,然后将 objectName 也修改一下:
然后我们在下面再创建四个按钮,目的是通过这四个按钮对上面的target按钮进行调整,如下图:
然后对四个按钮都添加槽函数,如下:
void Widget::on_pushButton_up_clicked()
{//首先要获取到 target 本身的 grometryQRect rect = ui->pushButton_target->geometry();qDebug() << rect; //Qt很多内置的对象大多数都是可以直接通过Debug来打印的rect.setY(rect.y() - 10); //让控件在y轴上移10个像素ui->pushButton_target->setGeometry(rect); //将修改好的结果设置进去
}void Widget::on_pushButton_down_clicked()
{QRect rect = ui->pushButton_target->geometry();qDebug() << rect;rect.setY(rect.y() + 10);ui->pushButton_target->setGeometry(rect);
}void Widget::on_pushButton_left_clicked()
{QRect rect = ui->pushButton_target->geometry();qDebug() << rect;rect.setX(rect.x() - 10);ui->pushButton_target->setGeometry(rect);
}void Widget::on_pushButton_right_clicked()
{QRect rect = ui->pushButton_target->geometry();qDebug() << rect;rect.setX(rect.x() + 10);ui->pushButton_target->setGeometry(rect);
}
效果如下:
当前代码实际执行的效果,是在调整左上角的位置,同时改变了高度和宽度
上面是调整大小,那么我们如何实现按钮的“平移”效果呢?
不再修改 QRect,而是通过 setGeometry 的第二个版本的函数去重新设置位置即可,如下槽函数修改:
void Widget::on_pushButton_up_clicked()
{//首先要获取到 target 本身的 grometryQRect rect = ui->pushButton_target->geometry();qDebug() << rect; //Qt很多内置的对象大多数都是可以直接通过Debug来打印的ui->pushButton_target->setGeometry(rect.x(),rect.y() - 10, rect.width(),rect.height()); //实现平移
}void Widget::on_pushButton_down_clicked()
{QRect rect = ui->pushButton_target->geometry();qDebug() << rect;ui->pushButton_target->setGeometry(rect.x(),rect.y() + 10, rect.width(),rect.height());
}void Widget::on_pushButton_left_clicked()
{QRect rect = ui->pushButton_target->geometry();qDebug() << rect;ui->pushButton_target->setGeometry(rect.x() - 10, rect.y(), rect.width(),rect.height());
}void Widget::on_pushButton_right_clicked()
{QRect rect = ui->pushButton_target->geometry();qDebug() << rect;ui->pushButton_target->setGeometry(rect.x() + 10, rect.y(), rect.width(),rect.height());
}
3.2 简单示例
有了上面的经验后我们就可以搞一个比较有意思的程序,先创建下面控件:
然后加入下列槽函数:
void Widget::on_pushButton_accept_clicked()
{ui->label->setText("恭喜你,考试全过!!");
}void Widget::on_pushButton_reject_clicked()
{//如果点击了这个按钮,就把这个按钮挪走,可以通过生成随机数的方式确定按钮新的位置//获取当前程序窗口的尺寸int width = this->geometry().width();int height = this->geometry().height();//重新生成位置,需要在构造函数中预置随机数种子int x = rand() % width;int y = rand() % height;//移动按钮ui->pushButton_reject->move(x, y); //这个是点击之后就会随机移动
}
但其实我们可以更进一步,让鼠标一按下还未松开,按钮就移动,那么我们不再使用clicked,而是使用 pressed:
然后我们把上面 clicked 的内容剪切到pressed即可,效果如下:
3.3 window frame
- 如果widget作为⼀个窗口带有标题栏,最小化,最大化,关闭按钮,就最外面的那一圈东西我们叫做 window frame 窗口框架,是操作系统自带的
- 那么在计算尺寸和坐标的 时候就有两种算法:包含 window frame 和不包含 window frame,主要区别就是 Qt 中关于位置尺寸的 API,是从 Widget 本体左上角为原点还是以 window frame 左上角为原点考虑
- 其中x(),y(),frameGeometry(),pos(),move() 都是按照包含 window frame 的方式来计算的;而 width(),height(),rect(),size() 则是按照不包含 window frame 的方式来计 算的
- geometry() 和 setGeometry() 不考虑,而也提供了frameGeometry() 和 setFrameGeometry(),是考虑的
- 当然,如果⼀个不是作为窗口的widget,上述两类方式得到的结果是⼀致的
下面我们通过代码来演示一下:
问题:为什么结果一样?
解答:因为我们这个代码是放在“构造函数”中,此时这个Widget对象是正在构造的,还没有加入 window frame 中,所以结果一样
所以我们可以创建一个按钮,通过按钮来获取并打印结果即可,如下:
#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QPushButton* button = new QPushButton(this);button->setText("你好");button->move(100, 100);connect(button, &QPushButton::clicked, this, &Widget::handle);
}Widget::~Widget()
{delete ui;
}void Widget::handle() //记得声明
{QRect rect1 = this->geometry();QRect rect2 = this->frameGeometry();qDebug() << rect1;qDebug() << rect2;
}
可以看到打印结果就不同了
四,windowIcon属性
4.1 API使用
这个属性主要表示窗口的图标,API如下:
API | 说明 |
---|---|
windowIcon() | 获取到控件的窗口图标,返回 QIcon 对象 |
setWindwoIcon(const QIcon& icon) | 设置控件的窗口图标 |
第一个获取图标一般很少用,所以一般是用第二个,并且这俩 API 只能针对顶层窗口使用,无法针对一个具体的控件使用,下面来演示一下作用
首先要准备一个图片,并复制好路径,然后创建 QIcon 对象设置好地址再set一下即可,两行代码搞定图标设置:
然后就可以看到图标被成功设置了
问题:为什么QIcon对象不在堆上创建了?
解答:
- 我们之前推荐在堆上创建对象,是为了延长当前控件的生命周期,使其能通过Qt 对象树来释放对象
- 而QIcon本身是一个小的对象,创建除了来后就是要设置到某个 QWidget 里面的额,QIcon 对象本身释放不释放不影响图标的最终显示
- 并且QIcon也不支持对象树,无法给它执行父对象
4.2 qrc机制
但是,我们使用绝对路径的这种方式,不是很科学,因为一旦路径对应的图片不存在,运行系统不会报错,图标也不会被成功设置,因为我们写的程序最终是要发布到用户电脑上的,我们无法确保用户机器上会有对应的图标,所以一般使用相对路径是更好的
但是我们也不发保证相对路径就是绝对可靠的,毕竟用户行为是难以预测的,所以 Qt 提供了一种机制:qrc 机制,就是从根本上解决上述两个问题:
- 确保图片所在路径在目标用户机器上存在
- 确保图片不会被用户搞没
给 Qt 项目引入一个额外的 xml 文件(后缀名用 .qrc 表示),然后在这个 xml 文件中把要使用的图片资源给导入进来,并在 xml 中进行记录,后面 Qt 在编译的时候,就会根据 qrc 中描述的图片信息,找到图片内容,提取出图片的二进制数据,把这些二进制数据转成 C++ 代码,最终嵌合编译进 exe 程序里
qrc缺点:无法导入太大的资源文件,比如几 GB的视频文件
下面我们来介绍下 qrc 的使用方式:
①创建 qrc 文件
再直接点击完成即可,文件长这样,是Qt Creator提供的一个可视化编辑器:
②把图片导入到 qrc 文件中
先创建一个“前缀”(Prefix),这个可以理解成一个虚拟的目录,没有真实存在,目的是为了方便 Qt 通过该虚拟路径访问到这个图片:
再把图片导入进来,但是直接导入图片会报错:
所以我们把图片拷贝到项目目录下再添加即可:
看到这个说明导入成功
③在代码里通过虚拟路径获取图片
在代码中我们就可以通过 前缀 + 文件名 的方式访问到图片
④查看源代码
那么我们的这个 png 存在哪里呢?
右键 .pro 文件在 Explorer 中显示:
然后进入上级目录的这个目录,可以看到多了一个 qrc_resource.cpp 文件:
qrc 中导入的图片资源,就会被转成这个 qrc_resource.cpp 这个文件
当 Qt 项目进行编译时,这个 cpp 文件就被一起编译进 exe 中了,运行exe时,上述图片的内容也就顺带被加载进内存里了
五,windowOpacity属性
5.1 API使用
这个用来设置窗口或控件的不透明度,API如下:
API | 说明 |
---|---|
windowOpacity() | 获取窗口或控件的不透明度,返回为 float,取值为 0.0 -> 1.0,从全透明到全不透明 |
setWindowOpacity(float n) | 设置窗口或控件不透明数值 |
下面我们来实现一个程序,包含两个按钮,可以通过这两个按钮改变窗口的透明度
首先创建两个按钮,并编写槽函数:
槽函数如下:
void Widget::on_pushButton_add_clicked()
{float opacity = this->windowOpacity();if (opacity >= 1.0) return; //最多加到1.0qDebug() << 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);
}
效果如下:
5.2 两个问题
我们先来看下我们上面程序的打印结果:
可以发现,我们的不透明值并不是和我们想的那样 +=1 或 -=1 的,有一点误差
问题一:为什么会有误差呢?
解答:可以先回顾下C语言中浮点数的存储机制:C语言进阶——数据的存储_计算机存储中低位和下位的区别-CSDN博客
- 在IEEE 754 标准中,规定了浮点数要使用“二进制科学计数法”的方式来表示,一般把一个浮点数分成“符号位”,“有效数字”,“指数部分”三部分
- 有效数组部分也是用二进制存的,但是由于我们这里大多数都是小于1的小数,所以默认整数部分就是1,相当于整数部分不表示了,只表示后面的小数了
- 然后对于小数部分,我们第一个有效数字表示 0.5,第二个表示 0.25,第三个是0.125,那么对于二进制101,如果转换成小数,那么就是1 * 0.5 + 0 * 0.25 + 1 * 0.125 = 0.625
- 但是对于0.1这样的小数,由于 float 和 double 的有效数字部分长度是有限的,就导致无法凑出一个非常解决0.1这样的数字,所以上面我们进行加减的时候就会出现误差
- 这是很多编程语言都是这套体系,优点是速度快,占用小,适配性好;缺点则是就像上面一样,有些小数无法精确表示
所以我们平常写代码,最好不要直接将两个浮点数进行比较,因为在某些平台下,0.1 + 0.2 == 0.3 的结果可能就是false,正确写法是作差,然后判断结果的绝对值小于预期误差范围
然后就是我们代码中对于设置的值加了判定条件:
其实这个条件不加也可以,因为超过 1.0 或 0的数是设置不了的, API内部也有判定;但是建议还是加上
问题二:为什么上面的判定可以不写,但是仍然建议写上呢?
解答:在《代码大全》这本书中,提出了一个“防御性编程”的词语,对于这个词语,书中还给出了一个例子,叫做“防御性驾驶”:
- 就是哪怕别人开车的时候犯错了,但是只要我自己开车时遵守好规则,我们自己不犯错,那么不会对我们自己构成太大伤害
- 很多写代码的时候,往往都是把一个大的项目拆分成很多的小模块,有不同的人分别完成,模块之间也会进行交互,比如模块A提供 API 给模块B去调用
- 那么当我在使用别人的 API 调用时,比如我要传一个指针给API,那么我是否应该在调用函数之前就对这个指针进行判空呢?
- 在《代码大全》中给出的结论就是,我们要双重判定(如后面的图片),因为这样的话,一旦一方失误,忘记判空,不会产生特别严重的后果
六,cursor属性
6.1 API使用
这个鼠标移动到窗口或控件时,改变鼠标的样式,API如下:
API | 说明 |
---|---|
cursor() | 获取当前 Widget 的 cursor 属性,返回 QCursor 对象 当鼠标悬停在该 Widget 上时,就会显示出对应的形状 |
setCursor(const QCursor& cursor) | 设置该 Widget 光标的形状,仅在鼠标停留在该 Widget 上时生效 |
QGuiApplication::setOverrideCursor(co nst QCursor&cursor) | 设置程序全局光标的形状,对所有的 Widget 生效,并且覆盖 setCursor 设置的内容 |
cursor属性也可以在右下角那一堆属性中看到,并且也可以修改:
除了在这里修改,我们也可以直接在代码里修改:
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QCursor cursor(Qt::WaitCursor); //表示等待的图标this->setCursor(cursor);
}
这样我们就相当于把窗口的图标设置成等待的了,如下图:
然后我们按住Ctrl键,点击代码中的 Qt::WaitCursor,可以看到很多Qt内置的光标:
6.2 自定义光标
有时候 Qt 内置的光标可能满足不了我们的需求,所以 Qt 也允许我们通过自定义图片的方式来设置光标
先准备一个图片,然后导入 qrc 中,再在代码中访问这个图片,构造出光标对象并设置,大致步骤和我们前面设置图标非常类似,所以导入过程不再重复,如下代码:
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QIcon icon(":/deepseek.png");this->setWindowIcon(icon); //设置图标QPixmap pixmap(":/deepseek.png"); //设置窗口的图标QCursor cursor(pixmap, 10, 10); //当我们点击时,是图片左上角在进行点击//假设我在按钮的边缘位置进行点击,但由于光标图片的左上角到按钮外面去了导致点击不到//所以我们可以设置实际点击在图片光标里的位置,10,10表示点击实际生效的位置,左上角是0,0this->setCursor(cursor);
}
如果导入的图片太大,我们也而已通过下面的API对图片进行缩放:
对于更多图标文件,可以去这个网站里找找:iconfont-阿里巴巴矢量图标库
七,font属性
这个属性用于设置一系列字体的一系列相关的内容,API如下:
API | 说明 |
---|---|
font() | 获取当前控件的字体信息,返回 QFont 对象 |
setFont(const QFont& font) | 设置当前控件的字体信息 |
然后对于QFont对象,里面包含了很多属性,如下表格:
属性 | 说明 |
---|---|
family | 字体家族,比如“楷体”,“微软雅黑”等 |
pointSize | 字体大小,单位px |
weight | 字体粗细,以[0, 99]表示,数值越大越粗 |
bold | 是否加粗,设置为true相当于 weight 75,false 相当于 50 |
italic | 是否倾斜 |
underline | 是否带有下划线 |
strikeOut | 是否带有删除线 |
关于以后工作中涉及到的字体设置:
- 在实际开发中,对于字体图片等,往往有专门的 美工/设计/UED 来进行确定
- 在一些小公司里,没有美工,甚至没有产品经理,这种时候,我们就可以参考下别人的设置是什么样的,或者直接查看知名网站源代码,看看别人的网页是如何安排字体属性的
修改字体属性我们也有两种方式,直接在Qt Designer中修改,在代码中修改
先创建一个文本控件,然后就可以在右下角里设置字体(支持实时预览):
通过属性编辑这样的方式,虽然能够快速修改文字属性,但是还不够灵活,因为如果程序运行过程中需要修改,那么就需要代码来操作了
下面展示代码修改字体的操作:
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{QLabel* label = new QLabel(this);label->setText("这是一段文本");//先创建字体对象QFont font;font.setFamily("仿宋");font.setPixelSize(30);font.setBold(true);font.setItalic(true);font.setUnderline(true);font.setStrikeOut(true);//再把 font 对象设置到 label 中label->setFont(font);
}
八,toolTip属性
一个 GUI 程序,界面比较复杂,按钮啥的都有很多,那么这个属性就是让鼠标悬停到某个控件上的时候,就能弹出提示,API如下:
API | 说明 |
---|---|
setToolTip | 设置提示的内容 鼠标悬停在该控件上时的提示说明 |
setToolTipDuring | 设置提示的时间,单位ms 时间到后提示自动消失 |
下面演示下API的使用和效果:
先创建两个按钮,并修改objectName:
可以直接在右下角设置,也可以用代码设置 toolTips:
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//设置两个按钮的 toolTipsui->pushButton_yes->setToolTip("这是一个 Yes 按钮");ui->pushButton_yes->setToolTipDuration(3000); //设置显示时间为300毫秒,也就是3秒钟ui->pushButton_no->setToolTip("这是一个 No 按钮");ui->pushButton_no->setToolTipDuration(4000); //设置显示时间为4秒
}
九,focusPolicy属性
这个控件用于获取到焦点的策略,API如下:
API | 说明 |
---|---|
focusPolicy() | 获取该widget的focusPolicy,返回Qt::FocusPolicy |
setFocusPolicy(Qt::FocusPolicy policy) | 设置widget的focusPolicy |
关于“焦点”:
- 计算机中的“焦点”,对于键盘操作非常明显,比如我们只有选中一个输入框,我们在键盘上按下一些键才能被输入进去;如果选中的是其它的程序窗口,此时键盘按什么键也不会有反应
- 所谓的“焦点”,就是指能选中这个元素,并让接下来的操作(比如键盘输入)都是针对该焦点元素进行
- 一般来说,一个控件获取到焦点主要是两种方式:鼠标点击 和 键盘Tab键
关于第二个 API 里的 Qt::FocusPolicy ,这是一个枚举类型,取值如下:
- Qt::NoFocus:表示控件不会接收键盘焦点
- Qt::TabFocus:表示控件可以通过 Tab键接收焦点
- Qt::ClickFocus:控件在鼠标点击时接收焦点
- Qt::StrongFocus:表示控件可以通过 Tab 和 鼠标点击接收焦点(默认是这个)
- Qt::WhellFocus:类似上一条,同时控件可以通过鼠标滚轮获取到焦点(新增的, 很少用)
下面我们直接通过Qt Designer 来操作焦点属性,就不通过代码了,因为是一样的效果
首先创建输入框,然后可以在右下角找到 focusPolicy 属性:
然后我们就可以修改右下角的 focusPolicy 属性修改输入框获取焦点的方式了,这里就不演示了
十,styleSheet属性
10.1 简单操作
通过 CSS 设置 widget 的样式,关于CSS可以参考:前端学习(2)—— CSS详解与使用_前端css-CSDN博客
Qt 就把 CSS 给参考过来了,自己搞了一套 QSS,复用了很多 CSS 的设计
下面我们来操作下 QSS
先以最简单的文本框为例,创建一个 label控件,然后可以在右下角找到 styleSheet 属性:
也可以直接右键文本框:
然后我们就可以在打开的文本框中设置样式,是键值对的格式,比如:
这些属性值在 Qt 文档中都会有介绍,直接搜索 Qt Style Sheet 即可
10.2 设置夜间模式
先搞一个大的文本框,然后搞两个按钮,期望是我们可以通过两个按钮实现模式切换:
槽函数如下:
void Widget::on_pushButton_day_clicked()
{this->setStyleSheet("background-color: white;"); //设置窗口背景为白色ui->textEdit->setStyleSheet("background-color: white; color: black;"); //设置文本框背景为白色,文字为黑色ui->pushButton_day->setStyleSheet("background-color: white; color: black");ui->pushButton_night->setStyleSheet("background-color: white; color: black");
}void Widget::on_pushButton_night_clicked()
{this->setStyleSheet("background-color: black");ui->textEdit->setStyleSheet("background-color: black; color: white;"); //设置文本框背景为白色,文字为黑色ui->pushButton_day->setStyleSheet("background-color: black; color: white");ui->pushButton_night->setStyleSheet("background-color: black; color: white");
}
效果如下:
但是可以发现,日间模式的背景颜色和我们程序初始页面不同,主要体现在窗口上,所以要想让上面的显示看起来有区别,就可以设置颜色的三原色的数值来设置颜色
对于获取程序窗口的原本的三原色数值,可以通过一些截图工具来获取,比如我使用的 Snipaste 截图工具,就可以进入截图页面后显示三原色数值,并且可以按C复制:
像QQ截图,微信截图等工具,都可以获取数值,下面给出一组数值供参考:
void Widget::on_pushButton_day_clicked()
{this->setStyleSheet("background-color: 240,240,240;"); //设置窗口背景为白色ui->textEdit->setStyleSheet("background-color: 255,255,255; color: black;"); //设置文本框背景为白色,文字为黑色ui->pushButton_day->setStyleSheet("background-color: 253,253,253; color: black");ui->pushButton_night->setStyleSheet("background-color: 253,253,253; color: black");
}void Widget::on_pushButton_night_clicked()
{this->setStyleSheet("background-color: black");ui->textEdit->setStyleSheet("background-color: black; color: white;"); //设置文本框背景为白色,文字为黑色ui->pushButton_day->setStyleSheet("background-color: black; color: white");ui->pushButton_night->setStyleSheet("background-color: black; color: white");
}
其实 RGB 是一种比较常见的“简化版本”模型,很多职业做美工的人,对于颜色的设置是很极端的,甚至用的显示器都是专门设计的
十一,QWidget属性一表览
属性 | 说明 |
---|---|
enabled | 设置控件是否可用,true表示可用,否则false |
geometry | 位置和尺⼨,包含x,y,width,height四个部分 其中坐标是以⽗元素为参考进⾏设置的 |
windowTitle | 设置 widget 标题 |
windowIcon | 设置 widget 图标 |
windowOpacity | 设置 widget 透明度 |
cursor | 鼠标悬停时显示的图标,有箭头,沙漏等,可自定义 |
font | 字体相关属性,有字体家族,粗体,斜体等 |
toolTip | ⿏标悬停在 widget 上会在状态栏中显示的提示信息 |
toolTipDuring | 提示信息的显示时间,单位ms |
statusTip | Widget 状态发生改变时显示的提示信息(比如按钮被按下等) |
whatsThis | 鼠标悬停并按下 alt+F1时,显示的帮助信息 |
styleSheet | 允许使用 CSS 的格式来设置控件的样式 |
focusPolicy | 该 widget 如何获取到焦点
|
contextMenuPolicy | 上下文菜单的显示策略:
|
locale | 设置语⾔和国家地区 |
acceptDrops | 该部件是否接受拖放操作:
|
minimumSize | 控件的最小尺寸,包含最小宽度和高度 |
maximumSize | 控件的最大尺寸,包含最大宽度和高度 |
sizePolicy | 尺寸策略,设置控件在布局管理器中的缩放方式 |
windowModality | 指定窗口是否具有“模态”行为 |
sizeIncrement | 拖动窗口大小时的增量单位 |
baseSize | 窗口的基础大小,用来搭配 sizeIncrement 调整组件尺寸 |
palette | 调色板,设置 widget 的颜色风格 |
mouseTracking | 是否要跟踪⿏标移动事件:
|
tabletTracking | 是否跟踪触摸屏的移动事件,类似于mouseTracking Qt 5.9 中引⼊的新属性 |
layoutDirection | 布局方向:
|
autoFillBackground | 是否自动填充背景颜色 |
windowFilePath | 能够把 widget 和一个本地文件路径关联起来,很少用 |
accessibleName | 设置widget的可访问名称,这个名称可以被辅助技术获取到 这个属性⽤于实现⽆障碍程序的场景中(也就是给盲⼈写的程序) https://www.bilibili.com/video/BV1954y1d7z9/?vd_source=7aa238fd946fa20320ee822258146eb1 |
accessibleDescription | 设置 widget 的详细描述,作用同 accessibleName |
inputMethodHints | 针对输⼊框有效,用来提示用户当前能输⼊的合法数据的格式,比如只能输⼊数字,只能输⼊日期等. |