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

时间:2014-05-30 07:25:09

标签: c++ qt

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

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

// adjustSize();
adjustSize();

问题是当调用adjustSize()时,窗口不会调整大小到正确的大小,我必须调用adjustSize()两次或显示QMessageBox,然后再调用adjustSize()来调整大小正确尺寸的窗口。并且btw resize(sizeHint())给出相同的结果

我想知道为什么会这样,是否有一种优雅的方式来正确地做到这一点?非常感谢。

1 个答案:

答案 0 :(得分:2)

当您调用adjustSize()时,以前的调用都没有任何可见效果,因为这些效果仅在事件循环运行时引起。你多次调用它可能会间接地从事件循环中消耗一些事件,与通过QMessageBox显示exec()或静态方法相同。

您需要从事件循环中调用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);
}