使用pyqt4创建类信号

2024-03-29 07:29:56 发布

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

有没有一种方法可以从pyqt4中的类方法创建信号,而不是总是使用实例方法?在

我有一个包装类,它包装并存储QLineEdit和QCheckBox组合之间的状态。该类将QLineEdit中的所有值相加到一个类变量中。如果未选中QCheckBox,则关联行编辑的值将从总计中扣除。如果用户编辑QLineEdit,则将扣除旧值并添加新值。我希望每次它从类级别更改时都发出更新的值。在

现在我要做的是传入一个QLineEdit实例,将值转储到该实例中,然后通过所有包装器实例将其连接起来。在

我想做的是让下面的代码片段工作。在

QtCore.QObject.connect(Wrapper,Wrapper.sum_values_signal, line_edit_instance.setText)

但事实并非如此。以下是我的包装类以供参考:

^{pr2}$

Tags: 实例方法用户编辑信号状态级别wrapper
1条回答
网友
1楼 · 发布于 2024-03-29 07:29:56

为了在类中定义自定义信号,需要使用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,这使得实现非常漂亮和直接。在

编辑:你应该这样连接信号:

^{pr2}$

那么您的代码可能会失败,因为当QLineEdit为空时,您没有处理float(line_edit.text())上的ValueError。在

此外,程序中肯定存在一些功能问题,本质上与您处理sum_values和{}的方式有关。您还可以考虑去掉sum_valueclass属性,因为它似乎是错误的设计选择。在

编辑:顺便问一下,这就是你要做的吗?在

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_())

相关问题 更多 >