我有一个QT应用程序,它会在启动时更改屏幕分辨率(通过unix中的xrandr或OSX上的CGConfigureDisplayMode)
屏幕分辨率更改完成并成功后,应用程序将继续。
然后使用QApplication::desktop()->screenGeometry(int)
检索各种屏幕的大小。
问题是QDesktopWidget::screenGeometry()
在发生分辨率更改之前返回维。
在此阶段,Qt事件循环尚未开始。
我当然会在Qt事件循环运行后收到QDesktopWidget::resized(int)
信号,然后调用QDesktopWidget::screenGeometry
将返回更新的维度。但到那时为时已晚。
一旦接收到信号,我就可以强制刷新屏幕,并重新计算所有内容,但是当你看到窗口首先显示错误的尺寸,然后使用正确的尺寸时,会产生难看的效果。
所以问题是:
如何确保QDesktopWidget::screenGeometry()
返回实际值,而不是应用程序启动时的值。
答案 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()
将返回期望值