天天看點

Qt/GUI-視窗尺寸與顯示控制概述故事場景視窗布局與尺寸視窗精準移動

概述

主要記錄 showEvent、hideEvent 事件的相關應用。

故事場景

一個背景window(what)視窗,多個同尺寸子視窗可在其内切換顯示!要求,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尺寸時的變化效果):

Qt/GUI-視窗尺寸與顯示控制概述故事場景視窗布局與尺寸視窗精準移動

視窗布局與尺寸

有無父視窗不影響布局

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函數的使用。