[英]Get the actual Qt window title
我需要獲取 Qt 頂級窗口(或 MDI 子窗口)的可見標題,因為我想在不同的地方列出窗口標題,就像它們對用戶可見一樣。
考慮一個支持多個頂級編輯器窗口(或具有類似目的的 MDI 區域)的程序,該程序應列出這些窗口的標題,如菜單或內部“窗口管理器”。
如果我想列出這些窗口並且還支持windowModified
屬性的[*]
占位符,那么無論它們的狀態如何,它們的windowTitle()
都會返回那個煩人的占位符。
不幸的是, windowTitle
功能有點抽象,原因如下:
windowModified
功能,如果設置了占位符,它總是返回;[*]
占位符可以多次甚至出現“轉義”,以便在窗口標題中實際顯示[*]
;windowTitle
屬性是一個空字符串(默認值),它會回windowFilePath
屬性,該屬性不僅總是有[*]
占位符,而且在屬性包含[*]
占位符; 雖然我意識到這是一個非常奇怪(並且在某種程度上不負責任,假設系統實際上支持它)的情況,但我仍然想要一種可靠的方法來獲取當前生成的窗口標題,即使在那些罕見的(雖然“錯誤”)情況下也是如此;考慮到上述情況,有沒有辦法獲得 Qt 為窗口設置的真實標題?
沒有絕對和確定的方法來獲取操作系統最終將在頂級窗口的標題欄中顯示的標題。
如windowTitle
文檔中所述,某些系統可能支持顯示applicationDisplayName
。 一些高度可定制的 (Linux) 操作系統可能會顯示所提供標題的更改版本。 幾乎沒有辦法獲得“最終”顯示的標題,除非您想深入了解與窗口管理器交互的特定操作系統模塊(這可能還不夠,因為 *nix 上可能有高水平的定制系統)。
考慮到與 OP 相關的是“內部”窗口標題(Qt 最終“中繼”到系統),解決方案是使用qt_setWindowTitle_helperHelper()
實現 Qt 在內部實際執行的操作。
請注意,Qt 實現並不完美。 當使用占位符字符串的特定組合時,會出現一些奇怪的情況。 例如:
[*] [*] [*]
作為窗口標題會導致未修改的窗口顯示“ [*]
*] ”,否則顯示“ * [*] *
”;[*] [*][*] [*]
,未修改的窗口標題為“ [*] [*]
”(注意前導空格),另一個為“ * [*]* [*]
”雖然如上所述,Qt 實現遠非完美,但我們感興趣的是實際的窗口標題傳遞給操作系統,所以我們必須堅持它,因為視覺結果是重要的方面,不管它是否“正確”與否。
最后,請記住,如果 Qt 開發人員決定改變這種行為(我相信他們應該),這種實現將來可能會變得無效。
以下代碼是一個簡單的函數,它將返回實際窗口標題,該窗口標題為給定的小部件傳遞給操作系統,可用於必須顯示可見標題的任何情況:
def realWindowTitle(widget):
title = widget.windowTitle()
placeHolder = '[*]'
if not placeHolder in title:
return title
phSize = len(placeHolder)
style = widget.style()
if (widget.isWindowModified()
and style.styleHint(
style.SH_TitleBar_ModifyNotification, None, widget)
# for PyQt6 or full Enum support use
# style.StyleHint.SH_TitleBar_ModifyNotification
):
replaceHolder = '*'
else:
replaceHolder = ''
index = title.find(placeHolder)
while index != -1:
index += phSize
count = 1
while title.find(placeHolder, index) == index:
count += 1
index += phSize
if count % 2: # odd number of [*] -> replace last one
lastIndex = title.rfind(placeHolder, 0, index)
title = (title[:lastIndex]
+ replaceHolder
+ title[lastIndex + phSize:])
index = title.find(placeHolder, index)
# return "escaped" sequences of the remaining double placeholders
return title.replace('[*][*]', placeHolder)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.