我在布局中添加小部件
ui->horizontalLayout->addWidget(tabwidget);
和qmainwindow自行调整大小。但后来我做了
tabwidget->setVisible(false);
qs = sizeHint();
resize(qs);
我得到像tabwidget这样的大小没有从窗口删除。
我已经制作了新按钮
void MainWindow::on_pushButton_2_clicked()
{
qs = sizeHint();
resize(qs);
}
它给出了正确的尺寸。
似乎我需要一些更新功能,但我找不到它。请建议
答案 0 :(得分:6)
这是由长时间的内部Qt问题引起的(我记得先用Qt3体验它)。顶部窗口小部件需要接收事件以真正更新其几何体,并了解其边界。在布局生成的resize事件之后,似乎总是会收到此事件,因此缩小窗口小部件总是为时已晚。
在接受的答案中发布的解决方案有效。但是,在布局后添加时,下面发布的更简单的解决方案也有效:
layout()->removeWidget( widget );
QApplication::processEvents( QEventLoop::ExcludeUserInputEvents );
resize( sizeHint() );
基本上我们需要的是让事件循环运行并传递必要的事件,以便在运行resize()之前更新顶部窗口小部件几何体。
请注意,如果您运行多个线程,或者有些事件已传递到您的插槽,则此代码可能会产生副作用。因此,在resize()之后没有任何代码可以更安全。
答案 1 :(得分:5)
如果按钮插槽为您提供了正确的结果,那么您始终可以在单拍定时器调用的插槽中调用sizeHint()
和后续resize()
:
void MainWindow::fixSize()
{
QSize size = sizeHint();
resize(size);
}
void MainWindow::methodWhereIHideTheTabWidget()
{
tabwidget->setVisible(false);
QTimer::singleShot(0, this, SLOT(fixSize()));
}
此计时器设置为零延迟。这意味着当程序返回主循环并且希望在内部窗口小部件状态更新后,将立即调用该槽。如果这不能解决您的问题,您可以尝试用1替换零。