Как получить доступ к виджету в QMainWindow из QDialog - PullRequest
2 голосов
/ 19 марта 2019

Прежде чем опубликовать свой вопрос, я много об этом искал и нашел несколько вопросов, которые могут быть похожими, но они не решают мою проблему.Я считаю, что это довольно просто, но я не знаю, как:

ниже - минимальный пример проблемы:

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 в MainWindow

Спасибо

1 Ответ

4 голосов
/ 19 марта 2019

Прежде всего, вы не должны изменять код, сгенерированный 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())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...