首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QSqlTableModel::removeRow()无法工作--设置QSqlTableModel::OnManualSubmit

QSqlTableModel::removeRow()无法工作--设置QSqlTableModel::OnManualSubmit
EN

Stack Overflow用户
提问于 2020-10-12 15:32:19
回答 1查看 203关注 0票数 0

我正在从使用EditStrategy OnRowChange工作的DB表中删除一行。如果我设置了OnManualSubmit,它就不能工作。我在QML端和C++函数中执行C++(),但是行没有被删除。

我继承QSqlTableModel作为MDataBaseTableModel,因为我需要在QML中显示来自SQLite DB的图像。

所以我不明白为什么removeRow()会在EditStragy::OnRowChange上工作,而不会在EditStragy::onManualSubmit上工作

以下是代码:

MDatabaseTableModel.cpp

代码语言:javascript
复制
MDataBaseTableModel::MDataBaseTableModel(QObject *parent, QSqlDatabase db,QString table):
QSqlTableModel(parent, db)
{
setEditStrategy(QSqlTableModel::OnManualSubmit);
setTable(table);
select();
}

QVariant MDataBaseTableModel::data(const QModelIndex &index, int role) const
{
QVariant value;

if (index.isValid()) {
    if (role < Qt::UserRole) {
        value = QSqlTableModel::data(index, role);
    } else {
        int columnIdx = role - Qt::UserRole - 1;
        QModelIndex modelIndex = this->index(index.row(), columnIdx);
        value = QSqlTableModel::data(modelIndex, Qt::DisplayRole);
        if(roleNames().value(role) == "sqlImageData")
            return QImage::fromData(value.toByteArray());
    }
}
return value;
}

QHash<int, QByteArray> MDataBaseTableModel::roleNames() const
{

QHash<int, QByteArray> roles;
for (int i = 0; i < record().count(); i ++) {
    roles.insert(Qt::UserRole + i + 1, record().fieldName(i).toUtf8());
}
return roles;
}

bool MDataBaseTableModel::setData(const QModelIndex &item, const QVariant &value, int role)
{
if (item.isValid() && role == Qt::EditRole) {
    QSqlTableModel::setData(item, value, role);
    emit dataChanged(item, item);
    return true;
}
return false;
}

void MDataBaseTableModel::removeRow(int row){

qDebug()<< removeRows(row, 1, QModelIndex());
select();
submitAll();
}

MDataBaseTableModel.h

代码语言:javascript
复制
class MDataBaseTableModel:public QSqlTableModel
{
Q_OBJECT
public:
explicit MDataBaseTableModel(QObject * parent =0,QSqlDatabase db=QSqlDatabase(),QString, table="");
void connectDb();
QVariant data(const QModelIndex &index, int role) const Q_DECL_OVERRIDE;
QHash<int, QByteArray> roleNames() const Q_DECL_OVERRIDE;
bool setData(const QModelIndex &item, const QVariant &value, int role = Qt::EditRole) override;
Q_INVOKABLE void removeRow(int row);
};

main.cpp

代码语言:javascript
复制
QSqlDatabase db = QSqlDatabase::addDatabase( "QSQLITE" );
db.setDatabaseName("products.sqlite");
db.open()
MDataBaseTableModel* categoryModel = new MDataBaseTableModel(0,db,"categoryTable");
engine.rootContext()->setContextProperty("categorySQL", categoryModel);

main.qml

代码语言:javascript
复制
ListView {
id: listView

implicitWidth: window.width /5
implicitHeight: window.height/4

model : categorySQL
delegate: ItemDelegate{

width: parent.width

MouseArea {
  anchors.fill: parent
  onClicked: {
    listView.currentIndex = index
}
}
Text{
  text : sqlName
  }                    
}
}
Button {
  text: "-"
  onClicked: {
    categorySQL.removeRow(listView.currentIndex)
    categorySQL.submitAll()
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-13 15:35:07

probem在submitAll()之前是select();

代码语言:javascript
复制
void MDataBaseTableModel::removeRow(int row){
qDebug()<< removeRows(row, 1, QModelIndex());
select();
submitAll();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64320850

复制
相关文章

相似问题

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