Windows 管理器决定
在我开始之前:正如elcuco和Javier所指出的,焦点策略和窗口布局的其他方面(例如标题栏)属于对各自窗口管理器的实质性扩展,Qt 的控制可能有限。要看到这一点,只需查看具有“焦点跟随鼠标”策略的用户界面。在这些情况下,窗口管理器可能会忽略 Qt 的焦点请求。出于这个原因,Qt 文档将许多相应的标志称为“提示”。因此,一些建议的解决方案可能适合您,也可能不适合您。
QApplication::setActiveWindow()
尽管如此,e.tadeu 的使用解决方案QApplication::setActiveWindow()
对我来说适用于 Windows 和带有 Gnome 的 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() 黑客
如果这对您不起作用,则以下 hack 可能会。我假设您的应用程序中有一个处于活动状态的窗口。然后,您可以使用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
. 这不好看,我知道...
创建自己的窗口
通过推出自己的窗口布局,您可以获得最大的灵活性(并为自己创造最多的工作)。下面的常见问题解答中描述了这个想法。
其他“解决方案”
您可以直接调用相应窗口管理器的 API 函数来获得所需的结果(显然与首先使用 Qt 的原因背道而驰)。您还可以破解 Qt 源代码。例如,在 Windows 上,Qt 使用ShowWindow()
带有标志的函数,如果您设置SW_SHOWNOACTIVATE
标志,则显示带有样式的窗口。您可以轻松地将 替换为您想要的任何内容。Linux应该是一样的。显然也不推荐。WS_EX_TOOLWINDOW
Qt::Tool
SW_SHOWNOACTIVATE