Qt 窗口居中显示

Qt 窗口居中显示

  • 引言
  • 一、窗体的setGeometry函数
  • 二、计算屏幕中心然后move
  • 三、借助QRect计算
  • 四、补充知识点

引言

窗口居中可以提供良好的视觉效果、突出重点内容、提升用户导航和操作的便利性,有助于改善用户体验。

  • Qt一般情况下,其Mainwindow或弹出的窗口默认就是居中的,但是也有特殊情况:这就需要将窗口移动到屏幕中心. 以下介绍几种常用的居中方式(大同小异):

一、窗体的setGeometry函数

setGeometry()可以调整窗口的QRect (位置和大小),调用QStyle::alignedRect可直接返回计算好的窗体相对屏幕居中的QRect,例程如下:

需要注意不要在resizeEvent() or moveEvent()调用setGeometry()函数,会导致无线循环

#include "mainwindow.h"
#include <QApplication>
#include <QStyle>
#include <QScreen>

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

    QWidget w;
    w.setGeometry(QStyle::alignedRect(Qt::LeftToRight, Qt::AlignCenter,
                                       w.size(),
                                       QGuiApplication::primaryScreen()->geometry()));
    w.show();

    return a.exec();
}

二、计算屏幕中心然后move

先获取屏幕的大小以及窗体的大小,然后手动计算窗口居中位置,使用move移动. 例程如下:

可参考 QT设置弹窗显示屏幕中央:https://blog.csdn.net/weixin_40921238/article/details/133378912

#include "mainwindow.h"
#include <QApplication>
#include <QStyle>
#include <QScreen>

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

    QWidget w;

    // 获取屏幕的几何信息
    QRect screenRect = QGuiApplication::primaryScreen()->geometry();

    // 计算弹窗的中心位置
    int x = (screenRect.width() - w.width()) / 2;
    int y = (screenRect.height() - w.height()) / 2;

    // 设置弹窗的位置
    w.move(x, y);

    w.show();
    return a.exec();
}

三、借助QRect计算

借助QRect计算窗体和屏幕中心的位置偏移,然后进行移动.

可参考
Qt窗口的居中显示:https://www.bilibili.com/read/cv26794535/?jump_opus=1
Qt窗口屏幕居中显示:https://www.cnblogs.com/qq78292959/archive/2012/08/25/2655963.html

#include "mainwindow.h"
#include <QApplication>
#include <QStyle>
#include <QScreen>

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

    QWidget w;

    // 获取屏幕的几何信息
    QRect screenRect = QGuiApplication::primaryScreen()->geometry();

    // 计算居中位置
    int x = (screenRect.width() - w.width()) / 2;
    int y = (screenRect.height() - w.height()) / 2;
    QPoint centerPoint = screenRect.center() - w.geometry().center();

    // 设置弹窗的位置
    w.move(w.pos() + centerPoint);

    w.show();
    return a.exec();
}

四、补充知识点

    1. 关于showmove,可以先move然后再show窗口就不会闪烁.
    1. Qt推荐使用 QGuiApplication替代QApplication::desktop() 一般用QGuiApplication::primaryScreen()足以
      QGuiApplication::screens()可以获取所有屏幕. 遍历代码如下:
QList<QScreen *> screens = QGuiApplication::screens();
foreach (QScreen *screen, screens) {
    qDebug() << "Screen geometry: " << screen->geometry();
    qDebug() << "Screen available geometry: " << screen->availableGeometry();
    qDebug() << "Screen logical DPI: " << screen->logicalDotsPerInch();
    qDebug() << "Screen physical DPI: " << screen->physicalDotsPerInch();
    qDebug() << "Screen scale factor: " << screen->devicePixelRatio();
}
    1. QRect简述
      QRect类使用整数精度定义平面中的矩形,通常表示为左上角(top() and left())和大小(width() and height())。
      在这里插入图片描述

由于历史原因,bottom()和right()函数返回的值偏离了矩形的真正右下角:right返回left+width-1,bottome返回top+height-1。bottomRight函数返回的点也是如此。
建议使用x+width和y+height来找到真正的右下角,并避免使用right和bottom。另一种解决方案是使用QRectF:QRectF类使用坐标的浮点精度定义平面中的矩形,并且QRectF::right和QRectF::bottom函数确实返回右坐标和底坐标。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python调用excel的demo

在本地安装Pycharm之后&#xff0c;新建工程&#xff0c;在main.py中键入如下代码,即可实现Python调用excel&#xff1a; import pandas as pd sheet pd.read_excel(test.xlsx) data sheet.loc[0].values print("读取指定行的数据:\n{0}".format(data)) 第一次编…

传统的老程序员转向人工智能需要准备好这三件事情,你知道吗?

前言 人类文明的进步有时候快的吓人&#xff0c;在我们父辈上街买菜还是以一毛为计量买菜的时代&#xff0c;其实过去了也没有多长时间。现在买菜接近10块为准了&#xff0c;正常在集市上喊着怎么卖&#xff1f;摊主喊着三斤&#xff0c;包含的意思是10块钱三斤。相隔这么多年…

MyEclipse中properties文件中文乱码(Unicode字符)解决办法

程序代码园发文地址&#xff1a;MyEclipse中properties文件中文乱码&#xff08;Unicode字符&#xff09;解决办法-程序代码园小说,Java,HTML,Java小工具,程序代码园,http://www.byqws.com/ ,MyEclipse中properties文件中文乱码&#xff08;Unicode字符&#xff09;解决办法htt…

TMC5160步进电机驱动芯片

TMC5160步进电机驱动芯片 特点和优势静止态自动降电流stealthChop2 & spreadCycle 驱动stealthChop2 & spreadCycle 驱动1.7 stallGuard2 – 机械负载传感1.8 coolStep –负载自适应电流控制1.9 dcStep –负载相关速度控制1.10 编码器接口 TMC5160工作模式模式 1&#…

【Pytorch】深入Pytorch模型的训练、log、可视化

文章目录 模型训练的模板综合案例-Pytorch 官网demo优化记录日志解析日志增加tensorboard数据记录保存训练曲线模型参数可视化增加wandb数据记录模型训练的模板 综合案例-Pytorch 官网demo pytorch 官网tutorial-quickstart https://blog.csdn.net/weixin_39107270/article/de…

Day30 登录界面设计

​ 本章节,实现了登录界面窗口设计 一.准备登录界面图片素材(透明背景图片) 把准备好的图片放在 Images 文件夹下面,格式分别是 .png和 .icoico 图片,右键属性,生成操作选 内容 png 图片,右键属性,生成操作选 资源 选中 login.png图片鼠标右键,选择属性。生成的操作选…

[学习笔记]知乎文章-PyTorch的Transformer

参考资料&#xff1a; PyTorch的Transformer register_buffer的作用是&#xff1a;登记成员变量&#xff0c;它会自动成为模型中的参数&#xff0c;随着模型移动&#xff08;gpu/cpu&#xff09;而移动&#xff0c;但是不会随着梯度进行更新。 参考资料&#xff1a;【Torch API…

Vue3-Vite-ts 前端生成拓扑图vis,复制即用

完整代码&#xff0c;复制即可用&#xff0c;样式自调 试过 jointjs dagre-d3 vis&#xff0c;好用一点&#xff0c;可添加同层的双向箭头 方法1&#xff1a;Vis.js npm install vis-network <template><div id"mynetwork" class"myChart" :st…

C++11:列表初始化 初始化列表initializer_list

前言 2003年C标准委员会曾经提交了一份技术勘误表&#xff08;简称TC1&#xff09;&#xff0c;使得C03这个名字取代了C98成为了C11前最新的C标准名称。不过由于C03主要是对C98标准中的漏洞进行修复&#xff0c;语言的核心部分则没有改动&#xff0c;因此人们习惯性的把两个标准…

HiveQL性能调优-概览

一、铺垫 1、HiveQL 在执行时会转化为各种计算引擎的能够运行的算子&#xff0c;这里以mr引擎为切入点&#xff0c;要想让HiveQL 的效率更高&#xff0c;就要理解HiveQL 是如何转化为MapReduce任务的 2、hive是基于hadoop的&#xff0c;分布式引擎采用mr、spark、tze&#x…

游戏《酒店业领袖》

为快餐连锁店麦当劳&#xff0c;我们创建了一款名为“好客领袖”的游戏。麦当劳的员工可以在网站上注册&#xff0c;并测试自己是否扮演酒店领导的角色&#xff0c;在餐厅可能出现的各种情况下快速做出决定。奖品等待着那些在比赛中表现最好的人。 对于该项目&#xff0c;我们&…

反转链表的三种方法--面试必考(图例超详细解析,小白一看就会!!!)

目录 一、前言 二、题目描述 三、解题方法 ⭐ 头插法 --- 创建新的链表 ⭐ 迭代法 --- 三指针 ⭐ 递归法 四、总结与提炼 五、共勉 一、前言 反转链表这道题&#xff0c;可以说是--链表专题--&#xff0c;最经典的一道题&#xff0c;也是在面试中频率最高的一道题目&…

在编程Python的时候发生ModuleNotFoundError: No module named distutils报错怎么办

1.先查看Python版本 首先我们先去打开终端就是先widr再输入cmd 然后进去在输入Python -V要注意大小写 我的版本是3.9.7版本但是我使用的PyCharm 是 2021.1.1 x64版本没有办法主动去识别因为这个版太低了你的Python版本很高所以无法识别 2.解决方法 只需要把你的Python现版…

矩阵链相乘(动态规划法)

问题分析 矩阵链相乘问题是一个经典的动态规划问题。给定一系列矩阵&#xff0c;目标是找到一种最优的乘法顺序&#xff0c;使得所有矩阵相乘所需的标量乘法次数最少。矩阵链相乘问题的关键在于利用动态规划来避免重复计算子问题。 算法设计 定义子问题&#xff1a;设 &…

作业6.6

练习1:用预处理指令#define声明一个常数&#xff0c;用于表明1年有多少秒?(不需要考虑润年) #define SECONDS_PER_YEAR (365 * 24 * 60 * 60) 练习2:如何判断一个数是unsigned格式 如果一个数是unsigned类型的&#xff0c;那么它总是大于等于0。因此&#xff0c;可以通过判断一…

Kruskal算法求最小生成树

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> #define MAX 100 #define NO INT_MAX//NO表示没有边&#xff0c;相当于INFtypedef struct Graph {int arcnum;int vexnum;char vextex[MAX][20];int martrix[MAX][MA…

使用node将页面转为pdf?(puppeteer实现)

本文章适合win系统下实验&#xff08;linux&#xff0c;mac可能会出现些莫名其妙的bug我也不会解决&#xff09; 具体过程 首先了解什么时无头浏览器启动无头浏览器打开指定的url页面设置导出pdf格式开始转化完整基础代码 首先了解什么时无头浏览器 没有界面的浏览器下载pupp…

SLC Flash SD芯片:高性能存储的优选

SLC Flash SD芯片是一种采用单阶存储单元&#xff08;SingleLevel Cell&#xff0c;SLC&#xff09;技术的Secure Digital&#xff08;SD&#xff09;存储卡。SLC技术以其快速的传输速度、低功耗和较长的存储单元寿命而闻名。 MK米客方德 SLC Flash的优势 1. 快速的传输速度&a…

如何确定一段文字的语言?(语种识别模型推荐)

个人用下来&#xff0c;感觉fasttext很好用&#xff0c;相对比较准确。 https://pypi.org/project/fasttext-langdetect/

太阳能语音警示杆在户外的应用及其作用

一、太阳能语音警示杆的主要应用领域 交通管理&#xff1a;在城市道路、乡村公路、高速公路等交通要道&#xff0c;太阳能语音警示杆可以用于提醒驾驶员注意前方路况、减速慢行或者避让施工区域。例如&#xff0c;在临时施工路段&#xff0c;警示杆可以播放“前方施工&#xf…