在Qt中,当子窗口小部件调整大小后,如何调整大小

3

我将写一个非常简单的测试程序,当点击按钮时,GraphicsView 将显示一张图片,并使用网格布局。我希望窗口的大小能够根据图片的大小自动调整。该代码类似于:

// load image and setup scene
// ...
ui->graphicsView->show();
ui->graphicsView->updateGeometry();

// adjustSize();
adjustSize();

问题在于当调用adjustSize()时,窗口不会按正确的大小调整,我必须在调用adjustSize()之前两次显示QMessageBox或调用resize(sizeHint())以将窗口调整为正确的大小。顺便说一下,resize(sizeHint())会得到相同的结果。
我想知道为什么会发生这种情况,是否有更好的方法正确地处理它?非常感谢。

密切相关:https://dev59.com/X8b6oIgBc1ULPQZFFPWl。请查看`QTimer.singleShot`! - bers
1个回答

5
当您调用 adjustSize() 时,由于这些效果只有在事件循环运行时才会发生,因此之前的任何调用都没有任何可见效果。通过多次调用它,您可能间接地从事件循环中排除了一些事件,与通过 exec() 或静态方法显示 QMessageBox 相同。
您需要从事件循环中调用 adjustSize。由于它不可调用,因此您需要在窗口部件类(或辅助类)中进行调用。
// Interface
class MyWidget : public QWidget {
  Q_OBJECT
  Q_INVOKABLE void adjustSize() { QWidget::adjustSize(); }
  ...
};

// Implementation
void MyWidget::myMethod() {
  // ...
  ui->graphicsView->show();
  ui->graphicsView->updateGeometry();

  QMetaObject::invokeMethod(this, "adjustSize", Qt::QueuedConnection);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接