2009-06-27 125 views
13

我有一個QMainWindow。它有這個參數:激活窗口

this->setWindowFlags(Qt::Tool); 
this->setFocusPolicy(Qt::StrongFocus); 
this->setAttribute(Qt::WA_QuitOnClose,true); 

後showEvent卡列斯顯示我的窗口,但是未激活。 我試圖重載顯示功能:

...  
QMainWindow::showEvent(event); 
this->activateWindow(); 
... 

但它並不能幫助我。

編輯: 當我註釋行

this->setWindowFlags(Qt::Tool); 

一切運行良好,但我需要在工具標誌。 任何想法?

編輯:

  • 操作系統:Linux
  • 編程語言:C++
  • 的Qt版本:4.5.1

回答

13

窗口管理器決定

我開始之前:由於elcucoJavier指出,注重政策和窗口布局的其他方面(如標題欄)屬於實質性延伸到相應的窗口經理和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應該是一樣的。顯然也不推薦。

1

哪些操作系統?哪個Qt4?

在Linux上你註定了,窗口管理器可以忽略你告訴他的內容。保持它的考慮。

+0

添加要發佈的信息。 – Ockonal 2009-06-27 15:42:10

0

如果您只是將其設置爲常規QWidget而不是QMainWindow,是否會發生同樣的情況?另外,也許你可能會更好地嘗試達到你需要的任何效果Qt :: Tool for其他方式,如果這是可能的?

3

嘗試使用的QApplication :: setActiveWindow()就

4

原來蘋果人機界面指南(*)表示,工具箱窗口是「總在最前面,但從未啓用」。它還建議不要使用文本框,正是因爲缺少激活狀態反饋。

檢查其他'工具箱大量'應用程序的行爲。我依稀記得,至少GIMP和InkScape在這方面看起來非常不同。

由於elcuco表示,窗口管理器可以用Qt的標誌做任何想做的事情。而且,在KDE,Gnome,fluxbox等方面肯定會有所不同。

(*):很棒的文件!有點過時;但工具窗口已經習慣並認爲

0

關於Qt的::工具WindowFlags引述Qt文檔

表示該部件是一個工具 窗口。一個工具窗口通常是一個小的 窗口,它具有比平常小的標題 和裝飾,通常用於 工具按鈕的集合。它有 是父母,工具窗口將 總是保持在它的頂部。如果 不是父級,那麼也可以考慮使用 Qt :: WindowStaysOnTopHint。如果窗口系統支持 ,則工具 窗口可以使用較輕的框架進行裝飾。它也可以 使用Qt :: FramelessWindowHint

組合看來標誌是一個問題,使用Qt :: WindowStaysOnTopHint應該解決您的問題。

0

只需在setWindowFlags()之後致電show()即可。