2011-09-13 46 views
6

编辑:这个应用程序将运行在Windows,Mac和各种Linux发行版。我知道Linux有这个问题,但Windows呢?苹果电脑?如何在创建任何窗口之前获取窗口框架的宽度?

有没有什么办法来获得正常窗口的帧的宽度,在显示任何窗口之前?显示一个窗口后,我知道我可以从frameSize()中减去size(),但是直到显示窗口后才能工作。

我已经看了QApplication::style()->pixelMetric(),我可以使用

QApplication::style()->pixelMetric(QStyle::PM_TitleBarHeight) 

获得标题栏的高度,但我没有看到任何选项来获得边界其余地区周围的窗口的宽度。

到目前为止我发现的唯一的解决办法是:

  • 设置窗口的不透明度为0(这样用户就看不到它),
  • 显示窗口
  • 然后减去size() from frameSize()

有没有更好的方法?

+0

无需为标题添加标签 – Smar

回答

3

如果您还没有看到它,Qt文档页面Window and Dialog Widgets包含大量关于此的信息。

你不说你正在运行在什么平台上,但它的X11,答案似乎是“不”,没有更好的办法:

X11特殊性

在X11上,窗口没有框架,直到窗口管理器装饰它。这是在调用QWidget :: show()和窗口接收到的第一个paint事件之后的某个时间点异步发生的,或者根本不会发生。请记住,X11是无政策的(其他人称之为灵活)。因此,你不能对你的窗户将得到的装饰框架作出任何安全的假设。基本规则:总是有一个用户使用窗口管理器来打破你的假设,谁会向你投诉。

(我喜欢你的不透明度设置为0的解决方法:纯)

+0

我已经看过那个Qt doc页面,谢谢。我应该提到这一点。我编辑了原始问题,希望更清楚。很高兴你喜欢解决方法! –

5

我张贴在StackOverflow的一个不同的问题的建议解决方案,但我会在这里发布它。您可以在显示屏幕之前将窗口移动到屏幕之外的某个位置,然后查询它的几何图形,最后将其移动到您想要的位置(如果这是您需要的几何图形)。例如居中主屏幕上的主窗口无闪烁我做到以下几点:

MainWindow mainWindow; 
QRect primaryScreenGeometry(QApplication::desktop()->screenGeometry()); 
mainWindow.move(-50000,-50000); 
mainWindow.show(); 
mainWindow.move((primaryScreenGeometry.width() - mainWindow.width())/2.0, 
       (primaryScreenGeometry.height() - mainWindow.height())/2.0); 

我只测试了这个代码在Windows XP和Qt 4.8.x.希望它也可以在其他平台上运行。

相关问题