窗口管理器决定
我开始之前:由于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