我知道蛮力的方式来做我想做的事,但我非常确定有一种更优雅的方式来完成我的任务。所以我在寻找比强力方式更好的方法寻求帮助。有没有更优雅或更简单的方法来实现我的目标?
我有一个类似电子表格的应用程序,在网格上有21行5列。第一行的第一列只是用户输入的权重值(w1,w2,w3,w4)。第5列将权重值相加。我有这个工作正常,不需要太多的帮助。
行2到20的复杂性。对于每行,用户在列1:4中输入值,然后在列5中计算行的加权平均值(使用行1中的权重)。例如,对于任何给定的行,如果用户输入的值进入名为va1,va2,va3,va4的QLineEdit小部件,则va_wa = va1 * w1 + va2 * w2 + va3 * w3 + va4 * w4。
这对于单行代码很容易做到。但我不知道如何完成另一行,而不是一遍又一遍地复制代码并更改每行的名称(暴力方式)。
这里是我的代码:
class MyForm(QtGui.QMainWindow):
def __init__(self, parent=None):
super(MyForm,self).__init__(parent)
self.ui=Ui_MainWindow()
self.ui.setupUi(self)
self.ui.mdiArea.addSubWindow(self.ui.subwindow)
self.ui.mdiArea.addSubWindow(self.ui.subwindow_2)
QtCore.QTimer.singleShot(10, lambda: self.ui.mdiArea.setActiveSubWindow(self.ui.mdiArea.subWindowList()[0]))
self.ui.wt1.editingFinished.connect(self.runBoth)
self.ui.wt2.editingFinished.connect(self.runBoth)
self.ui.wt3.editingFinished.connect(self.runBoth)
self.ui.wt4.editingFinished.connect(self.runBoth)
self.ui.ca1.editingFinished.connect(self.waCalc)
self.ui.ca2.editingFinished.connect(self.waCalc)
self.ui.ca3.editingFinished.connect(self.waCalc)
self.ui.ca4.editingFinished.connect(self.waCalc)
def runBoth(self):
self.wtResult()
self.waCalc()
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:
d=float(self.ui.wt4.text())
else:
d=0
sum=a+b+c+d
self.ui.wt_total.setText(str(sum))
def waCalc(self):
if len(self.ui.ca1.text())!=0:
ca1=float(self.ui.ca1.text())
else:
ca1=0
if len(self.ui.ca2.text())!=0:
ca2=float(self.ui.ca2.text())
else:
ca2=0
if len(self.ui.ca3.text())!=0:
ca3=float(self.ui.ca3.text())
else:
ca3=0
if len(self.ui.ca4.text())!=0:
ca4=float(self.ui.ca4.text())
else:
ca4=0
if len(self.ui.wt1.text())!=0:
wt1=float(self.ui.wt1.text())
else:
wt1=0
if len(self.ui.wt2.text())!=0:
wt2=float(self.ui.wt2.text())
else:
wt2=0
if len(self.ui.wt3.text())!=0:
wt3=float(self.ui.wt3.text())
else:
wt3=0
if len(self.ui.wt4.text())!=0:
wt4=float(self.ui.wt4.text())
else:
wt4=0
wa=(wt1*ca1)+(wt2*ca2)+(wt3*ca3)+(wt4*ca4)
self.ui.ca_wa.setText(str(wa))
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
myapp=MyForm()
myapp.show()
app.exec_()
所以我所示,其中该行已CA1,CA2,CA3,CA4,ca_wa的例子。我会为接下来的19行做什么(除了复制wa_Calc代码19次并将变量改为nx1:4,nx_wa ab1:4,ab_wa,ba1:4,ba_wa ...等等。我知道还有更多优雅的方法
虽然这不是QTable。它是100个单独的QLineEdit项目,看起来有点像一张表格(20行,每行有5个QLineEdits)。这种方法仍然有效吗? – user3720101 2014-11-22 17:13:43
用'getattr'将单独的QLineEdits放入列表中,您只需要给它们正确的名称。 – Daniel 2014-11-22 17:18:26
我得到一个回溯错误: 回溯(最近通话最后一个): 文件 “”,1号线,在 ... 文件 “C:/Users/callphreeqcInput1.pyw” 18行,在__init__ (1,20) AttributeError:'Ui_MainWindow'对象没有属性'ca1_1' 当你说我必须给QLineEdits一个正确的名字时,我不清楚这意味着什么。所有的QLineEdits都有一个对象名称;例如ca1,ca2,ca3,ca4,ca_wa,nx1,nx2,nx3,nx4,nx_wa。这是使用QtDesigner设置的。 我是否需要返回到QtDesigner并保留所有100个QLineEdits? 对不起,简单的问题;只是学习。 –
user3720101
2014-11-22 17:56:08