在创建任何窗口之前如何获得窗口框架的宽度?

时间:2011-09-13 20:29:39

标签: c++ qt

编辑:此应用程序将在Windows,Mac和各种Linux发行版上运行。我知道Linux有这方面的问题,但是Windows呢? Mac吗?

有没有办法获得正常窗口的框架宽度,在显示任何窗口之前?显示一个窗口后,我知道我可以从size()中减去frameSize(),但在窗口显示之后这不起作用。

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

获得标题栏的高度
QApplication::style()->pixelMetric(QStyle::PM_TitleBarHeight)

但是我没有看到任何选项来获得窗口周围其余边框的宽度。

到目前为止,我找到的唯一解决方案是:

  • 将窗口不透明度设置为0(因此用户看不到它),
  • 显示窗口
  • 然后从size()
  • 中减去frameSize()

有更好的方法吗?

2 个答案:

答案 0 :(得分:6)

我在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上测试过这段代码。希望它也适用于其他平台。

答案 1 :(得分:3)

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

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

  

X11特点

     

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

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