簡體   English   中英

小部件刪除后qt調整大小窗口

[英]qt resize window after widget remove

我在布局中添加小部件

ui->horizontalLayout->addWidget(tabwidget);

和qmainwindow調整自己的大小。 但后來我做到了

tabwidget->setVisible(false);
qs = sizeHint();
resize(qs);

我得到像tabwidget的大小沒有從窗口中刪除。

我做了新按鈕

void MainWindow::on_pushButton_2_clicked()
{
    qs = sizeHint();
    resize(qs);
}

它給出了正確的尺寸。

似乎我需要一些更新功能,但我找不到它。 請指教

這是由長時間的內部Qt問題引起的(我記得先用Qt3體驗它)。 頂部窗口小部件需要接收事件以真正更新其幾何體,並了解其邊界。 在布局生成的resize事件之后,似乎總是會收到此事件,因此縮小窗口小部件總是為時已晚。

在接受的答案中發布的解決方案有效。 但是,在布局后添加時,下面發布的更簡單的解決方案也可以使用:

layout()->removeWidget( widget );

QApplication::processEvents( QEventLoop::ExcludeUserInputEvents );
resize( sizeHint() );

基本上我們需要的是讓事件循環運行並提供必要的事件,以便在運行resize()之前更新頂部窗口小部件幾何體。

請注意,如果您運行多個線程,或者有事件傳遞到您的插槽,此代碼可能會產生副作用。 因此,在resize()之后不使用此函數中的任何代碼更安全。

如果按鈕插槽為您提供了正確的結果,那么您始終可以在單個定時器調用的插槽中調用sizeHint()和后續resize()

void MainWindow::fixSize()
{
    QSize size = sizeHint();
    resize(size);
}

void MainWindow::methodWhereIHideTheTabWidget()
{
    tabwidget->setVisible(false);
    QTimer::singleShot(0, this, SLOT(fixSize()));
}

此計時器設置為零延遲。 這意味着當程序返回主循環並且希望在內部窗口小部件狀態更新后,將立即調用該槽。 如果這不能解決您的問題,您可以嘗試用1替換零。

暫無
暫無

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

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