编辑:此应用程序将在Windows,Mac和各种Linux发行版上运行。我知道Linux有这方面的问题,但是Windows呢? Mac吗?
有没有办法获得正常窗口的框架宽度,在显示任何窗口之前?显示一个窗口后,我知道我可以从size()
中减去frameSize()
,但在窗口显示之后这不起作用。
我看了QApplication::style()->pixelMetric()
,我可以使用
QApplication::style()->pixelMetric(QStyle::PM_TitleBarHeight)
但是我没有看到任何选项来获得窗口周围其余边框的宽度。
到目前为止,我找到的唯一解决方案是:
size()
frameSize()
有更好的方法吗?
答案 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的解决方法:整洁!)