小部件删除后qt调整大小窗口

quu*_*uux 6 c++ qt

我在布局中添加小部件

ui->horizontalLayout->addWidget(tabwidget);
Run Code Online (Sandbox Code Playgroud)

和qmainwindow调整自己的大小.但后来我做到了

tabwidget->setVisible(false);
qs = sizeHint();
resize(qs);
Run Code Online (Sandbox Code Playgroud)

我得到像tabwidget的大小没有从窗口中删除.

我做了新按钮

void MainWindow::on_pushButton_2_clicked()
{
    qs = sizeHint();
    resize(qs);
}
Run Code Online (Sandbox Code Playgroud)

它给出了正确的尺寸.

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

Geo*_* Y. 6

这是由长时间的内部Qt问题引起的(我记得先用Qt3体验它).顶部窗口小部件需要接收事件以真正更新其几何体,并了解其边界.在布局生成的resize事件之后,似乎总是会收到此事件,因此缩小窗口小部件总是为时已晚.

在接受的答案中发布的解决方案有效.但是,在布局后添加时,下面发布的更简单的解决方案也可以使用:

layout()->removeWidget( widget );

QApplication::processEvents( QEventLoop::ExcludeUserInputEvents );
resize( sizeHint() );
Run Code Online (Sandbox Code Playgroud)

基本上我们需要的是让事件循环运行并提供必要的事件,以便在运行resize()之前更新顶部窗口小部件几何体.

请注意,如果您运行多个线程,或者有事件传递到您的插槽,此代码可能会产生副作用.因此,在resize()之后不使用此函数中的任何代码更安全.


Zal*_*aPL 5

如果按钮插槽为您提供正确的结果,那么您始终可以在单个定时器调用的插槽中调用sizeHint()和后续resize():

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

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

此计时器设置为零延迟.这意味着当程序返回主循环并且希望在内部窗口小部件状态更新后,将立即调用该槽.如果这不能解决您的问题,您可以尝试用1替换零.

  • 如果它只在你添加35ms延迟后工作,并且当你使用34ms延迟时不工作,那么我不会依赖它.如果运行该软件的计算机出现"打嗝"并且没有为您的程序提供足够的CPU时间,则可能会出现问题. (3认同)