我有一个Qgroupbox,它包含Qcombobox和Qlabel,我想从Qcombobox中选择一个值并将其显示为Qlabel。我有完整的代码,即使我在函数中打印前后值,一切都正常工作,只显示setText
不会将文本设置为Qlabel并更新它。在
当前屏幕
我想要什么
我已经更正了信号代码,当其中的Qgroupbox
出现或值发生变化时,self.activation.connect(......)
将发出索引的int
。为了确保可以工作,我在def setdatastrength(self, index)
内打印it-value
,见下图,它确实工作,然后参数将传递给函数self.concreteproperty.display_condata(it)
,并在def display_condata(self, value)
内打印值,以确保值传递,如下图所示,它确实有效。此行代码self.con_strength_value.setText(fmt.format(L_Display))
不会给Qlabel赋值。在
剧本
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
class secondtabmaterial(QtWidgets.QWidget):
def __init__(self, parent=None):
super(secondtabmaterial, self).__init__(parent)
self.concretewidgetinfo = ConcreteStrengthInFo()
Concrete_Group = QtWidgets.QGroupBox(self)
Concrete_Group.setTitle("&Concrete")
Concrete_Group.setLayout(self.concretewidgetinfo.grid)
class ConcreteStrengthComboBox(QtWidgets.QComboBox):
def __init__(self, parent = None):
super(ConcreteStrengthComboBox, self).__init__(parent)
self.addItems(["C12/15","C16/20","C20/25","C25/30","C30/37","C35/45"
,"C40/50","C45/55","C50/60","C55/67","C60/75","C70/85",
"C80/95","C90/105"])
self.setFont(QtGui.QFont("Helvetica", 10, QtGui.QFont.Normal, italic=False))
self.compressive_strength = ["12","16","20","25","30","35","40",
"45","50","55","60","70","80","90"]
class ConcreteProperty(QtWidgets.QWidget):
def __init__(self, parent=None):
super(ConcreteProperty, self).__init__(parent)
self.setFont(QtGui.QFont("Helvetica", 10, QtGui.QFont.Normal, italic=False))
concretestrength_lay = QtWidgets.QHBoxLayout(self)
fctd = "\nfcd\n\nfctd\n\nEc"
con_strength = QtWidgets.QLabel(fctd)
self.con_strength_value = QtWidgets.QLabel(" ")
concretestrength_lay.addWidget(con_strength)
concretestrength_lay.addWidget(self.con_strength_value, alignment=QtCore.Qt.AlignRight)
self.setLayout(concretestrength_lay)
@QtCore.pyqtSlot(int)
def display_condata(self, value):
try:
L_Display = str(value)
print("-------- After ------")
print(L_Display, type(L_Display))
fmt = "{}mm"
self.con_strength_value.setText(fmt.format(L_Display))
except ValueError:
print("Error")
class ConcreteStrengthInFo(QtWidgets.QWidget):
def __init__(self, parent=None):
super(ConcreteStrengthInFo, self).__init__(parent)
self.concreteproperty = ConcreteProperty()
self.concretestrengthbox = ConcreteStrengthComboBox()
self.concretestrengthbox.activated.connect(self.setdatastrength)
hbox = QtWidgets.QHBoxLayout()
concrete_strength = QtWidgets.QLabel("Concrete strength: ")
hbox.addWidget(concrete_strength)
hbox.addWidget(self.concretestrengthbox)
self.grid = QtWidgets.QGridLayout()
self.grid.addLayout(hbox, 0, 0)
self.grid.addWidget(self.concreteproperty, 1, 0)
@QtCore.pyqtSlot(int)
def setdatastrength(self, index):
it = self.concretestrengthbox.compressive_strength[index]
self.concreteproperty.display_condata(it)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
w = secondtabmaterial()
w.show()
sys.exit(app.exec_())
以上代码是正确的和最终的。现在它正常工作了。在
我认为问题是你的接收槽与任何可用的
.activated
信号都不匹配。在QComboBox.activated
信号发出索引的int
,或所选值的str
。See documentation。在您已经将它附加到
^{pr2}$setdatastrength
,它接受不接受任何参数(除了来自对象的self
),这意味着它与任何可用信号的签名都不匹配,并且不会被调用。如果您更新定义以添加索引值,并接受单个int
它应该可以工作。在在更新之后-上面的问题看起来已经修复了,虽然您不需要在
setdatastrength
中添加index = self.currentIndex()
,但它不会造成任何伤害。在看看你的代码,我认为标签正在更新。问题是你根本看不到标签。正在查看
ConcreteProperty
的初始化更改没有出现的原因是您创建了两个对象,一个在
ConcreteStrengthInfo
中,一个在ConcreteStrengthComboBox
中。对组合框的更新会触发附加到组合框的ConcreteProperty
的更新,而不是另一个(它们是单独的对象)。可见的ConcreteProperty
不受影响。在要实现这一点,您需要将signal attachment+slot移出组合框对象。以下是这两部分的替代品-
这对我在当地很管用。在
相关问题 更多 >
编程相关推荐