当前位置: 首页 > news >正文

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
statusTipWidget 状态发生改变时显示的提示信息(比如按钮被按下等)
whatsThis鼠标悬停并按下 alt+F1时,显示的帮助信息
styleSheet允许使用 CSS 的格式来设置控件的样式
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:部件的布局方向由全局原子性决定,简单来说就是根据应用程序中的其他widget布局方向确定的
autoFillBackground是否自动填充背景颜色
windowFilePath能够把 widget 和一个本地文件路径关联起来,很少用
accessibleName

设置widget的可访问名称,这个名称可以被辅助技术获取到

这个属性⽤于实现⽆障碍程序的场景中(也就是给盲⼈写的程序)

https://www.bilibili.com/video/BV1954y1d7z9/?vd_source=7aa238fd946fa20320ee822258146eb1

accessibleDescription设置 widget 的详细描述,作用同 accessibleName
inputMethodHints针对输⼊框有效,用来提示用户当前能输⼊的合法数据的格式,比如只能输⼊数字,只能输⼊日期等.
http://www.lryc.cn/news/585222.html

相关文章:

  • 【机器学习】保序回归平滑校准算法
  • AI在医疗影像诊断中的应用前景与挑战
  • RabbitMQ 之消息积压
  • Linux进程间通信--命名管道
  • Leaflet面试题及答案(1-20)
  • [面试] 手写题-选择排序
  • 【Springboot】Bean解释
  • 为什么必须掌握Java异常处理机制?——从代码健壮性到面试必考题全解析
  • 结构化数据、非结构化数据区别
  • Web安全 - 基于 SM2/SM4 的前后端国产加解密方案详解
  • 远程登录docker执行shell报错input is not a terminal问题
  • 如何将公式图片转换为公式格式到wps/word里面
  • 红色脉络:一部PLMN在中国的演进史诗 (1G-6G)》第1篇 | 开篇:从蜂窝到星链,PLMN——连接世界的无形之网
  • 线性回归原理推导与应用(十):逻辑回归多分类实战
  • LabVIEW前面板设计--控件/文字遮挡
  • Microsoft Word 中 .doc 和 .docx 的区别
  • 利用BeautifulSoup解析大众点评区域店铺网页
  • LabVIEW远程数电实验平台
  • VIT(视觉Transformer)
  • 【爬虫】- 爬虫原理及其入门
  • 提示工程:突破Transformer极限的计算科学
  • 进程状态 + 进程优先级切换调度-进程概念(5)
  • 需求升级,创新破局!苏州金龙赋能旅游客运新生态
  • 20250711荣品RD-RK3588开发板在Android13下的开机自启动的配置步骤
  • 宝塔命令Composer 更改数据源不生效
  • 动态组件和插槽
  • 基于定制开发开源AI智能名片与S2B2C商城小程序的旅游日志创新应用研究
  • nessus最新安装
  • [Meetily后端框架] Whisper转录服务器 | 后端服务管理脚本
  • 20.缓存问题与解决方案详解教程