激活窗口

时间:2009-06-27 15:12:10

标签: c++ qt show

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

this->setWindowFlags(Qt::Tool);
this->setFocusPolicy(Qt::StrongFocus);
this->setAttribute(Qt::WA_QuitOnClose,true);

showEvent calles后,我的窗口显示但未激活。 我试图重载show function:

...    
QMainWindow::showEvent(event);
this->activateWindow();
...

但它对我没有帮助。

修改 当我评论行

this->setWindowFlags(Qt::Tool);

一切正常,但我需要工具标志。 有什么想法吗?

修改

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

7 个答案:

答案 0 :(得分:14)

Windows Manager决定

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

<强>的QApplication :: setActiveWindow()就

这是不可能的,e.tadeu's使用QApplication::setActiveWindow()的解决方案适用于Windows和Unntu与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_()

请注意,您必须添加对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中。这不好,我知道......

创建自己的窗口

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

其他“解决方案”

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

答案 1 :(得分:4)

尝试使用QApplication :: setActiveWindow()

答案 2 :(得分:4)

最初的苹果人机界面指南(*)表示工具箱窗口“始终在顶部但从未激活”。它还建议不要在它们上使用文本框,正是因为缺乏激活状态反馈。

检查其他“工具箱重”应用的行为方式。我隐约记得至少GIMP和InkScape在这方面看起来非常不同。

正如elcuco所说,窗口管理器可以用Qt的标志做任何想做的事情。此外,它确实会在KDE,Gnome,fluxbox等之下有所不同。

(*):好文件!有点过时;但是工具窗口已经被使用并被认为是

答案 3 :(得分:1)

哪个操作系统?哪个Qt4?

在Linux上你注定要失败,窗口管理员可以忽略你告诉他的内容。保持正在考虑中。

答案 4 :(得分:0)

如果你只是把它变成普通的QWidget而不是QMainWindow,会发生同样的事情吗?

另外,也许您可​​能会更好地尝试通过其他方式实现您需要Qt :: Tool的任何效果,如果可能的话?

答案 5 :(得分:0)

关于Qt :: Tool WindowFlags引用Qt文档

  

表示窗口小部件是一个工具   窗口。工具窗口通常很小   比通常标题小的窗口   酒吧和装饰,通常用于   工具按钮的集合。它在那里   是父,工具窗口会   永远保持在它之上。如果有   不是父母,你可以考虑使用   Qt :: WindowStaysOnTopHint也是如此。如果   窗户系统支持它,一种工具   窗户可以装饰一个   更轻的框架。它也可以   结合Qt :: FramelessWindowHint

似乎标志是一个问题,使用Qt :: WindowStaysOnTopHint可以解决您的问题。

答案 6 :(得分:0)

只需在show()之后致电setWindowFlags()