[英]How to get the width of a window frame, before creating any windows?
編輯:這個應用程序將在 Windows、Mac 和各種 Linux 發行版上運行。 我知道 Linux 有這方面的問題,但是 Windows 呢? 蘋果電腦?
在顯示任何窗口之前,有什么方法可以獲取普通窗口的框架寬度? 顯示一個窗口后,我知道我可以從frameSize()
中減去size()
) ,但這在顯示窗口之前不起作用。
我看過QApplication::style()->pixelMetric()
,我可以使用
QApplication::style()->pixelMetric(QStyle::PM_TitleBarHeight)
但我沒有看到任何選項來獲取窗口周圍其余邊框的寬度。
到目前為止,我發現的唯一解決方案是:
frameSize()
中減去size()
)有沒有更好的辦法?
我在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上測試過這段代碼。 希望它也可以在其他平台上運行。
如果您還沒有看到它,Qt doc頁面Window和Dialog Widgets包含大量有關此內容的信息。
你沒有說你正在運行什么平台,但它是X11,答案似乎是“不”,沒有更好的方法:
X11特點
在X11上,窗口沒有框架,直到窗口管理器裝飾它。 這在調用QWidget :: show()和窗口接收的第一個繪制事件之后的某個時間點異步發生,或者根本不發生。 請記住,X11是免政策的(其他人稱之為靈活)。 因此,您無法對窗戶將獲得的裝飾框架做出任何安全的假設。 基本規則:總有一個用戶使用窗口管理器來打破你的假設,誰會向你抱怨。
(我喜歡你將不透明度設置為0的解決方法:整潔!)
Daniel Hedberg
的答案的 python 版本。
在屏幕右下角顯示窗口的一個示例:
from PySide2 import QtWidgets, QtGui
app = QtWidgets.QApplication()
allScreensTotalWidth = sum([x.size().width() for x in QtGui.QGuiApplication.screens()])
allScreensTotalHeight = sum([x.size().height() for x in QtGui.QGuiApplication.screens()])
primaryScreenViewportWidth = QtGui.QGuiApplication.primaryScreen().availableSize().width()
primaryScreenViewportHeight = QtGui.QGuiApplication.primaryScreen().availableSize().height()
widget = QtWidgets.QWidget()
widget.resize(200, 200)
widget.move(allScreensTotalWidth, allScreensTotalHeight)
widget.show()
widget.move(
primaryScreenViewportWidth - widget.frameSize().width(),
primaryScreenViewportHeight - widget.frameSize().height())
app.exec_()
所有QtGui.QScreen
大小的總和是用戶不可見的位置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.