Qt Widget核心属性

news/2024/9/17 7:53:34/ 标签: qt, 开发语言, c++

文章目录

    • 前言
    • enabled
    • geometry
    • windowTitle
    • windowIcon
    • windowOpacity
    • cursor
    • font
    • toolTip
    • focusPolicy
    • styleSheet

前言

Qt中的各种控件,都是继承自QWidget类,了解这个类的属性方法之后,后续的控件也通用

enabled

enabled描述了一个控件是否处于“可用”状态

和“可以”相对的概念叫“禁用”

“禁用”状态指的是该控件不能接收任何用户输入的事件了,并且外观上是灰色的;此外,如果一个控件被禁用,那么它的子元素也将被禁用

AIP说明
isEnabled()获取控件可用状态
setEnabled设置控件是否可用,true表示可用,false表示禁用

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void handle();private:Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QPushButton>
#include<QtDebug>
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()";
}

image-20240906194452372

也可以通过一个按钮来切换另一个按钮的状态

image-20240906194908805

在同一个界面当中,要求不同的控件objectName不能重复,这样后续就能通过ui->objectName访问到对应的控件。

这个自动生成的objectName是有点规律的,控件类型 + 下划线 + 数字,这个以数字方式命名,不是一个好习惯,我们可以修改

GIF 2024-9-6 20-01-53

geometry

这个属性可用认为是四个属性的统称:x、y、width、height

image-20240906201113744

API说明
geometry()获取控件的位置和尺寸,返回结果是一个QRect(矩形),包含了x、y、width、height,其中(x,y)是左上角的坐标
setGeometry(QRect)
setGeometry(int x, int y, int width, int height)
设置控件的位置和尺寸,可用直接设置一个QRect,也可以分四个属性单独设置

move只是修改位置,geometry既可以修改位置、也可以修改尺寸

通过四个方向键按钮,来控制target

image-20240906202242468

#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_up_clicked()
{//获取target本质的geometryQRect rect = ui->pushButton_target->geometry();//可用直接打印qDebug() << rect;//设置y轴rect.setY(rect.y() - 5);
}void Widget::on_pushButton_down_clicked()
{QRect rect = ui->pushButton_target->geometry();qDebug() << rect;rect.setY(rect.y() + 5);
}void Widget::on_pushButton_left_clicked()
{QRect rect = ui->pushButton_target->geometry();qDebug() << rect;rect.setX(rect.x() - 5);
}void Widget::on_pushButton_right_clicked()
{QRect rect = ui->pushButton_target->geometry();qDebug() << rect;rect.setX(rect.x() + 5);
}

执行发现,只是调整了左上角的位置,左上角改变的同时,高度和宽度也改变了

GIF 2024-9-6 20-37-46

如果想实现“平移”的效果,尺寸保存不变,就不用修改QRect,可用通过QRect基于setGeometry第二个版本的函数重新设置位置即可:

void Widget::on_pushButton_up_clicked()
{//获取target本质的geometryQRect rect = ui->pushButton_target->geometry();//可用直接打印qDebug() << rect;//设置y轴//rect.setY(rect.y() - 5);//以上都是局部变量,获取target,将矩形设置进去//ui->pushButton_target->setGeometry(rect);ui->pushButton_target->setGeometry(rect.x(), rect.y()-5, rect.width(), rect.height());
}//...

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可用基于此,做一个简单的小程序:

image-20240906210621340

#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);
}//pressed 点击鼠标之后就触发
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);
}

GIF 2024-9-6 21-07-19

关于window frame的影响,可以看此篇文章:Qt中window frame的影响

windowTitle

API说明
windowTitle()获取控件窗口的标题
setWindowTitle(const QString& title)设置控件的窗口标题

windowTitle属性是属于QWidget,而QWidget是一个广泛的概念,例如一个按钮、一个输入框,都属于QWidget

windowTitle属性只针对顶层窗口这样的QWidget才有效

image-20240907094511089

当前设置了窗口标题,也给按钮设置了标题,窗口标题正常显式,按钮没有显式、也没有报错。

此时“没有报错”,是不太科学的

windowIcon

windowIcon表示窗口的图标,下面这些就是窗口的图标

image-20240907103653826

想要改变窗口图标,可以采用下面的API:

API说明
windowIcon()获取控件窗口图标,返回QIcon对象
setWindowIcon(const QIcon& icon)设置控件的窗口图标

这个也是针对顶层窗口使用的

#include "widget.h"
#include "ui_widget.h"
#include<QIcon>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QIcon icon("./logo.jpg");this->setWindowIcon(icon);
}Widget::~Widget()
{delete ui;
}

Tips1:

之前一般都是在堆上创建对象,而这里QIcon对象直接在栈上创建。

这是因为要确保当前对象的生命周期是足够的,要通过Qt对象树来释放;

而QIcon自身是一个比较小的对象,创建出来之后要设置到某个QWidget里面,QIcon对象本身释放与否,不需要图标的显示;

另外QIcon也不支持对象树机制,无法给它指定父对象

Tips2:

这里的路径读取,采用了/作为分隔符,这是因为C++中\是转义字符,会影响读取

如果想使用\作为分隔符,C++11引入raw string,这里面的字符串就表示不包含任何转义字符R(“C:\ProgramFiles\xxx\xx.jpg”)

Tips3:

设置路径一般采用相对路径,因为程序可能是要给别人使用的,无法确保我们的路径和用户的路径一致。

这个图片要放到运行程序的路径下:

image-20240907110004924

如果用户将图片不小心弄没了,这还是比较麻烦。Qt里面引入了qrc机制,从根本上解决这两个问题:

  1. 确保图片所在路径在目标用户机器上存在
  2. 确保图片不会丢失

qrc机制讲解:Qt qrc机制

运行之后,窗口的图标就改变了

image-20240907105736174

windowOpacity

windowOpacity可以设置窗口透明度

API说明
windowOpacity()获取控件的不透明数值
返回float,取值为[0.0, 1.0],其中0.0表示全透明,1.0表示完全不透明
setWindowOpacity()设置控件的不透明数值
#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_add_clicked()
{float opacity = this->windowOpacity();if(opacity >= 1.0){return;}qDebug() << 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);
}

GIF 2024-9-7 15-41-28

事件运行的时候,查看输出信息,窗口透明度的变化,并不是精确的

image-20240907154307438

这是因为浮点数在内存中存储,要根据IEEE 754标准,规定浮点数要使用二进制位科学计数法的方法来表示,一个浮点数分为3部分:

  1. 符号位
  2. 有效数字
  3. 指数部分

使用二进制表示有效数字部分,第一位0.5(2-1)、第二位0.25(2-2)、第三位0.125(2-3)…

由于长度有限,就无法精确表示0.1这样的数字,所以就显示出了这些有误差的数字

具体方面,可以看此篇文章:数据的存储

我们代码当中加了判定条件,看opacity是否在[0.0, 1.0]这个区间,其实不加也是可以的,因为超出范围的设置不进去,setWindowOpacity内部做了处理。

GIF 2024-9-7 16-02-49

验证发现,确实setWindowOpacity内部做出了处理,但是实际开发当中,还是建议加上,出于于“防御性编程”的角度考虑,double check

cursor

修改鼠标光标的样式,指向不同控件,有不同效果

API说明
cursor()获取当前widget的cursor属性,返回QCursor对象
当鼠标悬停在该widget上时,就会回显出对应的形状
setCursor(const QCursor& cursor)设置该widget光标的形状,仅在鼠标停留在该widget上时生效
QGuiApplication::setOverrideCursor(const QCursor& cursor)设置全局光标的形状,对整个程序中所以的widget都会生效
覆盖上面的setCurosr设置的内容

可以通过图形化界面的方式直接设置:

image-20240907161956410

通过代码方式:

#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;
}

GIF 2024-9-7 16-22-56

这些都是Qt内置的光标形状:

image-20240907162403470

这些内置的光标图片,看着稍微有点古老,Qt允许我们通过自定义图片来设置光标。

和设置窗口图标操作相似,准备好图片,然后导入到qrc文件

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//访问图片文件QPixmap pixmap(":/ikun.png");//构造光标对象//图片左上角为原点, 找到10,10这个位置,为鼠标真正点击的位置QCursor cursor(pixmap, 10, 10);//设置光标this->setCursor(cursor);
}Widget::~Widget()
{delete ui;
}

如果图片太大/小,可采用QPixmap通过的scaled函数,对图片进行缩放

QPixmap pixmap(":/ikun.png");
pixmap = pixmap.scaled(50, 50);

GIF 2024-9-7 16-45-03

光标网站推荐:iconfont-阿里巴巴矢量图标库

font

API说明
font()获取当前widget的字体信息,返回QFont对象
setFont(const QFont& font)设置当前widget的字体信息

关于QFont:

属性说明
family字体家族
例如“楷体”、“宋体”、“微软雅黑”等
pointSize字体大小
weight字体粗细
以数值方式表示粗细程度,取值范围为[0, 99],数值越大,越粗
bold是否加粗
设置为true,相当于weight为75;设置为false,相当于weight为50
italic是否倾斜
underline是否带下划线
strikeOut是否带删除线

上述属性具体怎么设置,在实际开发中,会有专门的美工/设计/UED来确定

可以通过图形化设置:

image-20240907171924841

这样修改很方便,但是不够灵活,因为程序运行的时候,可能需要修改字体,这时候就需要代码来操作了

代码设置:

#include "widget.h"
#include "ui_widget.h"
#include<QLabel>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);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);//设置进label当中label->setFont(font);
}Widget::~Widget()
{delete ui;
}

image-20240907172612498

toolTip

一个GUI程序,界面比较复制,各种控件比较多,这些控件具体是干嘛的,可能就不是很清楚。

toolTip机制就可以当把鼠标悬停到这个控件的时候,就会弹出提示。

API说明
setToolTip设置toolTip
鼠标悬停在该widget上时,会有提示说明
setToolTipDuring设置toolTip提示时间,单位ms
时间到之后toolTip自动消失

图形化界面设置:

image-20240907173345762

代码设置:

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->pushButton_yes->setToolTip("这是yes按钮");ui->pushButton_yes->setToolTipDuration(3000);ui->pushButton_no->setToolTip("这是no按钮");ui->pushButton_no->setToolTipDuration(3000);
}Widget::~Widget()
{delete ui;
}

image-20240907173734589

focusPolicy

设置控件获取焦点的策略

所谓的“焦点”,指的就是能选中这个元素,接下来的操作,都在针对该焦点元素进行的。

例如点击一个文本框,接下来键盘输入的内容,都是针对这个文本框的

一般来说,获取控件焦点主要通过2种方式:

  1. 鼠标点击
  2. 键盘tab

Qt通过了api,可以控制获取焦点的行为

API说明
focusPolicy()获取该widget的focusPolicy
返回Qt::FocusPolicy
setFocusPolicy(Qt::FocusPolicy)设置widget的focusPolicy

Qt::FocusPolicy是⼀个枚举类型,取值如下:

  • Qt::NoFocus:控件不会接收键盘焦点
  • Qt::TabFocus:控件可以通过Tab键接收焦点
  • Qt::ClickFocus:控件在⿏标点击时接收焦点
  • Qt::StrongFocus:控件可以通过Tab键和⿏标点击接收焦点 (默认值)
  • Qt::WheelFocus: 类似于 Qt::StrongFocus , 同时控件也通过⿏标滚轮获取到焦点 (新增的选项, ⼀般很少使⽤).

通过图形化设置的,默认就是StrongFocus

GIF 2024-9-7 17-54-54

这里就可以修改:

image-20240907175642545

styleSheet

这个叫做样式标,通过CSS设置widget的样式

CSS:层叠样式表,在前端当中,设置网页样式的方式。Qt参考CSS,弄了自己的一套QSS

样式:描述界面具体是什么样子

image-20240907180740844

通过代码实现日间、夜间模式的切换:

#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;");}

GIF 2024-9-7 18-23-14

这个恢复成日间模式,和原始的不一样

计算机当中的颜色表示用RGB表示,一般并不会直接用whitered这些直接表示

我们可以采用取色器(截图或者画图板),获取当前的颜色:

image-20240907182838659

然后设置进去即可:

image-20240907183052405


http://www.ppmy.cn/news/1522493.html

相关文章

文件包含PHP伪协议利用方法

1.file://协议 使⽤&#xff1a; file:// ⽂件的绝对路径和⽂件名 2.php?cmdfile://D:\phpstudy_pro\WWW\123.txt 2.php://filter协议 ⽤途&#xff1a;常⽤于读取⽂件 / 源码 2.php?cmdphp://filter/readconvert.base64-encode/resource1.php 3.php://input协议 步骤一&…

【C++拓展(一)】后端开发常用的技术栈

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; C拓展 1. 前言2. 语言层面3. 设计模式层面4. 开…

「Qt Widget中文示例指南」如何实现一个系统托盘图标?(一)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 System Tray Icon&a…

基础学习之——Apache Spark

Apache Spark是一种开源的大数据处理框架&#xff0c;它提供了快速、通用和可扩展的大数据分析和处理功能。Spark可以在大规模数据集上进行高速计算&#xff0c;并且可以与多种数据源和工具进行集成。 Spark的基本概念包括&#xff1a; 弹性分布式数据集&#xff08;Resilient…

【LeetCode 121】买卖股票的最佳时机

1. 题目 2. 分析 如果当前的价格比之前买入的价格要低&#xff0c;那么我们就“逢低买入”&#xff0c;更新买入的价格&#xff0c;因为在此后的每一天里&#xff0c;当前的价格与之前的买入价格相比是更优解。 如果读者对单调队列有接触&#xff0c;可以看到这一步的核心思想…

iOS P8证书推送测试

最近在配合服务端人员调试相关的 APNS auth key 推送的问题&#xff0c;相比于苹果的P12证书的推送&#xff0c;P8证书的推送显得方便很多&#xff0c;P8的优势在于简单&#xff0c;安全 容易生成 最重要的是不会过期。 现在我们来看下测试具体流程&#xff1a; 方法一 地址…

掌握Hive函数[1]:从基础到高级应用

目录 函数简介 单行函数 算术运算函数 数值函数 字符串函数 日期函数 流程控制函数 集合函数 案例演示 函数简介 Hive将常用的逻辑封装成函数供用户使用&#xff0c;类似于Java中的函数。这样做的好处是可以避免用户反复编写相同的逻辑代码&#xff0c;可以直接调用这些函数。…

2024 RustChinaConf 赞助商介绍

2024 RustChinaConf 得到了行业各界的广泛支持&#xff0c;在此向以下赞助商表示感谢&#xff01; 非凸科技 非凸科技是一家全栈使用Rust的金融科技公司&#xff0c;致力于为券商、私募、公募等金融机构及个人投资者提供一站式数智交易领域服务解决方案。作为本次大会的钻石赞助…

jmeter之ForEach控制器使用

ForEach控制器作用&#xff1a; 一般和用户自定义变量或者正则表达式提取器配合使用&#xff0c;读取返回结果中一系列相关的变量值&#xff0c;该控制器下的取样器都会被执行一次或多次&#xff0c;每次读取不同的变量值(类似python当中的for语句,用来遍历操作) 本节代码已上…

币安/欧易合约对冲APP系统开发

币安合约对冲系统开发是一个复杂且专业的过程&#xff0c;它涉及到多个方面的技术和策略。以下是对币安合约对冲系统开发的一个概述&#xff1a; 一、系统概述 币安合约对冲系统是一种利用币安交易所提供的合约交易功能&#xff0c;通过同时建立多头和空头仓位来减少或消除市…

hutool 集合相关交集、差集

开发过程中会遇到集合之间的对比之类的需求&#xff0c;之前经常会自己写个工具类来实现&#xff0c;目前hutool可以帮助我们解决很多问题&#xff0c;接下来我们就来实践下。 相关jar包 <dependency><groupId>cn.hutool</groupId><artifactId>hutool…

Python办公自动化案例

文章目录 系列文章办公自动化案例案例1&#xff1a;批量重命名文件案例2&#xff1a;Excel数据自动筛选案例3&#xff1a;PDF文件合并案例4&#xff1a;批量发送电子邮件案例5&#xff1a;日程安排提醒案例6&#xff1a;CSV文件数据统计案例7&#xff1a;Word文档生成案例8&…

Day18_0.1基础学习MATLAB学习小技巧总结(18)——MATLAB绘图篇(1)

利用空闲时间把碎片化的MATLAB知识重新系统的学习一遍&#xff0c;为了在这个过程中加深印象&#xff0c;也为了能够有所足迹&#xff0c;我会把自己的学习总结发在专栏中&#xff0c;以便学习交流。 参考书目&#xff1a;《MATLAB基础教程 (第三版) (薛山)》 之前的章节都是…

前端vue项目服务器部署(docker)

前端vue项目服务器部署(docker) 步骤 1: 导入 Nginx Docker 镜像 1、上传 Nginx Docker 镜像 将你的nginx-alpine.tar包上传到服务器上。假设路径为 /var/v3-admin-vite/nginx-alpine.tar。 scp -r "C:\Users\86184\Desktop\v3-admin-vite" root110.40.179.182:/…

第十五届蓝桥杯 Python 省赛题目及解析

第十五届蓝桥杯 Python 省赛题目及解析 选择题 1. 运行下面程序&#xff0c;输出的结果是&#xff08;&#xff09;。 s ‘py’ print(‘t’.join(s)) A、tpyB、ptyC、tptyD、tptyt 正确答案&#xff1a;B 答案解析&#xff1a; join() 方法是字符串的一个方法&#xff0c;…

数据分析 设备一个月以来的参数变化

1数据预处理 import pandas as pd import glob import os# 读取所有CSV文件并合并为一个DataFrame path path_to_your_csv_files/ # CSV文件的文件夹路径 all_files glob.glob(os.path.join(path, "*.csv"))df_list [] for file in all_files:df pd.read_csv(f…

FPGA进阶教程16 同一块FPGA的两个网口实现arp自通信

本项目使用同一个FPGA的两个网口进行千兆以太网的arp自动绑定 目的是为了以后实现两个FPGA之间进行以太网数据的交互 起因:最近公司画了一块板子,上面有两个网口,市面上常见的项目都是将FPGA与PC端实现arp的自动绑定和UDP数据的回环,很少实现两块FPGA之间的以太网数据通信…

网络学习-eNSP配置ACL

AR1路由器配置 <Huawei>system-view Enter system view, return user view with CtrlZ. [Huawei]undo info-center enable Info: Information center is disabled. [Huawei]interface gigabitethernet 0/0/0 [Huawei-GigabitEthernet0/0/0]ip address 192.168.2.254 24 …

chunk-vendors.js 文件过大导致页面加载缓慢解决方案

1、路由懒加载 在 Webpack 中&#xff0c;我们可以使用动态 import语法来定义代码分块点 (split point)&#xff1a; import(./Foo.vue) // 返回 Promise如果您使用的是 Babel&#xff0c;你将需要添加 syntax-dynamic-import 插件&#xff0c;才能使 Babel 可以正确地解析语…

Unity制作更换字体的插件

目录 1.前置知识 1.1 EditorWindow 1&#xff09;目的 2&#xff09;使用方式 1.2 OnGUI() 1&#xff09;目的 2&#xff09;使用方式 1.3 AssetDatabase 1&#xff09;目的 2&#xff09;使用方式 1.4 PrefabUtility 1&#xff09;目的 2&#xff09;使用方式 2…