最近做UI,有多个窗口嵌套,且所有窗口均用了Layout布局,当运行程序时,主窗口布局有效,而嵌套的窗口布局未生效。
构造函数Resize()
首先我想到的是,我设置了Layout,那么他会自动调整大小,是不是在创建子窗口的时候并没有获取到此窗口在父类布局中占用的位置?那么我在构造的时候分别设置每个子窗口即可。
child_widget->Resize(this->XXXX->size());//XXXX是子窗口一个widget的区域,或者qstackedwidget等某个页面的大小
使用上述类似的指令去重新设置,发现没有任何效果。而根本原因是构造函数中获得的Size()并不对,不是主窗口的真实尺寸。
笨方法-QTimer()
由于时间关系,使用了笨方法。无论如何最后构造完成以后肯定窗口显示了。。。。
那么建立一个定时器,构造的时候启动定时器,连接到槽,然后timeout()以后执行Resize指令,并且stop Timer。。。
此方法确实解决了布局适应的问题,但是建立一个timer,方法并不友好
QWidget构造到销毁事件流分析
此处为了方便,不对QWidget做范例分析,直接用QMainWindow做分析,QMainWindow是QWidget的子类。
下面会详细说明分析方法,若需要对QWidget或者其他控件做分析,可以仿照进行。
实验项目配置
直接新建一个Qt Widgets项目,为了测试方便,我把默认的菜单栏、工具栏、状态栏都取消了,只添加了一个QPushButton按钮控件。
程序代码如下:
*.pro
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = untitled
TEMPLATE = app
DEFINES += QT_DEPRECATED_WARNINGS
SOURCES += \
main.cpp \
mainwindow.cpp
HEADERS += \
mainwindow.h
FORMS += \
mainwindow.ui
mainwindow.ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
&l

本文探讨了在Qt中,如何在QWidget的构造和销毁过程中处理尺寸调整问题。通过分析事件流,作者发现构造函数中获取的尺寸不正确,推荐在`showEvent()`中使用`repaint()`来实现子窗口的自适应布局。此外,文章还提供了事件发生的顺序,包括`QStyle::polish()`、`moveEvent()`、`resizeEvent()`等,并分享了一个简单的Qt Widgets项目作为示例。
最低0.47元/天 解锁文章
3522

被折叠的 条评论
为什么被折叠?



