Что я пытаюсь сделать?
Я пытаюсь создать список пользователей, чьи данные поступают из базы данных. И я хочу использовать концепцию программирования модель / представление для реализации этого. Более того, я хочу применить к этому списку различные операции, такие как:
- Отображение списка
- Удаление элемента из списка
- Добавление элемента в список
- Сортировка списка
В чем проблема?
Первая операция (отображение списка) была легкой, а вторая (удаление элемент из списка), кажется, навязывает несоответствие между моделью и представлением. Независимо от того, какой элемент вы выбрали для удаления, представление всегда показывает, что два элемента были удалены (тогда как на самом деле только выбранный элемент был удален моделью). Два элемента, удаленные представлением, это выбранный элемент и последний элемент. Почему он всегда удаляет последний элемент? Как бы это исправить?
Вот мой код:
usermodel.h:
class UserModel : public QAbstractListModel {
Q_OBJECT
public:
UserModel(QObject *parent = nullptr);
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
QVariant data(const QModelIndex &index, int role) const override;
bool removeRows(int pos, int row, const QModelIndex &parent = QModelIndex()) override;
Q_INVOKABLE bool del_row(int);
// initialize and setup the database
static bool createConnection() {
db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("Test");
if (!db.open()) return false;
QSqlQuery q;
QStringList t = db.tables();
// create table users if there is none
if (!t.contains("users", Qt::CaseInsensitive)){
if (!q.exec("create table users (id int primary key, firstname varchar(20))")){
return false;
}
}
q.exec("select * from users");
// insert new records when there is none
if (!q.first()){
q.exec("insert into users values(1, 'Danny')");
q.exec("insert into users values(2, 'Christine')");
q.exec("insert into users values(3, 'Lars')");
q.exec("insert into users values(4, 'Alex')");
}
}
private:
QSqlTableModel *model; // internal data store for models
static QSqlDatabase db;
};
пользовательский режим. cpp:
QSqlDatabase UserModel::db;
UserModel::UserModel(QObject *parent) : QAbstractListModel (parent) {
createConnection();
model = new QSqlTableModel(this, db);
model->setTable("users");
model->select();
}
int UserModel::rowCount(const QModelIndex &/*parent*/) const {
return model->rowCount();
}
QVariant UserModel::data(const QModelIndex &index, int role) const {
// This allows me to return more than one column data when not permitted
QJsonObject u_data;
u_data.insert("id", model->record(index.row()).value(0).toInt());
u_data.insert("name", model->record(index.row()).value(1).toString());
if (role == Qt::DisplayRole)
return u_data;
return QVariant();
}
bool UserModel::del_row(int row){
return removeRows(row, 1);
}
bool UserModel::removeRows(int pos, int rows, const QModelIndex &/*parent*/){
bool response;
int first = pos, last = pos + rows - 1;
beginRemoveRows(QModelIndex(), first, last);
response = model->removeRow(first, QModelIndex());
endRemoveRows();
return response;
}
main.qml:
ApplicationWindow {
visible: true
width: 640
height: 480
ListView {
anchors.fill: parent
delegate: SwipeDelegate {
width: parent.width
height: 50
text: user_model.data(user_model.index(index, 0), 0)["name"]
onClicked: user_model.del_row(model.index)
}
model: UserModel { id: user_model }
}
}
Примечание : Пожалуйста, не предоставляйте никаких ссылок в реплее, так как я, возможно, не смогу получить к ним доступ, потому что правительство здесь заблокировало большинство сайтов и несколько сайтов в белом списке (один из них - stackoverflow) .