我有一个带有主对话框的GUI应用程序,我添加了一个按钮。 按下按钮会添加另一个“对话框”,用户必须输入一些值。 两个Ui文件都是用QTDesigner编写的,“对话框”有一个“QtableWidget”,对象名称为“tableCo”我不知道为什么我不能改变这个tableWidget的属性:
from PyQt4 import QtGui, QtCore, Qt
from Main_Window import Ui_Dialog as Dlg
from dialog import Ui_MyDialog
class MainDialog(QtGui.QDialog, Dlg):
def __init__(self):
QtGui.QDialog.__init__(self)
self.setupUi(self)
self.connect(self.buttonOK,
QtCore.SIGNAL("clicked()"), self.onOK)
self.connect(self.buttonAbbrechen,
QtCore.SIGNAL("clicked()"), self.onClose)
self.connect(self.Button,
QtCore.SIGNAL("clicked()"), self.on_Button_clicked)
def on_Button_clicked(self, checked=None):
if checked==None: return
dialog = QtGui.QDialog()
dialog.ui = Ui_MyDialog()
dialog.ui.setupUi(dialog)
dialog.setAttribute(QtCore.Qt.WA_DeleteOnClose)
dialog.exec_()
some_list=["A","B","C"]
#a list in another python class from another script that changes so
#the table properties have to be changed dynamically
#here I just take a simple list as an example
#the following two lines do not work (they work if tableCo is an
#object in the Main Dialog
self.tableCo.setColumnCount(len(some_list))
self.tableCo.setHorizontalHeaderLabels(some_list)
def onOK:
...
def onClose:
...
如果我按下按钮,我会看到我的“tableCo”小部件,但是标题的属性没有改变,关闭此子对话框后,我收到以下错误消息
Traceback (most recent call last):
File "C:/gui.py", line 88, in on_Button_clicked
self.tableCo.setColumnCount(len(some_list))
AttributeError: 'MainDialog' object has no attribute 'tableCo'
我需要在代码中更改以在子对话框中配置窗口小部件吗?
答案 0 :(得分:2)
on_Button_clicked
中的代码存在两个问题。
首先,您在对话框关闭后尝试调用方法。调用exec_
时,对话框将进入阻塞循环,直到用户关闭对话框。当对话框关闭时,以下行将执行,但在该函数返回后,对话框将立即被垃圾收集。
其次,您尝试使用self
访问对话框的方法,而不是通过本地名称dialog
来访问,这就是您获得AttributeError
的原因。
您可以通过为MainDialog
类创建第二个对话框的子类来解决这些问题:
class SubDialog(QtGui.QDialog, Ui_MyDialog):
def __init__(self, some_list, parent=None):
QtGui.QDialog.__init__(self, parent)
self.setupUi(self)
self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
self.tableCo.setColumnCount(len(some_list))
self.tableCo.setHorizontalHeaderLabels(some_list)
class MainDialog(QtGui.QDialog, Dlg):
...
def on_Button_clicked(self, checked=None):
if checked is None: return
dialog = SubQDialog(some_list)
dialog.exec_()
答案 1 :(得分:0)
你确定tableCo
有这个确切的名字吗?它直接作为MainWindow的父级?似乎没有简单地更新属性,因为没有self.tableCo
。