如何使用最小化/最大化窗口控件显示 Qt.Tool 窗口?

Posted

技术标签:

【中文标题】如何使用最小化/最大化窗口控件显示 Qt.Tool 窗口?【英文标题】:How to show Qt.Tool window with minimize/maximize windows controls? 【发布时间】:2016-07-08 07:51:11 【问题描述】:

我有……

class ToolWindow(QtWidgets.QMainWindow):
    """Generic window to be used as non-modal tool

    Usage:
        tool_win = ToolWindow()
        layout = QtWidgets.QHBoxLayout()
        button = QtWidgets.QPushButton('hello')
        layout.addWidget(button)
        tool_win.setup(layout)
        button.released.connect(lambda: print('hello'))
        tool_win.show()
    """
    def __init__(self):
        super(ToolWindow, self).__init__()

    def setup(self, layout,
              window_title='Untitled', object_name=None, tool=True):
        """Setup tool window"""
        if tool:
            self.setWindowFlags(QtCore.Qt.Tool)

        self.widget = QtWidgets.QWidget()
        self.widget.setLayout(layout)
        self.setCentralWidget(self.widget)
        self.setWindowTitle(window_title)

    def closeEvent(self, event):
        """Delete object when closed"""
        self.deleteLater()

但是,我希望将典型的最大化和最小化窗口控件添加到窗口中。我尝试将以下内容添加到 ToolWindow 类但没有成功(工具窗口仍然不显示最大化/最小化窗口控件):

self.setWindowFlags(self.windowFlags() |
                    QtCore.Qt.WindowSystemMenuHint |
                    QtCore.Qt.WindowMinMaxButtonsHint)

是否可以将这些控件添加到工具窗口中?

或者,我可以创建一个非模态窗口,但它始终位于我的父应用程序顶部并显示最大化/最小化窗口控件?

请注意,我不希望这个工具窗口停留在我系统上所有窗口的顶部。我只希望它始终位于我的应用程序之上。

【问题讨论】:

您应该说明需要在哪些平台上运行。 【参考方案1】:

您应该能够只使用QMainWindow 类而无需任何标志。只要 工具窗口 是主应用程序窗口的子窗口,它将保持在它的顶部(但不是来自其他应用程序的窗口,就像您设置“窗口保持在顶部”一样标志)。

您需要更改您的 __init__ 以接受父参数

def __init__(self, parent):
    super(ToolWindow, self).__init__(parent)

如果您有多个工具窗口,并且您希望它们按特定顺序保持在顶部,您可以调用 my_tool_window.raise_() 将其置于 z 顺序的顶部。

Qt 附带window flags example。您可能需要检查一下,以了解不同的标志如何影响窗口显示和行为。

【讨论】:

以上是关于如何使用最小化/最大化窗口控件显示 Qt.Tool 窗口?的主要内容,如果未能解决你的问题,请参考以下文章

Qt中如何利用 png 图片来实现自定义形状的窗口

QT中|Qt::Tool类型窗口自动退出消息循环问题解决(setQuitOnLastWindowClosed必须设置为false,最后一个窗口不显示的时候,程序会退出消息循环)

mfc 窗口大小变化时,如何让窗口内部控件也一起随比例改变位置?

Qt:如何在非活动窗口中显示选定的文本

用户控件不适合屏幕

.NET Timer 控件在窗口最小化时运行得更快