C++ 如何强制QDesktopWidget::screenGeometry返回更新的几何体值

C++ 如何强制QDesktopWidget::screenGeometry返回更新的几何体值,c++,qt,C++,Qt,我有一个QT应用程序,它在启动时更改屏幕分辨率(在unix中通过xrandr或在OSX上通过CGConfigureDisplayMode) 一旦屏幕分辨率更改完成并成功,应用程序将继续 然后,它使用QApplication::desktop()->screenGeometry(int)检索各种屏幕的大小 问题在于QDesktopWidget::screenGeometry()返回分辨率更改发生之前的维度 在此阶段,Qt事件循环尚未启动 当然,一旦Qt事件循环运行,我将接收QDesktopWidg

我有一个QT应用程序,它在启动时更改屏幕分辨率(在unix中通过xrandr或在OSX上通过CGConfigureDisplayMode)

一旦屏幕分辨率更改完成并成功,应用程序将继续

然后,它使用
QApplication::desktop()->screenGeometry(int)
检索各种屏幕的大小

问题在于
QDesktopWidget::screenGeometry()
返回分辨率更改发生之前的维度

在此阶段,Qt事件循环尚未启动

当然,一旦Qt事件循环运行,我将接收
QDesktopWidget::resized(int)
信号,然后调用
QDesktopWidget::screenGeometry
将返回更新的维度。但到那时已经太晚了

我可以在收到信号后强制刷新屏幕,然后重新计算所有内容,但这会产生一种丑陋的效果,因为你会看到窗口首先以错误的尺寸显示,然后使用正确的尺寸

因此,问题是:


如何确保
QDesktopWidget::screenGeometry()
返回的是实际值,而不是应用程序启动时的值。

我怀疑除了等待Qt事件循环启动并接收信号之外,没有其他选择。您可以通过在收到信号之前隐藏窗口来避免丑陋的效果。

最终,您可以在创建主窗口之前在main.cpp(int main())中实现桌面分辨率开关。如果这是可能的,你可以切换,你的窗口将有正确的尺寸。您可能还可以在那里运行一个简短的自定义eventloop


作为最后手段,将应用程序分为两个进程。第一个将设置屏幕分辨率,也将被隐藏。一旦分辨率切换成功,您的应用程序将以正确的维度调用真正的应用程序。

这就是我在分辨率更改后立即结束的操作:

QEventLoop loop;
QTimer timer;
QDesktopWidget *desktop = QApplication::desktop();

timer.setSingleShot(true);
QObject::connect(&timer, SIGNAL(timeout()),
                 &loop, SLOT(quit()));
QObject::connect(desktop, SIGNAL(resized(int)),
                 &loop, SLOT(quit()));
QObject::connect(desktop, SIGNAL(workAreaResized(int)),
                 &loop, SLOT(quit()));
timer.start(300); //300ms maximum wait
loop.exec();

这个短暂的等待,足以让Qt框架处理分辨率更改,下一次调用
QDesktopWidget::screenGeometry()
将返回期望值

,更糟糕的是,Qt 4.8.5和Maverick似乎没有发送屏幕更改信号。