簡體   English   中英

在創建任何窗口之前如何獲取窗口框架的寬度?

[英]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)

但我沒有看到任何選項來獲取窗口周圍其余邊框的寬度。

到目前為止,我發現的唯一解決方案是:

  • 將窗口不透明度設置為 0(因此用戶看不到它),
  • 顯示窗口
  • 然后從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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM