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