激活窗口

Max*_*rai 14 c++ qt show

我有一个QMainWindow.它有这个参数:

this->setWindowFlags(Qt::Tool);
this->setFocusPolicy(Qt::StrongFocus);
this->setAttribute(Qt::WA_QuitOnClose,true);
Run Code Online (Sandbox Code Playgroud)

在showEvent调用后,我的窗口显示但未激活.我试着重载show function:

...    
QMainWindow::showEvent(event);
this->activateWindow();
...
Run Code Online (Sandbox Code Playgroud)

但它对我没有帮助.

编辑: 当我评论行

this->setWindowFlags(Qt::Tool);
Run Code Online (Sandbox Code Playgroud)

一切正常,但我需要在工具标志.有任何想法吗?

编辑:

  • 操作系统:Linux
  • 编程语言:c ++
  • Qt版本:4.5.1

ste*_*han 14

Windows Manager决定

在我开始之前:正如elcucoJavier所指出的,焦点策略和Windows布局的其他方面(例如标题栏)属于相应的窗口管理器,并且Qt可能具有有限的控制.要查看此内容,只需查看具有" 焦点跟随鼠标 "策略的用户界面即可.在这些情况下,Windows管理器可能会忽略Qt的焦点请求.出于这个原因,Qt文档调用了许多相应的标志"提示".因此,某些建议的解决方案可能适用于您,也可能不适合您.

的QApplication :: setActiveWindow()就

这是不可能的,e.tadeu的解决方案QApplication::setActiveWindow()适用于Windows和Ubuntu与Gnome.我用以下代码测试了它.抱歉使用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_()
Run Code Online (Sandbox Code Playgroud)

请注意,您必须添加一些close事件的处理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_()
Run Code Online (Sandbox Code Playgroud)

基本上,当窗口testWindow2是活动窗口时,输入的所有文本都显示在testWindow.textEdit.这不好,我知道......

创建自己的窗口

通过推出自己的窗口布局,您可以获得最大的灵活性(并为自己创造最多的工作).这个想法在以下FAQ中描述.

其他"解决方案"

您可以直接调用相应的窗口管理器的API函数来获得所需的结果(显然与首先使用Qt的原因相反).你也可以破解Qt源代码.例如,在Windows上,Qt使用ShowWindow()带有SW_SHOWNOACTIVATE标志的函数,WS_EX_TOOLWINDOW如果设置了标志,则显示带有样式的窗口Qt::Tool.您可以轻松地替换SW_SHOWNOACTIVATE您想要的任何内容.Linux应该是一样的.显然也不推荐.