Domanda

Ho una famiglia di classi (basate sulla stessa classe genitore) che sono celle di dati in un QTableWidget (quindi sono tutte derivate da QItemDelegate).

Sto cercando di creare un segnale che queste classi possano trasmettere al controller per comunicare le modifiche ai dati.

Non riesco a trovare la giusta combinazione (nonostante molti esperimenti e letture) che sia stata realizzata.Ecco la struttura della mia classe:

Classe base:

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

Esempio di sottoclasse (solo le parti rilevanti - LMK se sono necessarie maggiori informazioni):

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
    ....

Ecco la parte rilevante della mia master class:

@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)

Il codice precedente fornisce "L'oggetto C++ sottostante è stato eliminato".Ho provato questo:

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

Eventuali suggerimenti?Non è necessario utilizzare questo metodo, ma è piuttosto necessario un modo per estrarre i dati dai singoli controlli.

TIA

Mike

È stato utile?

Soluzione

Sono davvero imbarazzato per questo.Spero che questo possa aiutare qualcun altro.

Non ho chiamato l'inizializzazione Qt per l'oggetto appropriato:

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

E

class Criteria(QItemDelegate):
    def __init__(self):
        QItemDelegate.__init__(self)       # <<<<----- This was missing before

Altri suggerimenti

criteri.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())

sì_no_forse.py

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

sì_no.py

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

main.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_()
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top