PyQt向QDialog类传递变量:QGIS插件开发中的数据填充问题
解决QDialog静态方法中传递变量的问题
嘿,我来帮你梳理下问题所在,以及怎么修复它。
核心问题分析
你的代码里有两个关键问题导致变量无法正确传递和使用:
- 静态方法
getData创建了全新的mydi实例:这个方法里你新建了dialog = mydi(None),完全没用到你之前初始化dia = mydi(pass_in_var)时传入的pass_in_var,而且直接传了None,这就是为什么填充QPlainTextEdit时会报错类型为None。 - 调用
dia.getData()和实例dia无关:因为getData是静态方法,调用它的时候并不会使用你已经创建好的dia实例,而是执行静态方法内部的逻辑,返回的是那个新创建的、变量为空的dialog的内容。
解决方案
这里给你两种可行的修复方案,根据你的需求选择:
方案一:把getData改成实例方法(推荐)
既然你已经创建了mydi的实例,直接用这个实例来处理弹窗逻辑就好,不需要静态方法:
import sys from PyQt4.QtCore import * from PyQt4.QtGui import * class mydi(QDialog): def __init__(self, pass_var, parent=None): super(mydi, self).__init__(parent) layout = QVBoxLayout(self) self.pass_var = pass_var print(pass_var) # 这里会正确输出传入的变量 self.txt_comments = QPlainTextEdit(self) self.txt_comments.appendPlainText(pass_var) layout.addWidget(self.txt_comments) self.buttons = QDialogButtonBox( QDialogButtonBox.Ok | QDialogButtonBox.Cancel, Qt.Horizontal, self) layout.addWidget(self.buttons) self.buttons.accepted.connect(self.accept) self.buttons.rejected.connect(self.reject) def comments(self): return self.txt_comments.toPlainText() # 改成实例方法,去掉@staticmethod def getData(self): self.exec_() return self.comments() def main(): app = QApplication([]) pass_in_var = "test" dia = mydi(pass_in_var) data = dia.getData() print(data) # 现在会正确输出弹窗里的内容 if __name__ == "__main__": main()
方案二:保留静态方法,但让它接收变量参数
如果你确实需要用静态方法来创建弹窗,那得让它接收pass_var参数,这样才能把外部变量传进去:
import sys from PyQt4.QtCore import * from PyQt4.QtGui import * class mydi(QDialog): def __init__(self, pass_var, parent=None): super(mydi, self).__init__(parent) layout = QVBoxLayout(self) self.pass_var = pass_var print(pass_var) self.txt_comments = QPlainTextEdit(self) self.txt_comments.appendPlainText(pass_var) layout.addWidget(self.txt_comments) self.buttons = QDialogButtonBox( QDialogButtonBox.Ok | QDialogButtonBox.Cancel, Qt.Horizontal, self) layout.addWidget(self.buttons) self.buttons.accepted.connect(self.accept) self.buttons.rejected.connect(self.reject) def comments(self): return self.txt_comments.toPlainText() @staticmethod def getData(pass_var, parent=None): # 把传入的pass_var传给mydi实例 dialog = mydi(pass_var, parent) dialog.exec_() return dialog.comments() def main(): app = QApplication([]) pass_in_var = "test" # 直接调用静态方法并传入变量 data = mydi.getData(pass_in_var) print(data) if __name__ == "__main__": main()
补充说明
你提到的“打印传入的变量会同时返回该变量和None”,其实是因为你创建dia时__init__里的print pass_var输出了"test",而之后调用getData时,静态方法里新创建的实例pass_var是None,可能你混淆了两次输出。修复后就不会有这个问题了。
内容的提问来源于stack exchange,提问作者WillemB
相关产品推荐
相关产品推荐

