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

时间:2014-05-26 02:39:18

标签: c++ qt

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

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

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

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

在此阶段,Qt事件循环尚未开始。

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

一旦接收到信号,我就可以强制刷新屏幕,并重新计算所有内容,但是当你看到窗口首先显示错误的尺寸,然后使用正确的尺寸时,会产生难看的效果。

所以问题是:

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

3 个答案:

答案 0 :(得分:1)

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

最后将您的应用程序拆分为2个进程。第一个将设置屏幕分辨率,也将被隐藏。只要分辨率切换成功,您的应用程序就会以正确的尺寸调用真正的应用程序。

答案 1 :(得分:0)

我怀疑除了等待Qt事件循环开始并接收信号之外别无选择。你可以通过在收到信号之前保持窗口隐藏来避免丑陋的效果。

答案 2 :(得分:0)

这是我在决议改变后立即做的事情:

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()将返回期望值