窗口管理器決定
我開始之前:由於elcuco和Javier指出,注重政策和窗口布局的其他方面(如標題欄)屬於實質性延伸到相應的窗口經理和Qt的控制權可能有限。要查看此信息,只需查看具有「focus follows mouse」策略的用戶界面即可。在這些情況下,Windows管理員可能會忽略Qt的焦點請求。出於這個原因,Qt文檔調用了許多相應的標誌「提示」。因此,一些建議的解決方案可能會或可能不適合您。
的QApplication :: setActiveWindow()就
這不頂住,e.tadeu's解決方案中使用QApplication::setActiveWindow()
作品對我的Windows和Ubuntu都與侏儒。我用下面的代碼測試了它。道歉,它是使用PyQt的Python(我使用這些問題來學習一些關於PyQt的問題)。閱讀並將其翻譯成C++應該相當容易。
import sys
from PyQt4 import QtGui
from PyQt4 import QtCore
class MainWindow(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self)
# main window
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Test')
# text editor
self.textEdit = QtGui.QTextEdit()
self.setCentralWidget(self.textEdit)
def closeEvent(self, event):
QtGui.QApplication.instance().quit()
#main
app = QtGui.QApplication(sys.argv)
testWindow = MainWindow()
testWindow.setWindowFlags(QtCore.Qt.Tool)
testWindow.show()
app.setActiveWindow(testWindow)
app.exec_()
請注意,您必須添加testWindow
的關閉事件的一些處理,因爲如果你關閉一個窗口Qt::Tool
應用程序不會自動退出。
的grabKeyboard()哈克
如果這不適合你,下面的技巧威力。我假設你的應用程序中有一個窗口處於活動狀態。然後您可以使用grabKeyboard()
重定向輸入。 Qt::Tool
窗口沒有得到重點,但收到輸入。以下主要代碼演示了它(其他代碼保持不變)。
#main
app = QtGui.QApplication(sys.argv)
testWindow = MainWindow()
testWindow.setWindowFlags(QtCore.Qt.Tool)
testWindow2 = MainWindow() # second window which is active
testWindow2.show()
testWindow.show()
testWindow.textEdit.grabKeyboard()
app.exec_()
基本上,當窗口testWindow2
是活動之一,所有的文字進入了testWindow.textEdit
顯示出來。這是不是很好,我知道......
通過推出自己的窗口布局創建您自己的窗口
你獲得最大的靈活性(併爲自己創造最多的工作)。這個想法在以下FAQ中描述。
其他「解決方案」
你可以直接調用相應的窗口管理器的API函數來獲得期望的結果(明確反對的真正原因在首位使用Qt)。你也可以破解Qt源代碼。例如,在Windows上,如果您設置了Qt::Tool
標誌,則Qt使用ShowWindow()
函數和SW_SHOWNOACTIVATE
標誌來顯示樣式爲WS_EX_TOOLWINDOW
的窗口。你可以很容易地用你想要的任何東西替換SW_SHOWNOACTIVATE
。 Linux應該是一樣的。顯然也不推薦。
添加要發佈的信息。 – Ockonal 2009-06-27 15:42:10