窗口管理器决定
在我开始之前:正如elcuco和Javier所指出的那样,焦点策略和窗口布局的其他方面(例如标题栏)在很大程度上属于相应的窗口管理器,Qt 可能具有有限的控制。要看到这一点,只需查看具有“鼠标跟随焦点”策略的用户界面。在这些情况下,窗口管理器可能会忽略 Qt 的焦点请求。因此,Qt 文档将许多相关标志称为“提示”。因此,一些建议的解决方案可能适用或不适用于您。
QApplication::setActiveWindow()
尽管如此,e.tadeu 的解决方案使用 QApplication::setActiveWindow()
对于我在 Windows 和 Ubuntu 上与 Gnome 都有效。我使用以下代码进行了测试。抱歉它是 Python 使用 PyQt(我使用这样的问题来学习一些关于 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)
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Test')
self.textEdit = QtGui.QTextEdit()
self.setCentralWidget(self.textEdit)
def closeEvent(self, event):
QtGui.QApplication.instance().quit()
app = QtGui.QApplication(sys.argv)
testWindow = MainWindow()
testWindow.setWindowFlags(QtCore.Qt.Tool)
testWindow.show()
app.setActiveWindow(testWindow)
app.exec_()
请注意,您需要添加一些处理
testWindow
关闭事件的代码,因为如果您关闭一个
Qt::Tool
窗口,应用程序不会自动退出。
grabKeyboard() Hack
如果上述方法对您不起作用,下面的方法可能有帮助。我假设您的应用程序中有一个处于活动状态的窗口。然后,您可以使用
grabKeyboard()
来重定向输入。
Qt::Tool
窗口不会获得焦点,但会接收输入。以下主要代码演示了它(其他代码保持不变)。
app = QtGui.QApplication(sys.argv)
testWindow = MainWindow()
testWindow.setWindowFlags(QtCore.Qt.Tool)
testWindow2 = MainWindow()
testWindow2.show()
testWindow.show()
testWindow.textEdit.grabKeyboard()
app.exec_()
基本上,在窗口testWindow2
是活动窗口时,所有输入的文本都会显示在testWindow.textEdit
中。我知道这不好看...
创建您自己的窗口
通过自己设计窗口布局,可以获得最大的灵活性(也会为自己创造最多的工作量)。该想法在以下FAQ中描述。
其他“解决方案”
您可以直接调用相应窗口管理器的API函数来获得所需结果(显然违反了使用Qt的初衷)。您还可以黑客Qt源代码。例如,在Windows上,Qt使用带有标志SW_SHOWNOACTIVATE
的ShowWindow()
函数,以显示具有样式WS_EX_TOOLWINDOW
的窗口,如果您设置了Qt::Tool
标志。您可以轻松地将SW_SHOWNOACTIVATE
替换为任何您想要的内容。Linux应该是一样的。显然也不推荐。