我正在编写一个非常简单的测试程序,当单击按钮时,GraphicsView将显示图像,使用网格布局。我希望根据图像大小自动调整窗口大小。代码类似于
// load image and setup scene
// ...
ui->graphicsView->show();
ui->graphicsView->updateGeometry();
// adjustSize();
adjustSize();
问题是当调用adjustSize()
时,窗口不会调整大小到正确的大小,我必须调用adjustSize()
两次或显示QMessageBox,然后再调用adjustSize()
来调整大小正确尺寸的窗口。并且btw resize(sizeHint())
给出相同的结果
我想知道为什么会这样,是否有一种优雅的方式来正确地做到这一点?非常感谢。
答案 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);
}