2009-06-27 126 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()即可。