概述
主要记录 showEvent、hideEvent 事件的相关应用。
故事场景
一个背景window(QWidget-链接什么是window)窗口,多个同尺寸子窗口可在其内切换显示!要求,window窗口变动时,子窗口尺寸随动,但,内部子窗口在切换的过程中,无论其最小尺寸为多大,都不应该导致window窗口变动!
以前,存在一个误解:创建一个oneWidget然后对其setParent(parentWdt)操作,当parentWdt的尺寸变化时,oneWidget不随动,错误的认为指定父晚了,其实不然。此处不随动,是因为只设置了父窗却没在其中增加布局,QtDesigner直接绘制也是这么回事。使子随父窗重置大小的办法有俩(都与是否指定父子窗口没有直接关系):#1 将父子窗口通过某种布局全填满的关联起来 #2 对各个子窗口执行childWdt->resize(parentWdt->size());也是以前,一直在用#2方案,不好不坏的那么用着。进来发现,父多子窗又需填满显示的情景,直接使用布局切换显示,挺好用的还,具体做法如下:(准备入坑-)
Widget::Widget(QWidget *parent) :
QWidget(parent), ui(new Ui::Widget) //geometry 400*200
{
ui->setupUi(this);
pVBoxLayout = new QVBoxLayout(ui->frame_ChildHmi);
m_Child_1 = new ChildForm_1(ui->frame_ChildHmi); //widget sizePolicy:Preferred Preferred
pVBoxLayout->addWidget(m_Child_1);
m_Child_2 = new ChildForm_2(ui->frame_ChildHmi); //widget sizePolicy:change change
pVBoxLayout->addWidget(m_Child_2);
m_Child_2->hide();
m_Child_n... //any count child widget
}
在上述的布局环境下,增加n个childWidget,只简单的保持其中一个处于show,在形式上便实现了切换,这比使用stackedWidget简单了很多;另一方面在布局的作用下,界面也能自动的扩到父窗大小。然后,开始布坑:现将m_Child_2最小尺寸设置到700*400,执行hide1&show2操作,呢,会发现父窗口被撑大了,即使再切到小尺寸childWdt也缩不回去了!
window[A widget that is not embedded in a parent widget is called a window.]的默认大小:
virtual QSize sizeHint() const
/** @brief This property holds the recommended(被推荐的) size for the widget.The default implementation of sizeHint() returns an invalid size if there is no layout for this widget, and returns the layout's preferred size otherwise.
**/
对于干净的window(可为QWidget)窗口,执行show后其初始大小为ui属性中的geometry(400230)设置,Qt系统此时认为这个大小是prefer的。接着,在这个window中增加10个label控件(minsize 100100,无布局),QEvent::Resize 调试信息显示window的show尺寸是不变的!再对其加布局运行显示,对比效果如下(注意描述该表window尺寸时的变化效果):
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1RnegmjL-1580808690994)(F:\搜狗截图20191212163739.png)]
窗口布局与尺寸
有无父窗口不影响布局
QGridLayout *pGridLayout = new QGridLayout(this);
for (int i = 0; i < 8; i++)
{
m_pBtn[i] = new QPushButton(); //不指定父窗口
pGridLayout->addWidget(m_pBtn[i], i / 2, i % 2);
}
上述代码运行时,布局正常,可得出:不设置父窗口并不影响布局,但可能会影响到如,子随父销毁、样式效果等。
窗口精准移动
对于新手,可能会遇到这样的问题:指定某个窗口移动到确定位置时(尤其是需要用到自身尺寸计算的位置),会用全局位置,明明代码没写错,但是存在偏差。问题的原因通常是,在计算精确位置时,待移动窗口的位置尚未定型。博主现在处理此问题的方法是,重载待移动窗口的showEvent函数,在其中执行move操作,因为此时尺寸已是确定的。
move函数的讲解、show函数的使用。
来源:CSDN
作者:qugx0528
链接:https://blog.csdn.net/quguanxin/article/details/104172377