引用MDI应用程序中的属性

2024-09-27 09:32:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在学习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_()

Tags: textinselfuisignalifconnectline
1条回答
网友
1楼 · 发布于 2024-09-27 09:32:30

问题是pyuic不会自动将子窗口添加到mdi区域。这对我来说似乎是个bug,但我自己从来没有使用过mdi区域,所以可能我遗漏了一些东西。你知道吗

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

    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,以便只能输入数值。你知道吗

相关问题 更多 >

    热门问题