gpt4 book ai didi

python - 如何从 QDialog 访问 QMainWindow 中的小部件

转载 作者:行者123 更新时间:2023-11-28 22:12:03 25 4
gpt4 key购买 nike

在发布我的问题之前,我进行了很多搜索,发现了一些可能相似但无法解决我的问题的问题。我相信这很容易,但我不知道怎么做:

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

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() 方法以便在 MainWindow 的 firstLineEdit 中写一些东西吗

谢谢

最佳答案

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

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

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())

关于python - 如何从 QDialog 访问 QMainWindow 中的小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55233602/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com