سؤال

لدي عائلة من الفصول الدراسية (بناء على نفس الطبقة الأصل) التي هي خلايا البيانات في 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)

أي اقتراحات؟ ليس لدي استخدام هذه الطريقة، بل بحاجة إلى وسيلة للحصول على هذه البيانات من عناصر التحكم الفردية.

تيا

مايك

هل كانت مفيدة؟

المحلول

أنا حقا بالحرج من هذا. نأمل أن يساعد ذلك شخص آخر.

لم أتصل بتهيئة 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

نصائح أخرى

المعايير

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

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

yes_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_()
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top