문제

나는 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

다른 팁

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

예 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