我有以下课程
class SqlContactModel : public QSqlTableModel
{
Q_OBJECT
public:
SqlContactModel(QObject *parent = 0);
Q_INVOKABLE void addContact( const QString& contactName );
Q_INVOKABLE void removeContact( const QString& contactName );
QVariant data(const QModelIndex &index, int role) const Q_DECL_OVERRIDE;
QHash<int, QByteArray> roleNames() const Q_DECL_OVERRIDE;
};
用作ListView的模型。我有以下添加/删除方法的实现:
void SqlContactModel::addContact( const QString& contactName )
{
QSqlRecord newRecord = record();
newRecord.setValue("name", contactName);
if (!insertRecord(rowCount(), newRecord)) {
qWarning() << "Failed to send message:" << lastError().text();
return;
}
submitAll();
}
void SqlContactModel::removeContact( const QString& contactName )
{
QString sqlQueryString = QString("DELETE FROM Contacts WHERE name='") + contactName + QString("'");
QSqlQuery query;
if (!query.exec(sqlQueryString))
qFatal(qPrintable(query.lastError().text()));
submitAll();
}
最后在qml中我试图调用以下序列:
Component.onCompleted: {
addContact("111");
addContact("123")
addContact("456")
removeContactFromModel("456");
console.log("contactsList.count = ", contactsList.count)
}
但是我看到3个代表仍然在ListView中。与此同时,我发现我的数据库中只有2个条目。这种方法有什么问题?如何在每次添加/删除数据库中的项目时更新ListView?
最新的发现是,如果由于某种原因,在调用此onComplete之前联系人“111”和“123”已经在DB中,则会出现此问题。有什么想法吗?
答案 0 :(得分:2)
您没有使用类的特定方法来删除行,请尝试使用:
bool removeRow(int row, const QModelIndex &parent = QModelIndex())
此方法实现了QT模型类的删除协议。
发出信号的另一种解决方案:
emit beginRemoveRows(const QModelIndex &parent, int first, int last);
YOUR CODE
emit endRemoveRows();
或者
emit beginResetModel();
YOURCODE
emit endResetModel();
希望这对你有所帮助。