C++ Qt子类QStyledItemDelegate不提供列的编辑

C++ Qt子类QStyledItemDelegate不提供列的编辑,c++,qt,model,C++,Qt,Model,我将QStyledItemDelegate细分为子类,以提供对QTableView的编辑,我的问题是,该委托似乎从未被称为witch,这意味着如果双击,则没有编辑行为。另外,我检查了函数签名,它们看起来是正确的 学生笔记 更新: 我使用了QStyledItemDelegate,而不是子类QSqlQueryModel,并重新实现了标志、数据和setData QTableView现在是可编辑的,但当我点击enter键时,它会重置回默认值,我注意到从未调用setData。我现在缺少什么?您的主要问题是

我将QStyledItemDelegate细分为子类,以提供对QTableView的编辑,我的问题是,该委托似乎从未被称为witch,这意味着如果双击,则没有编辑行为。另外,我检查了函数签名,它们看起来是正确的

学生笔记

更新:

我使用了QStyledItemDelegate,而不是子类QSqlQueryModel,并重新实现了标志、数据和setData

QTableView现在是可编辑的,但当我点击enter键时,它会重置回默认值,我注意到从未调用setData。我现在缺少什么?

您的主要问题是QSqlQueryModel,它是只读模型。正如博士所说:

默认情况下,该模型为只读。要使其读写,您必须 子类化它并重新实现setData和flags。另一个选择是 使用QSqlTableModel,它提供了基于 单一数据库表

所以编辑委托在这里没有意义。因此,尝试使用QSqlTableModel或当前模型的子类

同样,在当前委托中,尝试在每个方法中调用默认实现,就像在createEditor中那样

但子类化可能是一个很长的过程,所以尝试只使用QSqlTableModel。假设您的代码现在看起来像:

QSqlQueryModel *mmm = new QSqlQueryModel;
mmm->setQuery("SELECT * FROM newTab");
QTableView *view = new QTableView;
view->setItemDelegate(new ItemDelegate);
view->setModel(mmm);
view->show();
然后将其更改为:

QSqlTableModel *mmm = new QSqlTableModel(this,sdb);
mmm->setTable("newTab");
mmm->setEditStrategy(QSqlTableModel::OnManualSubmit);
mmm->select();
QTableView *view = new QTableView;
view->setItemDelegate(new ItemDelegate);
view->setModel(mmm);
view->show();

这就是您所需要的,item delegate正在工作,现在我在我的计算机上测试了它,它在我的项目中升级后可以工作,对QSqlQueryModel或QSortFilterProxyModel进行子分类并不能满足我的需要,所以我切换到QStandardItemModel,因为我需要一些只读的行和列

将某些列设置为只读: StudentNotesModel::StudentNotesModel行、int列、QObject*父 :QStandardItemModelrows、columns、parent { }

将某些行设置为只读:

for (int row = 0; row < numRows ; ++row) {
    for (int col = 0; col < numColumns; ++col) {
        QStandardItem *item = new QStandardItem("0");
        if (row == 7 || row == 8)) {
            item->setFlags(item->flags() & ~Qt::ItemIsEditable);
        }

        model->setItem(row, col, item);

在createEditor中,使用return-QStyledItemDelegate::createEditorparent,option,index;当列不是0,1,2,3时,请尝试在其他方法中调用此委托的默认实现toosetEditorData等,以便您建议对当前模型进行子类化,建议将QSqlQueryModel子类化并使其可编辑还是将其设为QabstracteModel。@请参见我的编辑,我测试了它,它可以工作,我认为使用QSqlTableModel可以节省您的时间,因为QSqlQueryModel子类可能很长。不幸的是,QSqlTableModel不适合我的情况,因为我正在链接两个表以获取数据,而且数据不能立即提交到数据库,而是等待用户点击保存按钮。@HAßdøµ在文档中阅读此行的作用:mmm->setEditStrategyQSqlTableModel::OnManualSubmit;它没有立即提交更改,但它仍然不适合我的情况,因为我的查询连接多个表。更新问题后,请查看我的SQL查询。
QSqlQueryModel *mmm = new QSqlQueryModel;
mmm->setQuery("SELECT * FROM newTab");
QTableView *view = new QTableView;
view->setItemDelegate(new ItemDelegate);
view->setModel(mmm);
view->show();
QSqlTableModel *mmm = new QSqlTableModel(this,sdb);
mmm->setTable("newTab");
mmm->setEditStrategy(QSqlTableModel::OnManualSubmit);
mmm->select();
QTableView *view = new QTableView;
view->setItemDelegate(new ItemDelegate);
view->setModel(mmm);
view->show();
Qt::ItemFlags StudentNotesModel::flags(const QModelIndex &index) const {
    Qt::ItemFlags flags = QStandardItemModel::flags(index);
    // Line 1,2, and 3 are read only
    if (index.column() < 3) {
        flags &= ~Qt::ItemIsEditable;
    }

    if (index.row() > index.model()->rowCount()) {
        qDebug() << index.row();
        flags &= ~Qt::ItemIsEditable;
    }

    return flags;
}

StudentNotesModel *model = new StudentNotesModel;
for (int row = 0; row < numRows ; ++row) {
    for (int col = 0; col < numColumns; ++col) {
        QStandardItem *item = new QStandardItem("0");
        if (row == 7 || row == 8)) {
            item->setFlags(item->flags() & ~Qt::ItemIsEditable);
        }

        model->setItem(row, col, item);