Qt 窗口的尺寸

news2024/9/20 18:40:06

本文通过多个案例,详细说明关于Qt窗体尺寸的一些重要问题

默认尺寸

对于一个Qt的窗口(继承于QWidget),获取其窗体尺寸的方法size();

以一个Qt创建Qt Widgets Application项目的默认生成代码为基础,做如下测试

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    qDebug()<<"MainWindow::MainWindow:"<<this->size();
    this->resize(1200,800);
    qDebug()<<"MainWindow::MainWindow:"<<this->size();
}

第一个this->size()输出QSize(640, 480),即MainWindow具有默认的尺寸640*480

第二个this->size()输出QSize(1200, 800)

实际上,继承于QWidget的控件,例如QPushButton,QLineEdit等也会获得默认的尺寸640*480

    QWidget* page=new QWidget;
    qDebug()<<".."<<page->size();
    QPushButton* btn=new QPushButton;
    qDebug()<<".."<<btn->size();
    QLineEdit* edt=new QLineEdit;
    qDebug()<<".."<<edt->size();

以上输出都是QSize(640, 480)

布局之后的尺寸
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    qDebug()<<"MainWindow::MainWindow:"<<this->size();
    this->resize(1200,800);
    QWidget* page=new QWidget;
    qDebug()<<".."<<page->size();
    QVBoxLayout* layout=new QVBoxLayout(page);
    QPushButton* btn=new QPushButton;
    qDebug()<<".."<<btn->size();
    QLineEdit* edt=new QLineEdit;
    qDebug()<<".."<<edt->size();

    layout->addWidget(btn);
    layout->addWidget(edt);

    this->setCentralWidget(page);

    qDebug()<<".."<<page->size();
    qDebug()<<".."<<btn->size();
    qDebug()<<".."<<edt->size();
    qDebug()<<"MainWindow::MainWindow:"<<this->size();
    //当界面显示出来之后,点击按钮查看控件尺寸
    connect(btn,&QPushButton::clicked,[=]{
        qDebug()<<".."<<page->size();
        qDebug()<<".."<<btn->size();
        qDebug()<<".."<<edt->size();
    });
}

以上代码this->setCentralWidget(page);之后的三个打印对应的尺寸应该是多少?

依然还是 QSize(640, 480)

而connect()方法中的三个打印对应的值则分别为

.. QSize(1200, 800)
.. QSize(1178, 28)
.. QSize(1178, 24)

以上代码说明两个问题:

(1)将控件加入到布局,然后放入了父窗体中,则控件的尺寸会根据父窗体的布局重新设置

(2)控件尺寸的重新设置发生在窗体显示出来后(绘制时)

 固定尺寸

 以下代码实现在主窗体上布局多个按钮和子窗体,实现点击按钮切换每个子窗体的隐藏和可见。

但是存在问题:

(1)4个子窗体平分了主窗体的尺寸;

(2)隐藏一个子窗体后,其他的子窗体尺寸被更改(窗体重绘时会重新设置尺寸)

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    qDebug()<<"MainWindow::MainWindow:"<<this->size();
    this->resize(1200,800);

    QWidget* page=new QWidget;
    QVBoxLayout* layout=new QVBoxLayout(page);

    QScrollArea* contentArea=new QScrollArea;
    contentArea->setWidgetResizable(true);
    contentArea->setWidget(page);

    for(int i=0;i<4;i++)
    {
        QWidget* p=new QWidget;
        //设置窗体背景色,使得区分背景,可见
        p->setStyleSheet("background-color:green");
        QPushButton* b=new QPushButton;
        layout->addWidget(b);
        layout->addWidget(p);
        connect(b,&QPushButton::clicked,[p]{
            //点击按钮后窗体切换显示和隐藏效果
            p->setVisible(!p->isVisible());
        });
    }
    this->setCentralWidget(contentArea);
}

如果需要设置子窗体在重绘时不改变尺寸,那么需要设置其尺寸

例如在QWidget* p=new QWidget;下方增加 p->setFixedHeight(300);

这样隐藏和显示一个子窗体不会对任意其他的子窗体的尺寸造成影响。

更改后会发现,当隐藏完所有的子窗体后,所有的按钮被均匀布局在了主窗体,如果想要的效果是按钮从主窗体从上往下紧密排列,可以在layout添加完所有的控件和窗口后,添加一个stretch,即在this->setCentralWidget(contentArea);上一行添加layout->addStretch();

窗体实际尺寸

如果MainWindow设置的高度为600,而它的中心窗体高度为800,该怎样显示?

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    qDebug()<<"MainWindow::MainWindow:"<<this->size();
    this->resize(800,600);
    qDebug()<<"MainWindow::MainWindow:"<<this->size();
    //默认情况下MainWindow没有centralWidget
    QWidget* center=new QWidget;
    qDebug()<<"center:"<<center->size();
    QVBoxLayout* layout=new QVBoxLayout(center);
    QWidget* page1=new QWidget;
    page1->setStyleSheet("background-color:green");
    page1->setFixedHeight(400);
    QWidget* page2=new QWidget;
    page2->setFixedHeight(400);
    page2->setStyleSheet("background-color:yellow");
    layout->addWidget(page1);
    layout->addWidget(page2);
    qDebug()<<"center:"<<center->size();
    this->setCentralWidget(center);
    //此时输出QSize(800, 600)
    qDebug()<<"MainWindow::MainWindow:"<<this->size();
}
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    qDebug()<<"w size:"<<w.size();
    return a.exec();
}

以上代码执行时,MainWindow构造函数中的输出mainwindow的窗体高度为600,但是在窗口显示(执行了w.show())之后,它的高度却是829

给窗体设置某个尺寸,实际显示的时候窗体根据布局,不一定恰好按照给定的尺寸来显示

尺寸不够引起重叠的窗体

如果主窗体设置了固定高度600,而它的中心窗体设置固定高度1200?

此时,肯定主窗体显示不全page1和page2

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    qDebug()<<"MainWindow::MainWindow:"<<this->size();
    this->resize(800,600);
    this->setFixedHeight(600);
    qDebug()<<"MainWindow::MainWindow:"<<this->size();
    //默认情况下MainWindow没有centralWidget
    QWidget* center=new QWidget;
    center->resize(800,500);
    qDebug()<<"center:"<<center->size();
    QVBoxLayout* layout=new QVBoxLayout(center);
    QWidget* page1=new QWidget;
    page1->setStyleSheet("background-color:green");
    page1->setFixedHeight(600);
    QWidget* page2=new QWidget;
    page2->setFixedHeight(600);
    page2->setStyleSheet("background-color:yellow");
    layout->addWidget(page1);
    layout->addWidget(page2);
    qDebug()<<"center:"<<center->size();
    this->setCentralWidget(center);
    //此时输出QSize(800, 600)
    qDebug()<<"MainWindow::MainWindow:"<<this->size();
    QTimer::singleShot(1000,[=](){
        //为什么page1和page2的高度是600,而实际显示的界面没有600?
        //事实上page1和page2的高度都是600,界面上也是600,但是page1和page2重叠了一部分
        qDebug()<<"page1:"<<page1->size();
        qDebug()<<"page2:"<<page2->size();
        qDebug()<<"center:"<<center->size();
        qDebug()<<"sizeHint:"<<layout->sizeHint();
        qDebug()<<"MainWindow::MainWindow:"<<this->size();
    });
}

这里输出了layout的sizeHit(),为1229,layout上放置了page1和page2,他们的高度600+600=1200,29是布局周边留下的空白部分。

最小高度限制

这里展示了一个实际项目中遇到的问题,需要在一个页面中放置多个表格,并且每个表格要直接显示至少5行,更多行的时候滚动条显示。

以下代码是从项目中抽取的问题特征部分:

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    this->resize(800,600);
    QWidget* page=new QWidget;
    QVBoxLayout* layout=new QVBoxLayout(page);

    QScrollArea* contentArea=new QScrollArea;
    contentArea->setWidgetResizable(true);
    contentArea->setWidget(page);

    for(int i=0;i<4;i++)
    {
        TableWidget* p=new TableWidget;
        QPushButton* b=new QPushButton;
        layout->addWidget(b);
        layout->addWidget(p);
        connect(b,&QPushButton::clicked,[p]{
            //点击按钮后窗体切换显示和隐藏效果
            p->setVisible(!p->isVisible());
            qDebug()<<"p size:"<<p->size();
        });
    }
    layout->addStretch();
    this->setCentralWidget(contentArea);
}

 TableWidget只是一个平凡的QTableWidget实例,它设置了默认表格有6行8列,

TableWidget::TableWidget()
{
    this->setRowCount(6);
    this->setColumnCount(8);
}

上述代码的效果:

目前的问题是每个表格高度都被挤压了,只显示了一行。

一种解决问题的思路是,在表格初始化时,设置最小高度限制:

TableWidget::TableWidget()
{
    this->setMinimumHeight(250);
    this->setRowCount(6);
    this->setColumnCount(8);
}

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

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

相关文章

安科瑞电能计量管理系统

安科瑞 崔丽洁 随着国家电网改革政策的逐步推进和落实&#xff0c;Acrel-3000WEB电能管理解决方案运用互联网和大数据技术&#xff0c;为电力运维公司提供电能管理解决方案。该平台作为连接运维单位和用电企业的纽带&#xff0c;全方面监视用户配电系统的运行状态和电量数据&am…

分享一款基于 AI 的 Chrome 插件

最近使用大模型比较多&#xff0c;公司虽然提供了免费的 ChatGPT 但是需要跳转特定页面才能访问&#xff0c;比较麻烦&#xff0c;于是就想到是否可以开发一款类似于有道词典一样的 Chrome 插件&#xff0c;可以在任意页面使用&#xff0c;虽然市面上也有类似的插件&#xff0c…

2023中国物流系统集成商百强榜研究报告(附下载)

随着智能物流建设的不断深入&#xff0c;企业应用了越来越多的自动化、智能化物流设备与管理软件。但各物流功能之间的效益背反问题如何解决? 各品牌与类型物流设备的接口各异如何统一调度? 各物流设备与管理软件之间的数据如联通传输? 乃至物流设备与生产设备、物流管理软…

如何新建一个一台交换机下连两个PC的拓扑

文章目录 1.效果如下1.新建一个空白拓扑页选择设备类型向工作区添加设备如何选择链接线如何使设备之间链接上启动设备 1.效果如下 1.新建一个空白拓扑页 选择设备类型 向工作区添加设备 如何选择链接线 如何使设备之间链接上 同理右侧设备也是这样链接的 启动设备 同理PC1和P…

nohup命令后台启动jar包

使用jps命令查看后台启动的进程 kill -9 218729 杀掉进程&#xff0c;如果没有启动过就不用了&#xff0c;忘了的话就会有两个jar的进程&#xff0c;都杀掉然后重新启动jar包然后进入到jar包对应的目录下使用nohup命令启动jar包 命令&#xff1a;nohup java -jar xxx.jar >c…

轻量级仿 SpringBoot=嵌入式 Tomcat+SpringMVC

SpringBoot 嵌入了 Web 容器如 Tomcat/Jetty/Undertow&#xff0c;——这是怎么做到的&#xff1f;我们以 Tomcat 为例子&#xff0c;尝试调用嵌入式 Tomcat。 为了说明如何打造轻量级的 SpringBoot&#xff0c;本文分为“嵌入式 Tomcat”、“增强 SpringMVC”和“打包/部署”…

LDO基础知识

LDO基础知识 线性稳压器基本上由输入IN、输出OUT、GND引脚所构成 可变线性稳压器则在输出增加输出电压的反馈&#xff08;feed back&#xff09;引脚 (通过分压电阻来进行调节输出电压的大小) LDO 线性稳压器内部电路如下图所示。 基本上由误差放大器&#xff08;误差检测用…

行情分析——加密货币市场大盘走势(10.25)

目前大饼继续上涨&#xff0c;还没有看到震荡盘整的迹象。从MACD日线来看&#xff0c;连续绿色实心柱已经10天。现在有点上涨无力了&#xff0c;而现在入场做空性价比更高&#xff0c;看反弹到33000-32000。如果谨慎点&#xff0c;可以继续等待。 以太目前来看和大饼一样那个也…

MySQL中的Base64函数

编码函数to_base64() select to_base64("123") 解码函数from_base64() select from_base64("MTIz")

leetcode:1662. 检查两个字符串数组是否相等(python3解法)

难度&#xff1a;简单 给你两个字符串数组 word1 和 word2 。如果两个数组表示的字符串相同&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 数组表示的字符串 是由数组中的所有元素 按顺序 连接形成的字符串。 示例 1&#xff1a; 输入&#xff1a;word1 […

AMS启动流程

本文均采用Android 14代码进行讲解&#xff0c;学习可以使用以下地址&#xff1a;Search 一、AMS启动流程 AMS的启动是在SyetemServer进程中启动的&#xff0c;从SyetemServer的main方法开始进入&#xff1a; 1.SystemServer.java main(String[] args) /*** The main entr…

Qt篇——子控件QLayoutItem与实际控件的强转

方法&#xff1a;使用qobject_cast<QLabel*>() &#xff0c;将通过itemAt(i)获取到的子控件(QLayoutItem)强转为子控件的实际类型(如QLineEdit、QLabel等)。 场景举例&#xff1a; QLabel *label qobject_cast<QLabel*>(ui->horizontalLayout_40->itemAt(0…

c#使用ExifLib库提取图像的相机型号、光圈、快门、iso、曝光时间、焦距信息等EXIF信息

近期公司组织了书画摄影比赛&#xff0c;本人作为摄影爱好者&#xff0c;平时也会拍些照片&#xff0c;这次比赛当然不能错过。为了提高获奖概率&#xff0c;选了19张图像作为参赛作品。但是&#xff0c;摄影作品要提交图像的光圈、曝光时间等参数。一两张还可以通过电脑自带软…

1024程序员节获奖名单公示~恭喜各位上榜同学

1024程序员节完美收官&#xff01; 恭喜各个分会场中奖的小伙伴~我们已于昨日的线下会场完成奖品及证书发放&#xff01; 更多优秀作品欢迎大家点击查看&#xff1a;卡奥斯开源社区 — 打造工业互联网顶级开源社区 颁奖典礼精彩回放&#xff1a;卡奥斯开源社区 — 打造工业互…

【ARM Coresight 系列文章 3.3 - ARM Coresight SWD 协议详细介绍】

文章目录 1.1 SWD 协议框图1.2 读/写时序及命令1.2.1 SWD 时序1.2.2 SWD 命令详情1.3 芯片探测1.3.1 获取芯片 ID1.4 读/写操作1.1 SWD 协议框图 SWD协议可以配置SoC内部几乎所有的寄存器。时钟信号由SWCLK 管脚输入,数据信号从SWDIO管脚输入输出。首先 HOST 对SW-DP 进行操作…

基于html5+javascript技术开发的房贷利率计算器

房贷计算器是一款专为购房者设计的实用工具应用&#xff0c;其主要功能是帮助用户详细计算房贷的还款金额、利息以及还款计划等。通过这款软件&#xff0c;用户可以更加便捷地了解到自己的还款情况和计划&#xff0c;从而更好地规划自己的财务。下面将对房贷计算器进行详细的介…

基于PHP的图像分享社交平台

有需要请加文章底部Q哦 可远程调试 基于PHP的图像分享社交平台 一 介绍 此图像分享社交平台基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。平台角色分为用户和管理员。用户可注册登录&#xff0c;发布图像&#xff0c;修改个人信息&#xff0c;评论图像…

家电翻页电子画册制作秘籍,轻松打造炫酷电子书!

在家电市场上&#xff0c;翻页电子画册已经成为了越来越多人的选择。它不仅具有传统纸质画册的优点&#xff0c;还具有更多的功能和特点&#xff0c;如翻页动画、音效等&#xff0c;让阅读变得更加有趣和生动。那么&#xff0c;如何制作一款炫酷的电子画册呢&#xff1f;今天就…

国产 87235系列USB平均功率探头

频率范围覆盖 功率测量准确度&#xff1a;0.2dB 10MHz&#xff5e;50GHz 87235系列 USB平均功率探头是一款基于USB 2.0接口的二极管检波式高精度、大动态范围平均功率测量仪器&#xff0c;可实现各种格式信号平均功率的准确测量。87235系列平均功率探头频率范围覆盖10MHz&am…

Spring Boot整合OAuth2实现GitHub第三方登录

Spring Boot整合OAuth2&#xff0c;实现GitHub第三方登录 1、第三方登录原理 第三方登录的原理是借助OAuth授权来实现&#xff0c;首先用户先向客户端提供第三方网站的数据证明自己的身份获取授权码&#xff0c;然后客户端拿着授权码与授权服务器建立连接获得一个Access Token…