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/7/24 19:49:57 阅读更多 →
白蚁的感知、通行与筑造行为

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

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

2026/7/24 19:49:57 阅读更多 →
Flask 测试框架

Flask 测试框架

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

2026/7/24 19:49:57 阅读更多 →

最新新闻

ELF文件与库的原理

ELF文件与库的原理

库的制作和原理 1 ELF文件 ELF文件主要包含以下4种: 可重定位文件(xxx.o) 可执行文件 共享目标文件(xxx.so) 内核转储ELF的文件构成: 1.ELF header:用于定位文件的其他部分 2.Program header table:列举了所有有效段及其属性&…

2026/7/24 19:56:00 阅读更多 →
抖音视频下载终极指南:douyin-downloader批量去水印工具完全教程

抖音视频下载终极指南:douyin-downloader批量去水印工具完全教程

抖音视频下载终极指南:douyin-downloader批量去水印工具完全教程 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fall…

2026/7/24 19:56:00 阅读更多 →
环境土壤物理Hydrus2D/3D模型实践技术应用

环境土壤物理Hydrus2D/3D模型实践技术应用

查看原文>>>https://mp.weixin.qq.com/s/zmXj5_HLNEdpIvyi0yE0nA 前言 HYDRUS是基于Windows系统界面开发的环境土壤物理模拟软件,是用于模拟一维和多维变饱和多孔介质的水分运动、溶质(污染物等)运移、根系吸水和溶质吸收、以及热…

2026/7/24 19:56:00 阅读更多 →
C++词法分析器实现:从有限自动机到工程化实践

C++词法分析器实现:从有限自动机到工程化实践

1. 项目概述:从“字符串”到“单词”的翻译官如果你刚开始接触编译原理,可能会觉得这个词法分析听起来特别高大上,甚至有点抽象。其实,你可以把它想象成一个精通多国语言的翻译官,只不过它翻译的对象不是人类语言&…

2026/7/24 19:56:00 阅读更多 →
绝区零一条龙:免费开源的全自动游戏助手完整使用指南

绝区零一条龙:免费开源的全自动游戏助手完整使用指南

绝区零一条龙:免费开源的全自动游戏助手完整使用指南 【免费下载链接】ZenlessZoneZero-OneDragon 绝区零 一条龙 | 全自动 | 自动闪避 | 自动每日 | 自动空洞 | 支持手柄 项目地址: https://gitcode.com/gh_mirrors/ze/ZenlessZoneZero-OneDragon 绝区零一条…

2026/7/24 19:56:00 阅读更多 →
【20年ML系统老兵手记】:为什么你训出的模型一部署就崩?训练/推理数据流、内存模型、精度路径的3维撕裂分析

【20年ML系统老兵手记】:为什么你训出的模型一部署就崩?训练/推理数据流、内存模型、精度路径的3维撕裂分析

更多请点击: https://kaifayun.com 第一章:【20年ML系统老兵手记】:为什么你训出的模型一部署就崩?训练/推理数据流、内存模型、精度路径的3维撕裂分析 训练准确率98%的模型,在生产环境里返回NaN、OOM崩溃、延迟飙升1…

2026/7/24 19:55:00 阅读更多 →

日新闻

用Highcharts 创建可拖拽三维散点立方体3D图表

用Highcharts 创建可拖拽三维散点立方体3D图表

该案例基于Highcharts scatter3d 三维散点图实现空间立方体散点可视化,核心特色:三维 X/Y/Z 三轴空间,所有散点分布在 0~10 立方体空间内;散点使用径向渐变实现立体 3D 圆球质感;支持鼠标 / 触屏拖拽画布,…

2026/7/24 0:00:29 阅读更多 →
AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口 AppCertDlls 位于 HKLM\System\CurrentControlSet\Control\Session Manager\AppCertDlls。本文的程序功能是只读列出这个键在 64 位和 32 位注册表视图中的全部值,并显示每条值的来源、名称、类型和可安全显示的数…

2026/7/24 0:00:29 阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好,我是一名编程初学者,同时这也是我编程学习之路上的第一篇博客。在这里,我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手,目前在学习c语言,我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:29 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/24 3:59:20 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 1:23:39 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/24 18:52:18 阅读更多 →

月新闻