代码之家  ›  专栏  ›  技术社区  ›  Mike Crowe

Pyqt4类间信令

  •  1
  • Mike Crowe  · 技术社区  · 15 年前

    我有一系列类(基于同一父类),它们是qTableWidget中的数据单元(因此它们都是从qitemDelegate派生的)。

    我正在尝试创建一个信号,这些类可以传递给控制器来传递数据更改。

    我找不到合适的组合(尽管做了很多实验和阅读)。这是我的班级结构:

    基类:

    class Criteria(QItemDelegate):
        def bind(self, update):
            self.connect(self,SIGNAL("criteriaChange(int,  int, QVariant)"),update)    
    
        def emitCommitData(self):
            self.emit(SIGNAL("criteriaChange(int,  int, QVariant)"), self.Row, self.Col, self.getValue())
    

    示例子类(仅相关部分——如果需要更多信息,则为lmk):

    class YesNo(Criteria):
        ....
        def createEditor(self, parent, option, index):
            self.comboBox = QComboBox(parent)
            for item in self.getChoices():
                self.comboBox.addItem(item)
            self.comboBox.activated.connect(self.emitCommitData) 
            return self.comboBox
        ....
    

    这是我的硕士课程的相关部分:

    @pyqtSlot(int,  int, QVariant,  name='criteriaChanged')
    def setItem(self,  row,  col,  item):
        print row, col, item.toString()     # TODO:  Remove when tested
        self.Data[row][col] = item.toString()
    
    def addCriteria(self, row, cname, ctype):
        self.setDirty()
        c = YesNo(cname, "YesNo")
        c.bind(self.setItem)
    

    上面的代码给出了一个“基础C++对象已经被删除”。我试过了:

    def addCriteria(self, row, cname, ctype):
        self.setDirty()
        c = YesNo(cname, "YesNo")
        self.connect(c,SIGNAL("criteriaChange(int,  int, QVariant)"),self.setItem)
    

    有什么建议吗?我不需要使用这个方法,而是需要一种方法来从单独的控件中获取数据。

    蒂亚

    迈克

    2 回复  |  直到 15 年前
        1
  •  1
  •   Mike Crowe    15 年前

    我真的很尴尬。希望这能帮助别人。

    我没有为适当的对象调用qt初始化:

    class YesNo(Criteria):
        def __init__(self,  name,  ctype):
            Criteria.__init__(self)            # <<<<----- This was missing before
            self.Name = name
            self.Index = ctype
    

    class Criteria(QItemDelegate):
        def __init__(self):
            QItemDelegate.__init__(self)       # <<<<----- This was missing before
    
        2
  •  0
  •   Jesse Aldridge    15 年前

    标准Py

    def criteria_change(row, col, new_value):
        print "change at", row, col, "new_value:", new_value
    
    class Criteria:
        def __init__(self, row, col):
            self.row, self.col = row, col
    
        def on_change(self):
            criteria_change(self.row, self.col, self.value())
    

    叶思诺

    from PyQt4.QtGui import *
    
    from criteria import Criteria
    
    class YesNoMaybe(Criteria):
        def create_editor(self):
            group_box = QGroupBox()
            layout = QVBoxLayout()
            group_box.setLayout(layout)
            self.buttons = []
    
            for s in ["yes", "no", "maybe"]:
                button = QRadioButton(s)
                self.buttons.append(button)
                layout.addWidget(button)
                button.toggled.connect(self.on_toggle)
    
            return group_box
        #
    
        def on_toggle(self, is_now_on):
            if is_now_on:
                self.on_change()
    
        def value(self):
            for button in self.buttons:
                if button.isChecked():
                    return button.text()
    #
    

    耶斯诺

    from PyQt4.QtGui import QComboBox
    
    from criteria import Criteria
    
    class YesNo(Criteria):
        def create_editor(self):    
            combo_box = self.combo_box = QComboBox()
            for s in ["red", "blue"]:
                combo_box.addItem(s)
            combo_box.activated.connect(self.on_change) 
            return combo_box
        #
    
        def value(self):
            return self.combo_box.currentText()
    #
    

    Me.Py

    import sys
    
    from PyQt4.QtGui import *
    
    from yes_no_maybe import YesNoMaybe
    from yes_no import YesNo
    
    app = QApplication(sys.argv)
    
    
    table_classes = [[YesNo, YesNo],
                     [YesNoMaybe, YesNoMaybe]]  
    
    table = QTableWidget(len(table_classes), len(table_classes[0]))
    table.criteria = []
    for r, cls_row in enumerate(table_classes):
        criteria_row = []
        table.criteria.append(criteria_row)
        for c, criteria_cls in enumerate(cls_row):
            criteria = criteria_cls(r, c)
            criteria_row.append(criteria)
            table.setCellWidget(r, c, criteria.create_editor())
    
    table.setRowHeight(1, 100)
    table.show()
    
    app.exec_()