【问题标题】:Pyqt docks get hidden when window minimized and restored当窗口最小化和恢复时,Pyqt 停靠栏被隐藏
【发布时间】:2014-01-01 21:40:56
【问题描述】:

当我在 Windows XP 上最小化应用程序窗口并稍后恢复时,停靠栏将被隐藏。这与视图菜单有关,该菜单具有设置可见性的切换开关,当然是通过信号连接的。

我希望这可以为某人节省几个小时的调试时间。

这是一个完整的功能示例,包含错误和正确的代码:

# -*- coding: utf-8 -*-
import sys
from PyQt4 import QtCore, QtGui

class Ui_QMainWindow(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.resize(200, 200)
        self.menubar = QtGui.QMenuBar(self)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 27))
        self.menuMenu = QtGui.QMenu(self.menubar)
        self.setMenuBar(self.menubar)
        self.dock = QtGui.QDockWidget(self)
        self.dock.setObjectName("dock")
        self.dockContents = QtGui.QWidget()
        self.dockContents.setObjectName("dockContents")
        self.dock.setWidget(self.dockContents)
        self.addDockWidget(QtCore.Qt.DockWidgetArea(4), self.dock)
        self.action = QtGui.QAction(self)
        self.action.setCheckable(True)
        self.action.setChecked(True)
        self.action.setObjectName("action")
        self.menuMenu.addAction(self.action)
        self.menubar.addAction(self.menuMenu.menuAction())

        self.setWindowTitle("Example of dock remaining minimized")
        self.menuMenu.setTitle("Menu")
        self.dock.setWindowTitle("I'm a dock")
        self.action.setText("Dock visibility")

        if True:
            # This is NOT working on Windows XP.
            # Minimize the window and restore again, the dock is gone.
            # Other than that it works.
            QtCore.QObject.connect(self.action,
                                   QtCore.SIGNAL("toggled(bool)"),
                                   self.dock.setVisible)
            QtCore.QObject.connect(self.dock,
                                   QtCore.SIGNAL("visibilityChanged(bool)"),
                                   self.action.setChecked)
        else:
            # This DOES work, but boy it looks nasty, writing useless
            # per dock is not nice.
            QtCore.QObject.connect(self.action,
                                   QtCore.SIGNAL("triggered()"),
                                   self.toggle_dock)
            QtCore.QObject.connect(self.dock,
                                   QtCore.SIGNAL("visibilityChanged(bool)"),
                                   self.action.setChecked)

    def toggle_dock(self):
        self.dock.setVisible(not self.dock.isVisible())

def main():
    app = QtGui.QApplication(sys.argv)
    ui = Ui_QMainWindow()
    ui.show()
    sys.exit(app.exec_())

if __name__ == "__main__":
    main()

【问题讨论】:

  • 这不是一个真正的问题,但有一个更简单的方法来处理这个问题,所以我还是提供了一个答案。

标签: windows pyqt4 restore minimize dock


【解决方案1】:

有一个更简单的方法可以做到这一点,使用QDock.toggleViewAction。该函数返回一个自动处理选中状态的现成动作。

所以你的代码会变得简单:

    self.action = self.dock.toggleViewAction()
    self.action.setObjectName("action")
    self.menuMenu.addAction(self.action)
    self.menubar.addAction(self.menuMenu.menuAction())

    self.setWindowTitle("Example of dock remaining minimized")
    self.menuMenu.setTitle("Menu")
    self.dock.setWindowTitle("I'm a dock")
    self.action.setText("Dock visibility")

然后你就可以摆脱所有的信号处理。

【讨论】:

  • 嘿,非常感谢。这要容易得多。是否可以使用 QtDesigner 做到这一点?
  • @mhv。我不这么认为。我通常只使用mainwindow.findChildren(QDockWidget) 获取停靠小部件的列表,然后在__init__ 中添加带有循环的操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-28
  • 1970-01-01
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-29
相关资源
最近更新 更多