【问题标题】:How to access a widget in a QMainWindow from a QDialog如何从 QDialog 访问 QMainWindow 中的小部件
【发布时间】:2019-03-19 04:20:18
【问题描述】:

在发布我的问题之前,我搜索了很多关于它的问题,我发现了一些可能相似的问题,但它们并没有解决我的问题。我相信这很容易,但我不知道如何:

以下是该问题的一个最小示例:

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        #MainWindow.setObjectName("MainWindow")
        MainWindow.setEnabled(True)
        MainWindow.resize(574, 521)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.centralwidget)
        self.firstPushButton = QtWidgets.QPushButton(self.centralwidget)
        self.firstLineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.firstPushButton.clicked.connect(self.showDialog)

        # the other stuff related to layout setup is ommited

    def showDialog(self):
        dialog = MyDialog(MainWindow)
        dialog.exec()

class MyDialog(QtWidgets.QDialog):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setFixedSize(400, 200)
        self.myButton = QtWidgets.QPushButton("Write something")
        # When I click the myButton, I want it to change the text of MainWindow lineEdit
        self.myButton.clicked.connect(self.writeHello)

    def writeHello(self):
      # How can I access firstLineEdit from MainWindow? I want to write "Hello" to the firstLineEdit
      pass

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.setWindowTitle("BEM Analysis for propellers")
    MainWindow.show()
    sys.exit(app.exec())

您能告诉我如何实现writeHello() 方法以便在主窗口的firstLineEdit 中写一些东西

谢谢

【问题讨论】:

    标签: python python-3.x pyqt pyqt5


    【解决方案1】:

    首先你不应该修改Qt Designer生成的代码,因为它不是一个GUI,它只是一个填充GUI的类,并且带来了一些不便,例如无法覆盖小部件的方法,或者您想在该类中使用小部件的方法。相反,它继承自一个合适的小部件并使用另一个类作为接口。

    你不应该混合这些类,因为它们之间会有很多依赖关系,将来如果你修改一个类,你将不得不修改另一个是无与伦比的,而是使用信号来通知任何更改或操作。

    from PyQt5 import QtCore, QtGui, QtWidgets
    
    class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
            #MainWindow.setObjectName("MainWindow")
            MainWindow.setEnabled(True)
            MainWindow.resize(574, 521)
            MainWindow.setWindowIcon(QtGui.QIcon(':/icons/drone.ico'))
            MainWindow.setIconSize(QtCore.QSize(32, 32))
            self.centralwidget = QtWidgets.QWidget(MainWindow)
            MainWindow.setCentralWidget(self.centralwidget)
            self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.centralwidget)
            self.firstPushButton = QtWidgets.QPushButton(self.centralwidget)
            self.firstLineEdit = QtWidgets.QLineEdit(self.centralwidget)
            self.verticalLayout_2.addWidget(self.firstPushButton)
            self.verticalLayout_2.addWidget(self.firstLineEdit)
    
    class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
        def __init__(self, parent=None):
            super(MainWindow, self).__init__(parent)
            self.setupUi(self)
            self.firstPushButton.clicked.connect(self.showDialog)
    
        def showDialog(self):
            dialog = MyDialog()
            dialog.clicked.connect(self.writeHello)
            dialog.exec()
    
        @QtCore.pyqtSlot()
        def writeHello(self):
            self.firstLineEdit.setText('Hello')
    
    class MyDialog(QtWidgets.QDialog):
        clicked = QtCore.pyqtSignal()
    
        def __init__(self, parent=None):
            super().__init__(parent)
            self.setFixedSize(400, 200)
            self.myButton = QtWidgets.QPushButton("Write something")
            # When I click the myButton, I want it to change the text of MainWindow lineEdit
            self.myButton.clicked.connect(self.clicked)
            lay = QtWidgets.QVBoxLayout(self)
            lay.addWidget(self.myButton)
    
    if __name__ == "__main__":
        import sys
        app = QtWidgets.QApplication(sys.argv)
        w = MainWindow()
        w.setWindowTitle("BEM Analysis for propellers")
        w.show()
        sys.exit(app.exec())
    

    【讨论】:

    • 谢谢。我决定转向 PyCharm 以获得智能,并通过获取对行编辑的引用找到了一种方法:line_edit = self.parent().centralWidget().children()[index_of_the_line_edit]
    • @IamNotaMathematician 我知道这是现在简单的解决方案,但将来会很头疼,例如如果 Ui_MainWindow 有几个 QLineEdits 你如何确定你必须使用哪个 QLineEdit写?,而不是用我的方法你不应该修改任何东西。
    • @IamNotaMathematician 对于一个问题,有很多解决方案,但目前有一些简单的解决方案,但不像您自己获得的那样可维护,有些解决方案可以长期维护最初涉及更多像我的代码。恕我直言,我更喜欢最初实现更多代码,而不是在修改某些类时在其他类中进行修改。
    • @IamNotaMathematician 我建议你总是问,例如在我扩展的 cmets 中,我已经扩展了你所问的内容,通常最有经验的用户不仅会给出解决方案,而且我们会尝试给出一个使用最佳实践的解决方案。
    • @IamNotaMathematician 在self.myButton.clicked.connect(self.clicked) 之后添加self.myButton.clicked.connect(self.accept)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-24
    • 2014-04-08
    • 1970-01-01
    • 1970-01-01
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多