我正在编写一个非常简单的测试程序,当单击按钮时,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())给出了相同的结果
我想知道为什么会发生这种情况,是否有一种优雅的方法可以正确地做到这一点?非常感谢。
当您调用 时adjustSize(),之前的调用都没有任何可见的效果,因为这些效果仅在运行事件循环时才会引起。通过多次调用它所做的可能是间接从事件循环中排出一些事件,与显示viaQMessageBox或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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2574 次 |
| 最近记录: |