PyQt只打开一个子窗口,并使用父风最小化它

2024-05-23 21:57:50 发布

您现在位置:Python中文网/ 问答频道 /正文

这个想法是从父窗口菜单打开一个子窗口,当我最小化父窗口时,子窗口也必须最小化,并且只能打开一个子窗口。 当父窗口最小化时,我有最小化子窗口的解决方案,但是我可以多次打开子窗口(尽管子窗口已经打开),并且我想禁用打开多个子窗口。在

父窗口主窗口.py

class MainWindow(QtGui.QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setWindowTitle('Parent window')
        self.flags = QtCore.Qt.Window
        self.ControlPanel = Control_panel_window()

        self.createActions()
        self.createMenus()

    def createActions(self):
        #    window - menu
        self.windowShowControlPanelAction = QtGui.QAction(self.tr("&Control panel"), self, statusTip='Control panel')        
        self.connect(self.windowShowControlPanelAction, QtCore.SIGNAL("triggered()"), self.ShowControlPanel)

    def createMenus(self):
        #    window
        self.windowMenu = QtGui.QMenu(self.tr("&Window"), self)
        self.windowMenu.addAction(self.windowShowControlPanelAction)
        self.menuBar().addMenu(self.windowMenu)

    def ShowControlPanel(self):
        self.ControlPanel = Control_panel_window(self)
        self.ControlPanel.setWindowFlags(QtCore.Qt.Window)
        self.ControlPanel.show()

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    win = MainWindow()
    win.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
    win.show() 
    sys.exit(app.exec_())

子窗口儿童窗口.py

^{pr2}$

问题是:如何设置只打开一个子窗口?在


Tags: pyselfdefwindowqtwincontrolpanel
1条回答
网友
1楼 · 发布于 2024-05-23 21:57:50

在您的ShowControlPanel函数中,每次触发信号时都会创建一个新的控制面板。既然你已经有了一个可用的实例,为什么不改用它呢?在

class MainWindow(QtGui.QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setWindowTitle('Parent window')
        self.flags = QtCore.Qt.Window

        self.control_panel = ControlPanelWindow(self)
        self.control_panel.setWindowFlags(self.flags)

    #...

    def create_actions(self):
        self.show_control_panel_action = QtGui.QAction(
            self.tr("&Control panel"),
            self,
            statusTip='Control panel'
            )       
        self.show_control_panel_action.triggered.connect(self.show_control_panel)

    #...

    def show_control_panel(self):
        self.control_panel.show()

一些文体注释:

  • 尝试遵循PEP8官方的python编码风格指南。这包括将CamelCase用于类,lowercase_with_underscore用于几乎所有其他类。在本例中,,因为Qt使用halfCamelCase作为方法等,您可以使用它来保持一致性。在
  • 使用new-style signal syntax

    ^{pr2}$

    而不是:

    self.connect(the_object, QtCore.SIGNAL('signal_name'), function)
    

    它不仅读起来更好,而且提供了更好的调试信息。如果信号不存在,使用QtCore.SIGNAL你将不会收到错误(例如,你写了一个类似trigered()而不是triggered())的错误。新的语法会引发一个异常,在这种情况下,您将能够更早地更正错误,而不必猜测为什么某些内容无法正常工作,也不必搜索整个代码库以查找键入错误。

相关问题 更多 >