在pyqt主窗口的子对话框中配置小组件

时间:2014-01-11 18:17:59

标签: python pyqt qt-designer

我有一个带有主对话框的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'

我需要在代码中更改以在子对话框中配置窗口小部件吗?

2 个答案:

答案 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