【问题标题】:Master PyQt5 GUI with pushbuttons that open additional GUI使用可打开其他 GUI 的按钮的主 PyQt5 GUI
【发布时间】:2019-08-11 19:58:12
【问题描述】:

使用 Python3 和 PyQt5,我想要一个带有按钮的 GUI,当按下该按钮时,会打开另一个也有按钮和其他控件的小部件。将来,主 GUI 将有许多按钮,可以打开许多额外的小部件。我正在寻找一个带有嵌入式 matplotlib.pyplot 的小部件。目前,我正在努力打开第二个小部件。

主程序

import sys

from PyQt5 import QtWidgets

from gui import Ui_MainWindow as Ui_MainWindow1
from gui2 import Ui_MainWindow as Ui_MainWindow2

class Window(QtWidgets.QMainWindow, Ui_MainWindow1):

    def __init__(self, parent=None):
        super(Window, self).__init__(parent)

        self.ui_gui = Ui_MainWindow1()
        self.ui_gui.setupUi(self)


        self.pb.clicked.connect(self.on_pb_clicked)
        self.graph = Graph(self)

    def on_pb_clicked(self):

        print('pb clicked')
        self.graph.show()


class Graph(QtWidgets.QMainWindow, Ui_MainWindow2):

    def __init__(self, parent=None):
        super(Graph, self).__init__(parent)

        self.ui_graph = Ui_MainWindow2()
        self.ui_graph.setupUi(self)


if __name__ == "__main__":
    #import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow1()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

gui = gui2。两者都如下所示。

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(282, 219)
        self.centralWidget = QtWidgets.QWidget(MainWindow)
        self.centralWidget.setObjectName("centralWidget")
        self.pb = QtWidgets.QPushButton(self.centralWidget)
        self.pb.setGeometry(QtCore.QRect(100, 60, 75, 23))
        self.pb.setObjectName("pb")
        MainWindow.setCentralWidget(self.centralWidget)
        self.menuBar = QtWidgets.QMenuBar(MainWindow)
        self.menuBar.setGeometry(QtCore.QRect(0, 0, 282, 21))
        self.menuBar.setObjectName("menuBar")
        MainWindow.setMenuBar(self.menuBar)
        self.mainToolBar = QtWidgets.QToolBar(MainWindow)
        self.mainToolBar.setObjectName("mainToolBar")
        MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.mainToolBar)
        self.statusBar = QtWidgets.QStatusBar(MainWindow)
        self.statusBar.setObjectName("statusBar")
        MainWindow.setStatusBar(self.statusBar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pb.setText(_translate("MainWindow", "pb"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

我想单击 gui 上的按钮并显示 gui2。 NB gui 将来不会等于 gui2。

【问题讨论】:

    标签: python widget pyqt5


    【解决方案1】:

    由于WindowGraph 分别继承自Ui_Window1Ui_Window2,您应该在Window.__init__Graph.__init__ 中调用self.setupUi(self),而不是创建Ui_Window1Ui_Window2 的单独实例,即

    class Window(QtWidgets.QMainWindow, Ui_MainWindow1):
    
        def __init__(self, parent=None):
            super(Window, self).__init__(parent)
    
            self.setupUi(self)
            self.pb.clicked.connect(self.on_pb_clicked)
            self.graph = Graph(self)
    
            # just to see the two windows side-by-side
            self.move(500, 400)
            self.graph.move(self.x()+self.width()+20, self.y())
    
        def on_pb_clicked(self):
            print('pb clicked')
            self.graph.show()
    
    
    class Graph(QtWidgets.QMainWindow, Ui_MainWindow2):
    
        def __init__(self, parent=None):
            super(Graph, self).__init__(parent)
            self.setupUi(self)
    

    程序的主要部分应该是这样的

    if __name__ == "__main__":
        #import sys
        app = QtWidgets.QApplication(sys.argv)
        MainWindow = Window()
        MainWindow.show()
        app.exec()
    

    【讨论】:

    • 非常感谢。我在那有一段时间。我需要这一切吗:def __init__(self, parent=None): super(Window, self).__init__(parent)。或者这也可以削减?
    【解决方案2】:

    您使用QMetaObject::connectSlotsByName() 启用on_pb_clicked() 槽的自动调用。

    您不需要使用self.pb.clicked.connect(self.on_pb_clicked) 你需要@QtCore.pyqtSlot()

    import sys
    from PyQt5 import QtCore, QtGui, QtWidgets
    from gui_1 import Ui_MainWindow as Ui_MainWindow1
    from gui_2 import Ui_MainWindow as Ui_MainWindow2
    
    class Graph(QtWidgets.QMainWindow, Ui_MainWindow2):
        def __init__(self, parent=None):
            super(Graph, self).__init__(parent)
            self.setupUi(self)
    
            self.setWindowTitle("window Graph")
            self.setGeometry(QtCore.QRect(850, 260, 282, 219))
    #        self.pb.clicked.connect(self.on_pb_clicked)         # ---
    
        @QtCore.pyqtSlot()                                       # +++
        def on_pb_clicked(self):       
            print('pb clicked -> Graph')
    
    
    class Window(QtWidgets.QMainWindow, Ui_MainWindow1):
        def __init__(self):
            super().__init__()
            self.setupUi(self)
    
            self.setWindowTitle("main Window")
    #        self.pb.clicked.connect(self.on_pb_clicked)         # ---
            self.graph = Graph(self) 
    
        @QtCore.pyqtSlot()                                       # +++
        def on_pb_clicked(self): 
            print('pb clicked -> "main Window')
            self.graph.show()
    
    
    if __name__ == "__main__":
        app = QtWidgets.QApplication(sys.argv)
        w = Window()
        w.show()
        sys.exit(app.exec_())
    

    【讨论】:

      猜你喜欢
      • 2021-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-13
      • 2021-10-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多