(10)QWidget的使用(one)

news2025/1/18 11:44:06

目录

QWidget的大小和位置

获取QWidget的大小和位置

设置QWidget的大小和位置

设置窗口固定大小

限定窗口的大小 

坐标系统转换

内容边距

鼠标指针

鼠标指针的形状

自定义光标的使用

获取和设置光标的坐标


        QWidget类是所有可视控件的基类,控件是用户界面的最小元素,用于接受各种事件(如:鼠标、键盘等)并且绘制出来给用户观看。每个控件都是矩形的,他们按照Z轴顺序排列。如果控件没有父控件,则称之为窗口,窗口会被一个框架包裹(包含标题栏,边框等),可以通过某些函数来修改边框属性。

QWidget的大小和位置

获取QWidget的大小和位置

#include <QApplication>
#include <QWidget>
#include <QDebug>

int main(int argc, char* argv[]) 
{
	QApplication a(argc, argv);

	QWidget w;		//	创建窗口
	w.show();		//	显示窗口

	//获取窗口大小与位置
	qInfo() << w.pos() << w.x() << w.y();
	qInfo() << w.size() << w.width() << w.height();
	//获取窗口几何
	qInfo() << w.geometry() << w.frameGeometry();	//  不带边框与带边框
	qInfo() << w.frameSize();						//  带边框的大小
	qInfo() << w.rect();							//  内部矩形(客户区)大小

	return a.exec();
}

第一行输出指的是窗口的全局坐标

第二行输出指的是客户区的大小(不包括边框)

第三行输出的是窗口客户区的全局坐标和大小(前者不带边框,后者带边框)

第四行输出的是带边框的窗口的大小

第五行输出的是窗口客户区相对于窗口的坐标以及客户区大小(不带边框)

设置QWidget的大小和位置

//移动窗口的位置(包括边框)
void move(const QPoint &)
void move(int x, int y)

//设置窗口的大小(不包括边框)
void resize(int w, int h)
void resize(const QSize &)

//设置窗口的大小和位置 (不包括边框,以客户区坐标为准)   
void setGeometry(const QRect &)
void setGeometry(int x, int y, int w, int h)  

设置窗口固定大小

//不包括边框,设置的是客户区大小且不可拖动缩放窗口大小
void setFixedSize(const QSize &s)
void setFixedSize(int w, int h) 

限定窗口的大小 

//限定窗口的最大大小(不包括边框)
void setMaximumWidth(int maxw) 
void setMaximumHeight(int maxh)
void setMaximumSize(const QSize &)
void setMaximumSize(int maxw, int maxh)

//限定窗口的最小大小(不包括边框)
void setMinimumWidth(int minw)
void setMinimumHeight(int minh)
void setMinimumSize(const QSize &)
void setMinimumSize(int minw, int minh)

坐标系统转换

QPoint mapFrom(const QWidget *parent, const QPoint &pos) const
QPoint mapFromGlobal(const QPoint &pos) const
QPoint mapFromParent(const QPoint &pos) const

QPoint mapTo(const QWidget *parent, const QPoint &pos) const
QPoint mapToGlobal(const QPoint &pos) const
QPoint mapToParent(const QPoint &pos) const
  • 这几个函数都是转换相对坐标系用的. 用另一个坐标系统的坐标值, 来表达当前坐标系统中某个坐标所指向的某个点,

  • 相对坐标:获取自己相对于父控件的位置 QWidget::pos()

  • 绝对坐标:将当前控件的相对位置转换为屏幕绝对位置 QWidget::mapToGlobal()

  • 绝对坐标转为相对坐标:将屏幕绝对位置对应到控件的相对位置 QWidget::mapFromGlobal()

#include <QApplication>
#include <QWidget>
#include <QDebug>

int main(int argc, char* argv[]) 
{
	QApplication a(argc, argv);

	QWidget w;											//	创建窗口
	w.resize(640, 480);

	auto w1 = new QWidget(&w);
	w1->setGeometry(100, 100, 100, 100);
	w1->setStyleSheet("background-color:red");			//	设置w1背景色为red

	auto w2 = new QWidget(w1);
	w2->setGeometry(20, 20, 60, 60);
	w2->setStyleSheet("background-color:deepskyblue");	

	w.show();											//	显示窗口

	//1. 求w1的50,50位置在父控件上的坐标
	qInfo() << w1->mapToParent(QPoint(50, 50));			//	150,150
	//2. 求w的120,120在子控件w1上面的坐标
	qInfo() << w1->mapFromParent(QPoint(120, 120));		//	20,20

	//3. 求w2的0,0位置在w上的坐标
	qInfo() << w2->mapTo(&w, QPoint(0, 0));				// 120,120
	//4. 求w上的130,130在w2上的坐标
	qInfo() << w2->mapFrom(&w, QPoint(130, 130));		// 10,10

	//5. 求全局坐标500,286在w上的坐标
	qInfo() << w.mapFromGlobal(QPoint(500, 286));		// 100,100
	//6. 求w的0,0位置的全局坐标
	qInfo() << w.mapToGlobal(QPoint(0, 0));				// 400,186
	
	return a.exec();
}

内容边距

        设置小部件内容周围的空白,使其具有左、上、右和下的大小。边距被布局系统使用,并且可以被子类用来指定要绘制的区域。

int main(int argc, char* argv[]) 
{
	QApplication a(argc, argv);

	QWidget w;											//	创建窗口
	w.resize(640, 480);

	//原来的效果
	auto label = new QLabel("人狠话不多", &w);
	label->resize(200, 200);
	label->setStyleSheet("background-color:green");

	//设置内容边距后的效果
	auto label2 = new QLabel("人狠话不多", &w);
	label2->move(label->x() + label->width(), 0);
	label2->resize(200, 200);
	label2->setStyleSheet("background-color:deepskyblue");
	label2->setContentsMargins(120, 150, 0, 0);

	w.show();											//	显示窗口

	qInfo() << label2->contentsRect()					//	去掉外边距的内容矩形
		<< label2->contentsMargins();					//	内容边距
	
	return a.exec();
}

鼠标指针

鼠标指针的形状

        如果要全局设置鼠标光标样式,可以使用QGuiApplication::setOverrideCursor(), 设置鼠标指针的形状需要使用QCursor类,通过像素图或枚举指定鼠标光标形状。

QCursor cursor() const
void setCursor(const QCursor &)
void unsetCursor()

Qt中自带的鼠标指针形状在枚举Qt::CursorShape中

直接使用setCursor()函数设置即可

int main(int argc, char* argv[]) 
{
	QApplication a(argc, argv);

	QWidget w;											//	创建窗口
	w.resize(640, 480);

	w.setCursor(QCursor(Qt::PointingHandCursor));		//	设置光标样式

	w.show();											//	显示窗口
	
	return a.exec();
}

点击按钮切换光标样式的案例

int main(int argc, char* argv[]) 
{
	QApplication a(argc, argv);

	QWidget w;											//	创建窗口
	w.resize(640, 480);

	auto btn = new QPushButton("切换光标样式", &w);

	QObject::connect(btn, &QPushButton::clicked, [&]()
		{
			static int i = 0;
			w.setCursor(QCursor(Qt::CursorShape(i)));
			i = (i + 1) % 22;
		});

	w.show();											//	显示窗口
	
	return a.exec();
}

自定义光标的使用

 QCursor(const QPixmap &pixmap, int hotX = -1, int hotY = -1)
 QCursor(const QBitmap &bitmap, const QBitmap &mask, int hotX = -1, int hotY = -1)
 QCursor(Qt::CursorShape shape)
int main(int argc, char* argv[]) 
{
	QApplication a(argc, argv);

	QWidget w;											//	创建窗口
	w.resize(640, 480);

	auto btn = new QPushButton("Button", &w);

	QPixmap map = QPixmap("cursor.png");
	map = map.scaled(30, 30);           //  将图片缩放到(30,30)大小
	w.setCursor(QCursor(map, 0, 0));	//	0,0表示将焦点放到图片(0,0)的位置

	w.show();											//	显示窗口
	
	return a.exec();
}

 

可能会出现的error:

QPixmap::scaled: Pixmap is a null pixmap
QCursor: Cannot create bitmap cursor; invalid bitmap(s) 

这是因为图片没有在指定路径下找到,将图片放到项目的Debug目录下与exe文件同级目录即可。

获取和设置光标的坐标

[static] QPoint pos()
[static] QPoint pos(const QScreen *screen)

[static] void setPos(int x, int y)
[static] void setPos(QScreen *screen, int x, int y)
[static] void setPos(const QPoint &p)
[static] void setPos(QScreen *screen, const QPoint &p)
qInfo() << QCursor::pos();	//  获取光标的全局坐标
QCursor::setPos(0, 0);		//	将光标设置到全局(0,0)的位置

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/161823.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C进阶】内存函数

家人们欢迎来到小姜的世界&#xff0c;<<点此>>传送门 这里有详细的关于C/C/Linux等的解析课程&#xff0c;家人们赶紧冲鸭&#xff01;&#xff01;&#xff01; 客官&#xff0c;码字不易&#xff0c;来个三连支持一下吧&#xff01;&#xff01;&#xff01;关注…

Spring知识点记录

Spring知识点1. Spring简介&#xff08;此章略过&#xff09;1.1 Spring概述1.2 Spring家族1.3 Spring Framework2. IOC2.1 IOC容器2.2 基于XML管理bean2.2.1 入门案例&#xff08;ioc容器的整体思路&#xff09;2.2.2 获取bean的三种方式2.2.3 依赖注入2.2.3.1 setter注入2.2.…

指针数组与数组指针---傻傻分不清楚?

目录1.指针数组2.数组指针1.指针数组 什么是指针数组呢&#xff1f; 我们通过以前学过的数组进行类比&#xff1a; 整形数组是存放整形的数组字符数组是存放字符的数组所以&#xff0c;指针数组是存放指针(地址)的数组 整形数组的书写形式是int arr[10]&#xff0c;字符指针…

uniapp兼容小程序和H5遇见的坑

目录 一、报错 vue service.requestcomponentinfo:typeerror:cannot read property matches undefined H5不兼容uni-app的image标签 小程序externalClasses不兼容h5 H5不兼容van-picker和van-datetime-picker 一、报错 vue service.requestcomponentinfo:typeerror:cannot r…

【C语言进阶】 一篇带你掌握字符串和内存函数

目录一&#xff1a;strlen模拟实现&#xff1a;二&#xff1a;strcpy模拟实现&#xff1a;三&#xff1a;strcat模拟实现&#xff1a;四&#xff1a;strcmp模拟实现&#xff1a;五&#xff1a;strncpy模拟实现&#xff1a;六&#xff1a;strncat模拟实现&#xff1a;七&#xf…

如何正确地连接PLC与7种设备的输入输出线路

正确地连接输入和输出线路&#xff0c;是保证PLC可靠工作的前提。想要正确地连接PLC与7种设备的输入输出线路&#xff0c;就需注意以下几个方面&#xff1a;1.PLC与主令电器类设备的连接下图是PLC与按钮、行程开关、转换开关等主令电器类输入设备的接线示意图。图中的PLC为直流…

3、运算符

目录 一、算数运算符 二、关系运算符 三、逻辑运算符 一、算数运算符 MATLAB中的算术运算符有加、减、乘、除、点乘、点除等&#xff0c;其运算法则表&#xff1a; 示例1&#xff1a;数值与矩阵的算术运算 Aeye(2)Bones(2)CA*BDA.*B 运行结果&#xff1a; 此外&#xff0…

25.数组指针取*,指针和函数的关系,指针作为函数的参数

数组指针取* 数组指针取*&#xff0c;并不是取值的意思&#xff0c;而是指针的类型发生变化&#xff1b; 一维数组指针取*&#xff0c;结果为它指向的一维数组第0个元素的地址&#xff0c;它们还是指向同一个地方。二维数组指针取*&#xff0c;结果为一维数组指针&#xff0c…

Excel实战 第1章 数据处理

目录1 数据规范2. 导入数据3. 数据清洗3.1 重复数据处理3.2 缺失数据处理3.3 空格数据处理1 数据规范 2. 导入数据 3. 数据清洗 3.1 重复数据处理 数据透视表法&#xff08;首选&#xff09; 选中A、B两列&#xff0c;点击【插入】–》【数据透视表】 把号码拉到【行】&…

LeetCode 207. 课程表

&#x1f308;&#x1f308;&#x1f604;&#x1f604; 欢迎来到茶色岛独家岛屿&#xff0c;本期将为大家揭晓LeetCode 207. 课程表&#xff0c;做好准备了么&#xff0c;那么开始吧。 &#x1f332;&#x1f332;&#x1f434;&#x1f434; 一、题目名称 LeetCode 207. …

图表控件LightningChart.NET 系列教程(六):许可证管理介绍(下)

LightningChart.NET SDK 是一款高性能数据可视化插件工具&#xff0c;由数据可视化软件组件和工具类组成&#xff0c;可支持基于 Windows 的用户界面框架&#xff08;Windows Presentation Foundation&#xff09;、Windows 通用应用平台&#xff08;Universal Windows Platfor…

Docker面试题(史上最全 + 持续更新)

专题37&#xff1a;Docker面试题&#xff08;史上最全、定期更新&#xff09; 本文版本说明&#xff1a;V26 《尼恩面试宝典》升级的规划为&#xff1a; 后续基本上&#xff0c;每一个月&#xff0c;都会发布一次&#xff0c;最新版本&#xff0c;可以联系构师尼恩获取&…

VALL-E:Neural Codec Language Models are Zero-Shot Text to Speech Synthesizers

文章目录NLP中Bert的进展历史word embeddingELMOGPTBertAudioLM: a Language Modeling Approach to Audio Generationabstractintrorelated workVALL-E:Neural Codec Language Models are Zero-Shot Text to Speech Synthesizersabstractspeech quantizationtraining:condition…

程序的机器级表示part2——访问信息

目录 1. 整数寄存器 2. 操作数指示符与寻址模式 3. 数据传送指令 4. 压入和弹出栈数据 1. 整数寄存器 一个x86-64的CPU包含一组16个存储64位值的通用目的寄存器(general-purpose registers) 整型寄存器x86-64的CPU是64位的&#xff0c;因此相应的寄存器长度与机器字长(数据…

基于matlab实现的水果识别系统+源码+代码注释

水果识别 摘要&#xff1a; 本项目针对多种常见水果混合的图像&#xff0c;利用 Matlab 软件&#xff0c;对水果的识别进行研究。根据水果和背景的差别选取阈值&#xff0c;对去噪增强对比度后的图像进行二值化处理。再对图像进行边缘检测&#xff0c;选定连通区域&#xff0…

仅需一个注解,实现springboot项目中的隐私数据脱敏

文章参考&#xff1a; 仅是为了方便查看&#xff0c;因此在此记录一下​​​​​​​ 目录 1. 创建隐私数据类型枚举&#xff1a;PrivacyTypeEnum 2. 创建自定义隐私注解&#xff1a;PrivacyEncrypt 3. 创建自定义序列化器&#xff1a;PrivacySerializer 4. 隐私数据隐藏工…

高德地图开发之地图配置及vue上初始化创建地图

开门见山地说&#xff0c;现如今地图相关的开发业务在工作中越来越常见&#xff0c;目前市面上主流的地图开发还是以百度和高德为主&#xff0c;今天就来讲一下高德地图的配置和在vue上的初始化创建&#xff0c;帮助大家更好更快的了解高德地图开发相关的内容。 一. 注册地图 …

Python协程的四种实现方式

今天继续给大家介绍Python关知识&#xff0c;本文主要内容是Python协程的四种实现方式。 一、yield关键字实现方式 以yield关键字方式实现协程代码如下所示&#xff1a; def fun1():yield 1yield from fun2()yield 2def fun2():yield 3yield 4f1fun1() for item in f1:print…

steam搬砖项目靠谱吗?怎么样?

Steam搬砖’通俗来讲&#xff1a;小白都可以轻松上手&#xff0c;不需要会玩游戏&#xff0c;项目就是利用低价美金充值卡&#xff0c;从国外Steam平台购买CS:GO游戏装备回来&#xff0c;在国内网易BUFF平台售卖&#xff0c;低买高卖&#xff0c;产生利润的一个项目 首先&…

javascript实现版本号自增打包vue写入版本号

文章目录Preface代码方法一&#xff1a;兼容多长版本号。如&#xff1a;1.0.0.0.0.0方法二&#xff1a;只针对3位版本号打包时写入版本号Preface 前段时间出差去帮忙别的项目&#xff0c;项目中有前端更新提醒用户更新。 更新提示是放在了axios请求中。 这个需求是别人做的&…