引用MDI应用程序中的属性

时间:2014-11-12 03:51:12

标签: python attributes pyqt qt-designer

我刚刚在PyQt中了解选项卡式视图和MDI。我很困惑如何引用其中一个标签上的行编辑小部件。当我查看对象检查器时,我看到:

MainWindow
  centralwidget
    mdiArea
     subwindow
      gridlayout
        wt1

我希望在代码中引用wt1。我该怎么做?

我收到以下错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\218003107\AppData\Local\Continuum\Anaconda\lib\site-  packages\spyderlib\widgets\externalshell\sitecustomize.py", line 580, in runfile
  execfile(filename, namespace)
  File "C:/Users/218003107/callphreeqcInput.pyw", line 38, in <module>
    myapp=MyForm()
  File "C:/Users/218003107/callphreeqcInput.pyw", line 10, in __init__
    self.connect(self.ui.wt1,QtCore.SIGNAL('textChanged()'),self.wtResult)
AttributeError: 'Ui_MainWindow' object has no attribute 'wt1'

我的代码如下所示:

import sys
from PyQt4 import QtCore, QtGui
from phreqMDI import Ui_MainWindow

class MyForm(QtGui.QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(MyForm,self).__init__(parent)
        self.ui=Ui_MainWindow()
        self.ui.setupUi(self) 
        self.connect(self.ui.wt1,QtCore.SIGNAL('textChanged()'),self.wtResult)
        self.connect(self.ui.wt2,QtCore.SIGNAL('textChanged()'),self.wtResult)
        self.connect(self.ui.wt3,QtCore.SIGNAL('textChanged()'),self.wtResult)
        self.connect(self.ui.wt4,QtCore.SIGNAL('textChanged()'),self.wtResult)     

    def wtResult(self):
        if len(self.ui.wt1.text())!=0:
            a=float(self.ui.wt1.text())
        else:
            a=0
        if len(self.ui.wt2.text())!=0:
            b=float(self.ui.wt2.text())
        else:
            b=0
        if len(self.ui.wt3.text())!=0:
            c=float(self.ui.wt3.text())
        else:
            c=0
        if len(self.ui.wt4.text())!=0:
            c=float(self.ui.wt4.text())
        else:
            d=0                      
        sum=a+b+c+d
        self.ui.wt_total.setText(str(sum)) 

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    myapp=MyForm()
    myapp.show()
    app.exec_()

1 个答案:

答案 0 :(得分:0)

问题是pyuic不会自动将子窗口添加到mdi-area。这对我来说似乎是个错误,但我自己从未使用过mdi-areas,所以也许我错过了一些东西。

无论如何,您可以通过自己添加子窗口来解决问题,如下所示:

    self.ui.mdiArea.addSubWindow(self.ui.subwindow)
    self.ui.mdiArea.addSubWindow(self.ui.subwindow_2)

有关详细信息,请参阅QMdiArea docs

<强>更新

信号连接不起作用的原因是您使用了错误的签名。使用old-style method连接信号时,这是一个非常常见的错误,因此我建议切换到new-style method,如下所示:

    self.ui.wt1.editingFinished.connect(self.wtResult)
    self.ui.wt2.editingFinished.connect(self.wtResult)
    self.ui.wt3.editingFinished.connect(self.wtResult)
    self.ui.wt4.editingFinished.connect(self.wtResult)

请注意,我在此处使用了editingFinished信号,因此仅评估完整条目。如果您使用textChanged信号,则wtResult方法会尝试评估中间条目(例如"2."),这会产生错误。

您应该在输入字段中考虑setting a validator,以便只能输入数值。