首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QItemDelegate CheckBox

QItemDelegate CheckBox
EN

Stack Overflow用户
提问于 2017-12-30 01:08:22
回答 1查看 1.7K关注 0票数 0

因此,我在Maya中使用python和PySide2作为定制工具。

我有一个模型(QTableModel)和一个QTableView。

模型中的每一行都有一堆信息和一个复选框。

我必须做一个QItemDelegate并使用它作为复选框。这很好。如果那个代表被检查了,我就很难得到。

我通过模型迭代获取其数据(将其存储在节点中的Maya场景中)

代码语言:javascript
复制
    data = []
    rows = self.rowCount(1) #self is the model in this snnipet
    for row in range(rows):
        array = []
        for column in range (6): #6 for the fixed number of columns
            info = index.data()
            array.append(index.data())
        data.append(array)

而且,每行中的第一个项目是一个复选框(委托)。在最终的数据数组中,当我真正想要获得它的状态时,我最终得到的是实际的QItemDelegate对象,不管是否被选中,但是它没有isChecked()方法。

关于如何得到它的想法?

非常感谢!

########编辑1

因此,模型确实在注释中提到了标志:

代码语言:javascript
复制
def flags(self, index):
        return QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsUserCheckable

我想我做错了代表,我承认,我在网上发现了这个冷嘲热讽,我正在努力理解它.但事情是这样的:

代码语言:javascript
复制
class CBDelegate(QItemDelegate):

def __init__(self, parent):

    QItemDelegate.__init__(self, parent)


def paint(self, painter, option, index):

    self.cb = QCheckBox()

    try:
        self.cb.setChecked(index.data())
    except:
        pass

    if not self.parent().indexWidget(index):
        self.parent().setIndexWidget(index, self.cb)

然后,在TableView:

代码语言:javascript
复制
 self.setItemDelegateForColumn(0, CBDelegate(self))

有用吗?(如果你有玛雅2017年,我可以给你整个密码.这是一种混乱,因为我用它作为一个学习练习!

谢谢。

############编辑2

表视图:

代码语言:javascript
复制
class Table(QTableView):
    def __init__(self, *args, **kwargs):
        QTableView.__init__(self, *args, **kwargs)

        # Set the delegate for column 0 of our table
        #self.setItemDelegateForColumn(6, ButtonDelegate(self)) #problem for another time
        self.setItemDelegateForColumn(0, CBDelegate(self))

型号:

代码语言:javascript
复制
class Model(QtCore.QAbstractTableModel):

    def __init__(self, cycles = [[]], headers = [], parent = None):
        QtCore.QAbstractTableModel.__init__(self, parent)

        self.cycles = cycles
        self.headers = headers

    def rowCount(self, parent):

        return len(self.cycles)

    def columnCount(self, parent):
        return len(self.cycles[0])

    def flags(self, index):
        return QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsUserCheckable

    def data(self, index, role):

        if role == QtCore.Qt.DisplayRole:

            row = index.row()
            column = index.column()
            value = self.cycles[row][column]
            return value

        if role == QtCore.Qt.EditRole:

            row = index.row()
            column = index.column()
            return self.cycles[row][column]

        if (role == QtCore.Qt.TextAlignmentRole):
            return QtCore.Qt.AlignCenter;

    def setData(self, index, value, role = QtCore.Qt.EditRole):

        change = False

        if role == QtCore.Qt.EditRole:

            row = index.row()
            column = index.column()

            value = value

            if (column == 1) or (column == 4):
                try:
                    str(value)
                    change = True
                except:
                    pm.warning("Not a valid name")
                    change = False
            elif (column == 2):
                try:
                    int(value)
                    change = True
                except:
                    pm.warning("Not a valid frame")
                    change = False
            elif (column == 3):
                try:
                    int(value)
                    change = True
                except:
                    pm.warning("Not a valid frame")
                    change = False

            elif (column == 5):
                try:
                    int(value)
                    change = True
                except:
                    pm.warning("Not a valid version number")
                    change = False

            if change:
                self.cycles[row][column] = value
                self.dataChanged.emit(row, column)
                return True

            return False            

    def headerData(self, section, orientation, role):

        if role == QtCore.Qt.DisplayRole:

            if orientation == QtCore.Qt.Horizontal:
                return self.headers[section]

    def insertRows(self, position, rows, values = [] , parent = QtCore.QModelIndex()):


        self.beginInsertRows(parent, position, position+rows-1)

        self.cycles.insert(position, values)

        self.endInsertRows()

        self.getData()



    def getData(self):

        rows = self.rowCount(1)

        data = []

        for row in range(rows):
            array = []
            for column in range (6):
                index = self.index(row, column)
                info = index.data()

                if type(info) == bool:
                    array.append(info)

                elif type(info) == QItemDelegate:
                    val_is_checked = index.data(QtCore.Qt.CheckStateRole) != QtCore.Qt.Unchecked
                    array.append(val_is_checked)

                else:
                    info = str(info)
                    array.append(info)

            array.append("del")
            data.append(array)

        dic = {}
        for item in data:
            dic[item[1]]=item

        for key in dic:
            print key, dic[key]


        #this from pickle
        #newData = data2String(dic)
        # and this is what I wanna save inside Maya
        #pm.setAttr("cycleAnimationListNode.cycles", newData)

代表在编辑1,上面。

那么,我想您仍然需要循环和头来启动这个模型:

代码语言:javascript
复制
headers = ["Select", "  Cycle Name  ", " Start ", "  End  ", "Info", "Version", " Del "]

cycles = [[False,"idle","1","70","cool information","0", "deleteBtnPlaceHolder"]]

我希望这能行。

谢谢。

编辑3

我在模型中有一个自定义方法:

代码语言:javascript
复制
def getData(self):
        rows = self.rowCount(1)
        data = []
        for row in range(rows):
            array = []
            for column in range (6):
                index = self.index(row, column)
                info = index.data()
                array.append(info)              
            data.append(array)

        dic = {}
        for item in data:
            dic[item[1]]=item

        print ""
        print "data:"
        print ''
        for key in dic:
            print(key, dic[key])

我使用它将模型转换成字典,这样我就可以序列化它,并将其存储为Autodesk中节点的字符串属性。它运行正常,但是它从第一列获得的信息总是没有。我必须以不同的方式找回它吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-30 19:07:57

如果要显示QCheckBox,则不必使用委托,只需正确启用标志Qt::ItemIsUserCheckable,此外,还必须通过setData()保存信息,因为在代码中,由于存储在下一节中的信息显示了经过以下修改的模型,因此信息丢失:

更新:

以前禁用了第一列的角色Qt::DisplayRole的数据方法的返回,因为它将文本放置在表中,这对我来说是不必要的,现在我已经启用了它,但是由于文本没有显示,所以我放置了一个删除文本的委托。

代码语言:javascript
复制
from PySide2.QtWidgets import *
from PySide2.QtCore import *

class Model(QAbstractTableModel):
    def __init__(self, cycles = [[]], headers = [], parent = None):
        QAbstractTableModel.__init__(self, parent)
        self.cycles = cycles
        self.headers = headers
        self.values_checked = []

    def rowCount(self, parent):
        return len(self.cycles)

    def columnCount(self, parent):
        return len(self.cycles[0])

    def flags(self, index):
        fl = Qt.ItemIsEnabled | Qt.ItemIsSelectable 
        if index.column() == 0:
            fl |= Qt.ItemIsUserCheckable
        else:
            fl |= Qt.ItemIsEditable
        return fl

    def data(self, index, role):
        if not index.isValid():
            return 
        row = index.row()
        column = index.column()

        if role == Qt.DisplayRole:
            value = self.cycles[row][column]
            return value

        elif role == Qt.TextAlignmentRole:
            return Qt.AlignCenter;

        elif role == Qt.CheckStateRole and column==0:
            return Qt.Checked if self.cycles[row][column] else Qt.Unchecked


    def setData(self, index, value, role = Qt.EditRole):
        change = False
        row = index.row()
        column = index.column()

        if role == Qt.CheckStateRole:
            value =  value != Qt.Unchecked
            change = True
        if role == Qt.EditRole:
            if (column == 1) or (column == 4):
                try:
                    str(value)
                    change = True
                except:
                    pm.warning("Not a valid name")
                    change = False
            elif (column == 2):
                try:
                    int(value)
                    change = True
                except:
                    pm.warning("Not a valid frame")
                    change = False
            elif (column == 3):
                try:
                    int(value)
                    change = True
                except:
                    pm.warning("Not a valid frame")
                    change = False

            elif (column == 5):
                try:
                    int(value)
                    change = True
                except:
                    pm.warning("Not a valid version number")
                    change = False
        if change:
            self.cycles[row][column] = value
            self.dataChanged.emit(row, column)
            return True
        return False            

    def headerData(self, section, orientation, role):
        if role == Qt.DisplayRole:
            if orientation == Qt.Horizontal:
                return self.headers[section]

    def insertRows(self, position, rows, values = [] , parent =QModelIndex()):
        self.beginInsertRows(parent, position, position+rows-1)
        self.cycles.insert(position, values)
        self.endInsertRows()
        self.getData()

    def roleNames(self):
        roles = QAbstractTableModel.roleNames(self)
        roles["Checked"] = Qt.CheckStateRole
        return roles


    def getData(self):
            rows = self.rowCount(1)
            data = []
            for row in range(rows):
                array = []
                for column in range (6):
                    index = self.index(row, column)
                    info = index.data()
                    array.append(info)              
                data.append(array)

            dic = {}
            for item in data:
                dic[item[1]]=item

            print("")
            print("data:")
            print('')
            for key in dic:
                print(key, dic[key])


class EmptyDelegate(QStyledItemDelegate):
    def paint(self, painter, option, index):
        opt = QStyleOptionViewItem(option)
        self.initStyleOption(opt, index)
        opt.text = ""
        QApplication.style().drawControl(QStyle.CE_ItemViewItem, opt, painter)


if __name__ == '__main__':
    import sys

    app = QApplication(sys.argv)
    w = QTableView()
    w.setItemDelegateForColumn(0, EmptyDelegate(w))
    headers = ["Select", "  Cycle Name  ", " Start ", "  End  ", "Info", "Version", " Del "]
    cycles = [[True,"idle","1","70","cool information","0", "deleteBtnPlaceHolder"]]
    model = Model(cycles, headers)
    w.setModel(model)
    w.show()
    sys.exit(app.exec_())
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48030027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档