簡體   English   中英

QWidget不顯示QLabel

[英]QWidget not displaying the QLabel

我有一個QWidget,要像另一個QWidget上的Dialog一樣使用。

我正在嘗試做的是一個簡單的“請稍等,請稍等...”對話框,沒有按鈕。

代碼部分如下:

void NewWindow::on_combobox_New_currentIndexChanged(int index) //slot function
{
    QWidget* box = new QWidget();
    box->setWindowModality(Qt::ApplicationModal);
    box->setWindowTitle("Wait...");

    QHBoxLayout* layout = new QHBoxLayout();
    box->setLayout(layout);
    QLabel* lbl = new QLabel();
    lbl->setText("Loading...");
    layout->addWidget(lbl);

    box->show();


    for (int var = 0; var < st.size(); ++var)
    {
        //Some heavy lifting here
    }

    box->close();
}

通常,我希望此對話框顯示正確的文本,並在循環結束后消失。 實際上,它也可以這樣做,但有一個區別:標簽不顯示。 小部件看起來是空的。 然后消失。

QWidget標簽未顯示

如果我將代碼復制到其他區域(例如復制到MainWindow構造函數),它將正確顯示並帶有消息。

QWidget標簽顯示正確

我感覺到循環阻止了繪制操作,但是小部件本身也應該丟失。 為什么只有標簽讓我難以理解。

感謝您的見解。

由於您是在QObject插槽中創建並顯示此窗口小部件,然后在從插槽返回之前關閉該窗口小部件,因此在Qt執行所有指令的過程中,最后一個窗口close ,因此窗口小部件消失了從視圖。

在您的廣告位下方,Qt正在事件循環中運行。 由於控制永遠不會返回到事件循環,因此Qt永遠不會有機會呈現您要求的圖形。

當您創建窗口小部件,添加標簽等時,實際上是在事件循環中注冊了一堆命令,稍后將對其進行處理。

如果您希望Qt渲染您在插槽中所做的任何更改,則在返回事件循環之前,必須調用processEvents

如果不這樣做,您將看不到這些更改, 直到控制權傳遞回Qt事件循環為止

因此,這里發生的是,由於您還要在插槽末端關閉窗口小部件,因此Qt將創建窗口小部件,渲染其內容,然后立即將其關閉,您將看不到任何東西。

這樣做的原因是,Qt可以對可見的內容,不可見的內容進行計算,對呈現的內容等保持精明,僅決定繪制必要的內容。

如果它只是立即呈現所有內容,而無需等待控制權返回到它,以便它可以處理“下一批更新”,則效率可能極低。

因此,您需要將processEvents放入回調插槽中。

void NewWindow::on_combobox_New_currentIndexChanged(int index) //slot function
{
    QWidget* box = new QWidget();
    box->setWindowModality(Qt::ApplicationModal);
    box->setWindowTitle("Wait...");

    QHBoxLayout* layout = new QHBoxLayout();
    box->setLayout(layout);
    QLabel* lbl = new QLabel();
    lbl->setText("Loading...");
    layout->addWidget(lbl);

    box->show();
    QCoreApplication::processEvents(); // cause the box to be displayed

    for (int var = 0; var < st.size(); ++var)
    {
        //Some heavy lifting here

        // if you do anything here to change the widget, such as 
        // updating a progress bar, you need to `processEvents` again

        QCoreApplication::processEvents();
    }

    box->close();
}

至於為什么顯示窗口小部件窗口而不顯示內容的原因,這很可能是因為在創建窗口小部件時Qt將消息發送到窗口管理器(在本例中為MS Windows),該窗口管理器將創建一個窗口,Qt可以在該窗口上呈現其內容。

因此,您會看到Windows為Qt創建一個新窗口的結果,但是在該窗口本身上進行Qt繪制不會產生任何結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM