如何强制QDesktopWidget::screenGeometry返回更新的几何值
How to force QDesktopWidget::screenGeometry to return updated geometry values
我有一个QT应用程序,它在启动时改变屏幕分辨率(通过unix中的xrandr或通过OSX上的CGConfigureDisplayMode)
一旦屏幕分辨率更改完成并成功,应用程序继续。
然后使用QApplication::desktop()->screenGeometry(int)
检索各种屏幕的大小。
问题是QDesktopWidget::screenGeometry()
在分辨率发生变化之前返回维度。
在这个阶段,Qt事件循环还没有启动。
我当然会,一旦Qt事件循环运行接收QDesktopWidget::resized(int)
信号,调用QDesktopWidget::screenGeometry
将返回更新的维度。但到那时已经太晚了。
我可以在接收到信号后强制刷新屏幕,并重新计算所有内容,但这会产生难看的效果,因为您会看到窗口首先以错误的尺寸显示,然后使用正确的尺寸。
所以问题是:
如何确保QDesktopWidget::screenGeometry()
返回实际值,而不是应用程序启动时的值
最终您可以在创建主窗口之前在main.cpp (int main())中实现桌面分辨率切换。如果这是可能的,你可以切换,你的窗口将有正确的尺寸。你可能也可以在那里运行一个简短的自定义事件循环。
作为最后的手段,将应用程序分成两个进程。第一个将设置屏幕分辨率,也将隐藏。一旦分辨率切换成功,你的应用程序将以正确的尺寸开始调用真正的应用程序。
我怀疑除了等待Qt事件循环启动并接收信号之外,还有其他选择。您可以通过将窗口隐藏直到接收到信号之后来避免这种难看的效果。
这是我结束做的,就在分辨率改变后:
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()
的下一次调用将返回期望的值
- 指针没有更新它在void函数内部指向的值
- 如何在c++中获取要更新的值
- 对的排序向量 (std::vector<pair<int, int>>) 按对的第一个元素搜索并更新第二个元素值
- 使用 yaml-cpp 更新 YAML 文档的节点和值
- 使用 RapidXML 更新C++中的 XML 节点和属性值
- 为什么 c++ 映射值不针对同一键更新?
- 运算符 [] 重载更新 2 个值 c++
- 如何在 c# 代码中通过引用调用时从 c++ dll 更新数组值?
- 如何更新和删除文本文件中的特定逗号分隔值?C++
- 类中的 C++ int 被设置为值,似乎不知从何而来
- 为什么我的数组值会更新为随机值?
- 编辑单个 YAML 值,而不更新 YAML (YAML CPP) 其余部分的格式
- 尝试使用 EvtSetChannelConfigProperty() 函数更新最大事件日志文件大小时插入的错误值
- C++ - 更新指针中的值被覆盖
- 如何使用C++相对于其原始值更新 SQLite 行
- QTableview单元格的值更新后,如何及时对它的颜色进行动画处理?
- 当我在C++中字符串更新对象记录时,用垃圾值更新了文件
- C++值更新/忽略
- 为什么要基于随机值更新计时器?
- 用户界面-C++/Tk:如何创建滑块并接收其值更新