在Qt中调整子部件大小后调整大小

adjust size after child widget resized in Qt

本文关键字:调整 Qt      更新时间:2023-10-16

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

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

问题是,当adjustSize()被调用时,窗口没有调整大小到正确的大小,我必须调用adjustSize()两次或在调用adjustSize()之前显示一个QMessageBox来调整窗口的大小以纠正大小。顺便说一下,resize(sizeHint())给出了相同的结果

我想知道为什么会发生这种情况,是否有一种优雅的方法来正确地做到这一点?多谢。

当您调用adjustSize()时,前面的调用都没有任何可见的效果,因为这些效果只有在事件循环运行时才会产生。你多次调用它所做的可能是间接地从事件循环中抽取一些事件,通过exec()或静态方法显示QMessageBox也是如此。

需要从事件循环中调用adjustSize。因为它是不可调用的,所以您需要在您的小部件类(或helper类)中这样做。

// 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);
}