无法获取自定义ItemDeleg

2024-10-01 15:28:31 发布

您现在位置:Python中文网/ 问答频道 /正文

首先,我是python和pyqt的新手,所以请忍受我。在

Im使用QTableView和QSqlTableModel,一切正常。 视图的最后一列只包含0和1作为值,我想将其显示为复选框,此列应该是可编辑的。在

我读到你应该像我一样给QItemDelegate子类。不幸的是,我的表不会将最后一列显示为复选框。在

我试图使用setItemDelegateForColumn()只为最后一列设置委托(我希望如此),但没有成功。因此,我修改了它,并使用setItemDelegate()只对最后一列的请求作出反应,为整个QTableView设置它。还是不行。Wont-work意味着没有错误消息,它只是不会按我说的做;)似乎我重新实现的所有方法都不会被调用,除了init()。所以我想我错过了一些基本的东西。在

我提取了相关的代码行,KSCheckBoxDelegate是我的子类。这是为整个QTableView设置委托的版本。在


-- code from applications main class --
self.taglist = QTableView()
self.tagmodel = QSqlTableModel()
self.tagmodel.setTable("data")
self.tagmodel.select()
self.taglist.setModel(self.tagmodel)
print self.taglist.itemDelegate()
myDel = KSCheckBoxDelegate(self)
myDel.colnumber = 3
self.taglist.setItemDelegate(myDel)


-- KSCheckBoxDelegate.py --
from PyQt4.QtGui import *

class KSCheckBoxDelegate(QStyledItemDelegate):

    colnumber = None

    def __init__ (self, parent = None):
        print "KSCheckBoxDelegate::init"
        QStyledItemDelegate.__init__(self, parent)

    def createEditor(self, parent, option, index):
        print "KSCheckBoxDelegate::createEditor"
        if index.column()==self.colnumber:
            return QCheckBox(self)
        else:
            return QStyledItemDelegate.createEditor(self, parent, option, index)

    def setEditorData (self, editor, index):
        print "KSCheckBoxDelegate::setEditorData"
        if index.column() == self.colnumber:
            cont = index.model().data(index, Qt.DisplayRole).toString()
            if cont == "1":
                editor.setCheckState(Qt.Checked)
            else:
                editor.setCheckState(Qt.UnChecked)
        else:
            QStyledItemDelegate.setEditorData(self,editor, index)

    def setModelData (self, editor, model, index):
        print "KSCheckBoxDelegate::setModelData"
        if index.column() == self.colnumber:
            if editor.checkBox.checkState() == Qt.Checked:
                model.setData(index, 1)
            else:
                model.setData(index, 0)
        else:
            QStyledItemDelegate.setModelData(self, editor, model, index)

关于这个问题有什么提示吗?在

此外,我对QTableViews selectionModel的currentChanged()信号有困难。我正在打印所选内容的右上角坐标。当我用鼠标左键单击时,我总是得到错误的索引(不是无效的)。使用光标键可以得到正确的索引。使用selectionChanged()具有相同的行为。我实际上得到了QTableView的第二个最后选定单元格的坐标。例如,我单击坐标<;1,1>;<;2,1>;第二次单击将显示坐标<;1,1>;。在

^{pr2}$

我自己修好的,用QTableView.currentIndex()而不是selectionModel.SelectedIndex():)

最后一次使用OnManualSubmit作为editStrategy在调用submitl()时不会抛出错误(返回false),但也不会保存数据。它与选择OnFieldChange作为编辑策略一起工作。我可以忍受,但不是我想做的。在

谢谢你的时间。在

地垒


Tags: selfindexmodelifinitdefelseeditor
2条回答

至少我设法让我的代表在显示和编辑模式下显示具有正确状态的复选框。因为我找不到一个完整的描述如何做,我将分享它。也许其他ppl试图做一些类似的事情,但从未与qt合作过。在

只缺了一件事,那就是项目是可编辑的,我想这与我在我的开场白中问的标志问题有关。在

在KSCheckBoxDelegate.py在


class KSCheckBoxDelegate(QStyledItemDelegate):
    def __init__ (self, parent = None):
        print "KSCheckBoxDelegate::init"
        QStyledItemDelegate.__init__(self, parent)

    def createEditor(self, parent, option, index):
        print "KSCheckBoxDelegate::createEditor"
        return QCheckBox(parent)

    def setEditorData (self, editor, index):
        print "KSCheckBoxDelegate::setEditorData"
        cont = index.model().data(index, Qt.DisplayRole).toString()
        if cont == "1":
            editor.setCheckState(Qt.Checked)
        else:
            editor.setCheckState(Qt.Unchecked)

    def setModelData (self, editor, model, index):
        print "KSCheckBoxDelegate::setModelData"
        if editor.checkState() == Qt.Checked:
            model.setData(index, 1)
        else:
            model.setData(index, 0)

    def paint (self, painter, option, index):
        myopt = QStyleOptionViewItemV4(option)
        newopt = QStyleOptionButton()
        newopt.rect = myopt.rect
        newopt.palette = myopt.palette
        if index.data().toBool():
            newopt.state |= QStyle.State_On
        QApplication.style().drawControl(QStyle.CE_CheckBox, newopt, painter)

    def sizeHint (self, option, index):
        return 18

我认为基于QSqlTableModel创建自己的模型会更简单,对于0/1列,为QDisplayRole返回QVariant(),对于Qt::CheckStateRole返回Qt::Checked/Qt::Unchecked,具体取决于值。对于所有其他情况,返回QSqlTableModel::data

class MySqlTableModel: public QSqlTableModel
{
public:
// contructors
    QVariant data(const QModelIndex & index, int role = Qt::DisplayRole)
    {
        if(index.column() == 3 /* your 0/1 column */)
        {
            if(role == Qt::DisplayRole)
            {
                return QVariant();
            }
            else if(role == Qt::CheckStateRole)
            {
                QString value = QSqlTableModel::data(index, Qt::DisplayRole).toString();
                return value == "1" ? Qt::Checked : Qt::Unchecked;
            }
        }

        return QSqlTableModel::data(index, role);
    }
};

我知道这是C++代码,但是逻辑还是一样的,所以只需为Python

重新调整它即可。

相关问题 更多 >

    热门问题