有没有办法从pyqt4中的类方法创建信号而不是总是使用实例方法?
我有一个包装类,它在QLineEdit和QCheckBox组合之间包装和存储状态。该类对类变量中QLineEdit中的所有值求和。如果未选中QCheckBox,则从总计中扣除相关行编辑的值。如果用户编辑QLineEdit,则会扣除旧值并添加新值。我希望每次从类级别更改时都会发出更新的值。
现在我正在做的是传递QLineEdit实例,我将该值转储到所有包装器实例并通过它连接。
我喜欢做的是使用以下代码段。
QtCore.QObject.connect(Wrapper,Wrapper.sum_values_signal, line_edit_instance.setText)
但事实并非如此。这是我的包装类供参考:
class Wrapper(QtCore.QObject):
sum_values = 0
sum_values_signal = QtCore.pyqtSignal(str)
def __init__(self, line_edit, check_box):
super(QtCore.QObject, self).__init__()
self.check_box = check_box
self.line_edit = line_edit
Wrapper.sum_values += float(line_edit.text())
self.previous_value = float(line_edit.text())
QtCore.QObject.connect(self.check_box,
QtCore.SIGNAL(_fromUtf8("toggled(bool)")),
self.update_sum_values_wrt_check_box)
QtCore.QObject.connect(self.line_edit,
QtCore.SIGNAL(_fromUtf8("textChanged(QString)")),
self.update_sum_values_wrt_line_edit)
def update_sum_values_wrt_check_box(self, toggled):
if toggled is False:
Wrapper.sum_values -= self.previous_value
else:
Wrapper.sum_values += self.previous_value
self.sum_values_signal.emit(text(Wrapper.sum_values))
def update_sum_values_wrt_line_edit(self, string):
Wrapper.sum_values -= self.previous_value
Wrapper.sum_values += float(string)
self.previous_value = float(string)
self.sum_values_signal.emit(text(Wrapper.sum_values))
答案 0 :(得分:1)
要在班级中定义自定义信号,您需要使用pyqtSignal工厂。这是一个简单的例子:
class CustomWidget(QtGui.QWidget):
# No argument signal
custom_signal = QtCore.pyqtSignal()
# Signal with int argument and a custom name
custom_signal_int = QtCore.pyqtSignal(int, name='integerSignal')
def atSomePointEvent(self, event):
value = event.someValue()
if isinstance(value, int):
self.custom_signal_int.emit(value)
else:
self.custom_signal.emit()
请注意,它使用new style signals使得实现非常简单明了。
编辑:这就是你应该如何连接信号:
self.check_box.toggled.connect(self.check_box_toggled)
self.line_edit.textChanged.connect(self.line_edit_changed)
然后你的代码可能会失败,因为当QLineEdit为空时你没有处理ValueError
上的float(line_edit.text())
。
此外,您的计划肯定存在一些功能性问题,主要与您处理sum_values
和previous_value
的方式有关。您还可以考虑删除sum_value
类属性,因为它似乎是错误的设计选择。
from PyQt4 import QtCore, QtGui
class CustomLabel(QtGui.QLabel):
def __init__(self, line_edit_lst):
super(CustomLabel, self).__init__("0")
self.line_edit_lst = line_edit_lst
for line_edit in self.line_edit_lst:
line_edit.textChanged.connect(self.update)
def update(self, ignore):
total = sum(self.str_to_float(line_edit.text())
for line_edit in self.line_edit_lst)
self.setText(str(total))
def str_to_float(self, string, default=0):
try: return float(string)
except ValueError: return default
class MyDialog(QtGui.QDialog):
def __init__(self, parent=None):
super(MyDialog, self).__init__(parent)
hbox = QtGui.QVBoxLayout()
self.lines = [QtGui.QLineEdit() for _ in range(5)]
for line in self.lines:
hbox.addWidget(line)
self.label = CustomLabel(self.lines)
hbox.addWidget(self.label)
self.setLayout(hbox)
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
w = MyDialog()
w.show()
sys.exit(app.exec_())