QT--QWidget常用控件
编程讲究的站在巨人的肩膀上而不是从头发明轮子。一个图形化界面上的内容不需要咱们全部去实现qt中已经提供了很多内置的控件可以直接使用enabled描述一个控件是否属于可用状态enabledAPI说明isEnabled()获取到控件的可用状态.setEnabled设置控件是否可使用.true表示可用,false表示禁用.所谓 禁用 指的是该控件不能接收任何用户的输入事件, 并且外观上往往是灰色的.如果一个 widget 被禁用, 则该 widget 的子元素也被禁用.#include widget.h #include ui_widget.h #includeQPushButton #includeQDebug Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui-setupUi(this); QPushButton* button new QPushButton(this); button-setText(按钮); //设置禁用状态 button-setEnabled(false); connect(button,QPushButton::clicked,this,Widget::handle); } Widget::~Widget() { delete ui; } void Widget::handle() { qDebug()handle; }setEnabled将按钮状态设置为false按钮呈灰色且不可点击在添加一个按钮实现禁用使用切换#include widget.h #include ui_widget.h #include QDebug Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui-setupUi(this); } Widget::~Widget() { delete ui; } void Widget::on_pushButton_clicked() { qDebug()执行了槽函数; } void Widget::on_pushButton_enable_clicked() { qDebug()切换第一个按钮的禁用状态; //1.获取第一个的可用状态 bool enable ui-pushButton-isEnabled(); //2.修改为true if(enable) { ui-pushButton-setEnabled(false); }else { ui-pushButton-setEnabled(true); } }Object 的 objectName 属性介绍:QObject 是 QWidget 的父类. 里面最主要的属性就是 objectName .在一个 Qt 程序中, objectName 相当于对象的身份标识, 彼此之间不能重复.在使用 Qt Designer 时, 尤其是界面上存在多个 widget 的时候, 可以通过 objectName 获取到指定的 widget 对象.Qt Designer 生成的 ui 文件, 本身是 xml 格式的. qmake 会把这个 xml 文件转换成 C 的 .h文件(这个文件生成在 build 目录中), 构成一个 ui_widget 类.每个 widget 的 objectName 最终就会成为 ui_widget 类的属性名字.最终这个类的实例, 就是 Ui::Widget *ui , 因此就可以通过形如 ui-pushButton 或者 ui-pushButton_2 这样的代码获取到界面上的 widget 对象了.注意在同一个控件中要求不同的控件的objectName 也必须不同的不能重复后续就可以通过ui-obejectName方式来获取到对应的控件对象了。如ui-pushButton //得到了第一个按钮的对象ui-pushButton //得到了第二个按钮的对象元编程技术QT会根据ui文件生成一个ui_widget.h的文件生成的过程就会感知到界面上有哪些控件每个控件的objectName当前自动生成的objectName有点规律这个名字就是根据控件的类型 _ 数字右边的框可以修改属性值geometry位置和尺寸. 其实是四个属性的统称:x 横坐标y 纵坐标width 宽度height 高度但是实际开发中, 我们并不会直接使用这几个属性, 而是通过一系列封装的方法来获取/修改.对于 Qt 的坐标系, 不要忘记是一个 左手坐标系. 其中坐标系的原点是当前元素的父元素的左上角.move只是修改位置setGeometry既可以修改位置又可以修改尺寸geometryAPI说明geometry()获取到控件的位置和尺寸. 返回结果是一个 QRect, 包含了 x, y, width, height. 其中 x, y 是左上角的坐标.setGeometry(QRect)setGeometry(int x, int y,int width, int height)设置控件的位置和尺寸. 可以直接设置一个 QRect, 也可以分四个属性单独设置.传入QRect调整左上角的位置调整按钮高度但改变的同时高度宽度也发生改变#include widget.h #include ui_widget.h #includeQDebug Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui-setupUi(this); } Widget::~Widget() { delete ui; } void Widget::on_pushButton_up_clicked() { //获取到target本身的geometry QRect rect ui-pushButton_target-geometry(); qDebug()rect; rect.setY(rect.y()-5); ui-pushButton_target-setGeometry(rect); } void Widget::on_pushButton_down_clicked() { QRect rect ui-pushButton_target-geometry(); qDebug()rect; rect.setY(rect.y()5); ui-pushButton_target-setGeometry(rect); } void Widget::on_pushButton_right_clicked() { QRect rect ui-pushButton_target-geometry(); qDebug()rect; rect.setX(rect.x()5); ui-pushButton_target-setGeometry(rect); } void Widget::on_pushButton_left_clicked() { QRect rect ui-pushButton_target-geometry(); qDebug()rect; rect.setX(rect.x()-5); ui-pushButton_target-setGeometry(rect); }下面就是相对移动#include widget.h #include ui_widget.h #includeQDebug Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui-setupUi(this); } Widget::~Widget() { delete ui; } void Widget::on_pushButton_up_clicked() { //获取到target本身的geometry QRect rect ui-pushButton_target-geometry(); qDebug()rect; // rect.setY(rect.y()-5); // ui-pushButton_target-setGeometry(rect); 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(); qDebug()rect; // rect.setY(rect.y()5); // ui-pushButton_target-setGeometry(rect); ui-pushButton_target-setGeometry(rect.x(),rect.y()5,rect.width(),rect.height()); } void Widget::on_pushButton_right_clicked() { QRect rect ui-pushButton_target-geometry(); qDebug()rect; // rect.setX(rect.x()5); // ui-pushButton_target-setGeometry(rect); ui-pushButton_target-setGeometry(rect.x()5,rect.y(),rect.width(),rect.height()); } void Widget::on_pushButton_left_clicked() { QRect rect ui-pushButton_target-geometry(); qDebug()rect; // rect.setX(rect.x()-5); // ui-pushButton_target-setGeometry(rect); ui-pushButton_target-setGeometry(rect.x()-5,rect.y(),rect.width(),rect.height()); }你好不好趣味小游戏用户只能点击好的好的点击不好不好则按钮挪走点击之后挪走#include widget.h #include ui_widget.h Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui-setupUi(this); //设置时间戳作为随机种子 srand(time(0)); } Widget::~Widget() { delete ui; } 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); } void Widget::on_pushButton_reject_pressed() { }在鼠标点击之前挪走#include widget.h #include ui_widget.h Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui-setupUi(this); //设置时间戳作为随机种子 srand(time(0)); } Widget::~Widget() { delete ui; } void Widget::on_pushButton_accept_clicked() { ui-label-setText(好的好的); } void Widget::on_pushButton_reject_clicked() { } 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); }window frame 的影响如果 widget 作为一个窗口 (带有标题栏, 最小化, 最大化, 关闭按钮), 那么在计算尺存和坐标的时候就有两种算法. 包含 window frame 和 不包含 window frame.其中 x(), y(), frameGeometry(), pos(), move() 都是按照包含 window frame 的方式来计算的.其中 geometry(), width(), height(), rect(), size() 则是按照不包含 window frame 的方式来计算的.当然, 如果一个不是作为窗口的 widget , 上述两类方式得到的结果是一致的.代码放到构造函数中此时这个Widget对象正在构造还没有加载到window frame 中此时看不到window frame的影响当给按钮添加点击事件后实例化后window face就用影响了一个是窗口的左上角一个是Widget的左上角windowTitlewindowTitleAPI说明windowTitle()获取到控件的窗口标题.setWindowTitle(const QString title)设置控件的窗口标题.注意! 上述设置操作针对不同的 widget 可能会有不同的行为.如果是顶层 widget (独立窗口), 这个操作才会有效.如果是子 widget, 这个操作无任何效果.windowIconwindowlconAPI说明windowIcon()获取到控件的窗口图标. 返回 QIcon 对象.setWindowIcon(const QIcon icon)设置控件的窗口图标.同 windowTitle, 上述操作仅针对顶层 widget 有效.但是通过绝对路径的方式是不科学的因为写的程序是要发布到用户的电脑上的无法保证开发机上图片的路径和用户电脑上的图片路径完全一致。qt中有一个qrc机制这个机制就是从根本上解决两个问题确保图片不会被用户搞没了确保图片所在的路径在目标用户机器上存在方法是给qt项目引入一个额外的xml文件后缀名用.qrc表示在这个xml中把要使用的图片资源给导入进来并且在xml中进行记录在编译项目的时候就会根据qrc中描述的图片信息找到图片内容并且提取出图片的二维数据把这些二进制数据转化成C代码最终编译到exe里qrc使用方式1.在项目中创建一个qrc文件文件名不要带中文和特殊符号2.更改虚拟目录名字3.导入图片添加完路径后第二个按钮会变成实体注意:导入的图片需要确保图片在改qrc的同级目录或者同级目录的子目录下否则会路径无效绑定成功就会有一个树状图路径是一开始建的虚拟路径图片名图片后缀就是上面树状图的路径qrc中导入的图片资源就会被转成这个qrc_a.cpp这个C代码通过二进制转存起来上述 qrc 这一套资源管理方案, 优点和缺点都很明显.优点:确保了图片, 字体, 声音等资源能够真正做到 目录无关, 无论如何都不会出现资源丢失的情况.缺点:不适合管理体积大的资源. 如果资源比较大 (比如是几个 MB 的文件), 或者资源特别多,生成的最终的 exe 体积就会比较大, 程序运行消耗的内存也会增大, 程序编译的时间也会显著增加.windowOpacity可以设置透明效果windowOpacityAPI说明windowOpacity()获取到控件的不透明数值. 返回 float, 取值为 0.0 - 1.0 其中 0.0 表示全透明, 1.0 表示完全不透明.setWindowOpacity(float n)设置控件的不透明数值.#include widget.h #include ui_widget.h #includeQDebug Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui-setupUi(this); } Widget::~Widget() { delete ui; } void Widget::on_pushButton_2_clicked() { float opacity this-windowOpacity(); if(opacity 1.0) { return; } opacity0.1; qDebug()opacity; this-setWindowOpacity(opacity); } void Widget::on_pushButton_clicked() { float opacity this-windowOpacity(); if(opacity 0.0) { return; } opacity-0.1; qDebug()opacity; this-setWindowOpacity(opacity); }效果但是窗口的不透明度变化并不是精确的可是我代码里是精确的这是因为浮点数是用科学计数法来存储的float和double有效数字部分长度都是有限的无法精确到0.1cursorAPI说明cursor()获取到当前 widget 的 cursor 属性, 返回QCursor 对象.当鼠标悬停在该 widget 上时, 就会显示出对应的形状.setCursor(const QCursor cursor)设置该 widget 光标的形状. 仅在鼠标停留在该 widget 上时生效.QGuiApplication::setOverrideCursor(const QCursor cursor)设置全局光标的形状. 对整个程序中的所有 widget 都会生效. 覆盖上面的 setCursor 设置的内容.图形化界面可以直接设置代码方式创建#include widget.h #include ui_widget.h Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui-setupUi(this); QCursor cursor(Qt::WaitCursor); ui-pushButton-setCursor(cursor); } Widget::~Widget() { delete ui; }qt内置的光标样式自定义光标Qt允许我们通过自定义的图片来设置光标先准备一个图片然后将该图片导入到项目中qrc管理然后在代码中访问到这个图片基于这个图片构造出光标对象并设置QPixmap通过这个对象表示一个图片#include widget.h #include ui_widget.h Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui-setupUi(this); //访问到图片文件 QPixmap pixmap(:/code.png); //缩放图片 pixmap.scaled(10,10); //构造光标对象 QCursor cursor(pixmap,10,10);//默认点击的位置是光标的左上角所以热点扩大范围以图片左上角(0,0)为原点偏移(10,10)作为点击位置 //设置光标 this-setCursor(cursor); } Widget::~Widget() { delete ui; }小图标的下载推荐去阿里巴巴矢量图标库去找免费的fontAPI说明font()获取当前 widget 的字体信息. 返回 QFont 对象.setFont(const QFont font)设置当前 widget 的字体信息.关于 QFont属性说明family字体家族. 比如 楷体, 宋体, 微软雅黑 等.pointSize字体大小weight字体粗细. 以数值方式表示粗细程度取值范围为 [0, 99], 数值越大, 越粗.bold是否加粗. 设置为 true, 相当于 weight 为 75. 设置为 false 相当于weight 为 50.italic是否倾斜underline是否带有下划线strikeOut是否带有删除线toolTipAPI说明setToolTip设置 toolTip.鼠标悬停在该 widget 上时会有提示说明.setToolTipDuring设置 toolTip 提示的时间. 单位 ms.QtCreator提供的时间到后 toolTip 自动消失.msec毫秒sec秒usec微妙 1s1000ms1ms1000us#include widget.h #include ui_widget.h Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui-setupUi(this); //设置这两个代码的toolTips ui-pushButton_yes-setToolTip(这是一个yes按钮); ui-pushButton_yes-setToolTipDuration(3000); ui-pushButton_no-setToolTip(这是一个no按钮); ui-pushButton_no-setToolTipDuration(7000); } Widget::~Widget() { delete ui; }focusPolicyAPI说明focusPolicy()获取该 widget 的 focusPolicy, 返回 Qt::FocusPolicysetFocusPolicy(Qt::FocusPolicy policy)设置 widget 的 focusPolicy.Qt::FocusPolicy 是一个枚举类型. 取值如下Qt::NoFocus 控件不会接收键盘焦点Qt::TabFocus 控件可以通过Tab键接收焦点Qt::ClickFocus 控件在鼠标点击时接收焦点Qt::StrongFocus 控件可以通过Tab键和鼠标点击接收焦点 (默认值)Qt::WheelFocus : 类似于 Qt::StrongFocus , 同时控件也通过鼠标滚轮获取到焦点 (新增的选项, 一般很少使用).styleSheet通过 CSS 设置 widget 的样式.Qt就把CSS参考过来了搞了一套QSS效果#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_light_clicked() { //设置窗口的样式 this-setStyleSheet(background-color:white;); //设置输入框的样式 ui-plainTextEdit-setStyleSheet(background-color: white;color:black;); //设置按钮的样式 ui-pushButton_light-setStyleSheet(color:black;); ui-pushButton_dark-setStyleSheet(color:black;); } void Widget::on_pushButton_dark_clicked() { //设置窗口的样式 this-setStyleSheet(background-color:black;); //设置输入框的样式 ui-plainTextEdit-setStyleSheet(background-color: black;color:white;); //设置按钮的样式 ui-pushButton_light-setStyleSheet(color:white;); ui-pushButton_dark-setStyleSheet(color:white;); }效果

相关新闻

应用统计学零项目经验求职难?

应用统计学零项目经验求职难?

引言:统计学毕业生的普遍困境每年,大量应用统计学专业的毕业生涌入就业市场,他们掌握了扎实的数理统计、概率论、回归分析等理论知识,却在求职时频频碰壁。一个核心痛点浮出水面:“我没有项目经验,简历一片…

2026/10/22 20:37:28 阅读更多 →
白蚁的感知、通行与筑造行为

白蚁的感知、通行与筑造行为

白蚁的感知、通行与筑造行为 arXiv:2607.19594v1 [physics.bio-ph] 2026年7月21日 摘要 土栖白蚁与筑丘白蚁在同一种颗粒基质中完成挖掘、物料运输与筑巢,而这片基质又会反过来调控白蚁的感知、移动与物料堆放行为。本文综述跨尺度耦合的三大核心科学问题&#xff1…

2026/10/23 2:28:31 阅读更多 →
Flask 测试框架

Flask 测试框架

问题:为什么测试需要懂Flask? 简单来说,对于前后端分离的项目,如果你的前端已经搭建好了,需要调用后端的接口,但是后端接口还没写完。这个时候就需要测试开发搭建一个假接口,让前端先能调通页面…

2026/10/21 13:55:07 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/22 10:18:38 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/22 11:01:53 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/22 9:44:47 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/22 10:42:00 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/22 10:40:08 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/22 10:56:37 阅读更多 →

日新闻

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/22 1:47:45 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/22 21:33:42 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/22 5:12:39 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/22 22:56:44 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/22 22:56:12 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/22 19:06:46 阅读更多 →