14

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

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

showEvent 调用后,我的窗口显示但未激活。我试图重载显示功能:

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

但这对我没有帮助。

编辑: 当我评论线

this->setWindowFlags(Qt::Tool);

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

编辑:

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

7 回答 7

14

Windows 管理器决定

在我开始之前:正如elcucoJavier所指出的,焦点策略和窗口布局的其他方面(例如标题栏)属于对各自窗口管理器的实质性扩展,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_TOOLWINDOWQt::ToolSW_SHOWNOACTIVATE

于 2009-07-07T21:29:39.823 回答
4

尝试使用 QApplication::setActiveWindow()

于 2009-07-03T20:22:08.307 回答
4

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

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

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

(*):很棒的文件!有点过时;但工具窗口已被使用并考虑

于 2009-07-03T23:07:45.763 回答
1

哪个操作系统?哪个Qt4?

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

于 2009-06-27T15:39:12.273 回答
0

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

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

于 2009-06-29T17:36:11.547 回答
0

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

表示小部件是一个工具窗口。工具窗口通常是一个小窗口,具有比通常的标题栏和装饰更小的窗口,通常用于工具按钮的集合。如果有父级,则工具窗口将始终保留在其之上。如果没有父级,您也可以考虑使用 Qt::WindowStaysOnTopHint。如果窗口系统支持它,工具窗口可以用稍微轻一点的框架来装饰。它也可以与 Qt::FramelessWindowHint 结合使用

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

于 2009-07-04T09:00:14.970 回答
0

show()之后打电话setWindowFlags()

于 2010-04-12T10:01:15.567 回答