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

lzh*_*ng3 3 c++ qt

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

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

// adjustSize();
adjustSize();
Run Code Online (Sandbox Code Playgroud)

问题是,当adjustSize()调用时,窗口不会调整到正确的大小,并且在调用将窗口调整到正确的大小adjustSize()之前,我必须调用两次或显示 QMessageBox 。adjustSize()顺便说一句,resize(sizeHint())给出了相同的结果

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

Rei*_*ica 5

当您调用 时adjustSize(),之前的调用都没有任何可见的效果,因为这些效果仅在运行事件循环时才会引起。通过多次调用它所做的可能是间接从事件循环中排出一些事件,与显示viaQMessageBoxexec()静态方法相同。

您需要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);
}
Run Code Online (Sandbox Code Playgroud)