我刚刚在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_()
答案 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,以便只能输入数值。