QSqlTableModel - Как добавить картинки в таблицу, чтобы они отражались в диалоговом окне, но не были частью модели
Добрый день.
Решил сделать дневник для записей. Дневник основан на одной таблице SQLite. Есть класс Model, унаследованный от QSqlTableModel с функциями добавления записи, редактирования, удаления + система поиска. Всё работает, но возникла необходимость добавления нескольких фотографий в каждой записи.
Чтобы решить эту задачу создал ещё одну таблицу SQLite. Поле date (переменная QDateTime date) одинакова в обоих таблицах. Она уникальная, так как присваивается при создании записи. Создал в классе Model список QByteArray, который передаю в диалоговое окно, после поиска в списке фотографий методом:
bool Model::selectPicList(QDateTime date) { db_pic->connectToDataBase(); QSqlQuery qry(QSqlDatabase::database("diary_img")); qry.prepare( "SELECT \n" " id, \n" " date, \n" " pic \n" "FROM diary_img \n" "WHERE date = :date; \n" ); qry.bindValue(":date", date); if(qry.exec()){ while(qry.next()){ QByteArray arr = qry.value("pic").toByteArray(); pix.append(arr); } } else { qCritical() << "Cannot execute query!"; QSqlError err = qry.lastError(); qCritical() << err.nativeErrorCode(); qCritical() << err.databaseText().toUtf8().data(); qCritical() << err.driverText().toUtf8().data(); qDebug() << qry.executedQuery(); } db_pic->closeDataBase(); }
Далее в диалоговом окне, если создаётся новая запись, то пытаюсь записать в базу добавленные фотографии и дату на момент записи методами, которые на этом форуме упоминались:
void Dialog::addImg() { if(!item->Date().isValid()){ QMessageBox::information(this, "Информация", "Добавьте назвние папки!"); return; } QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), QString(), tr("Images (*.png *.xpm *.jpg)")); QPixmap inixmap(fileName); QByteArray inByteArray; QBuffer inBuffer(&inByteArray); inBuffer.open(QIODevice::WriteOnly); inixmap.save(&inBuffer, "JPG"); insertIntoTable(item->Date(), inByteArray); QTextCursor cursor = ui->edtText->textCursor(); QImage img; img.loadFromData(inByteArray); cursor.insertImage(img.scaledToHeight(400)); cursor.movePosition(QTextCursor::End); }
bool Dialog::insertIntoTable(const QVariantList &data) { QSqlQuery query(QSqlDatabase::database("diary_img")); query.prepare("INSERT INTO diary_img (date, pic) VALUES (:date, :pic)"); query.bindValue(":date", data[0].toDateTime()); query.bindValue(":pic", data[1].toByteArray()); if(query.exec()) { return true; } else { qCritical() << query.lastError().databaseText(); qCritical() << query.lastError().driverText(); qCritical() << query.lastError().nativeErrorCode(); return false; } } bool Dialog::insertIntoTable(const QDateTime &date, const QByteArray &pic) { QVariantList data; data.append(date); data.append(pic); if(insertIntoTable(data)) return true; else return false; }
Если редактирую уже существующую запись, то пытаюсь вставить картинки из базы данных таким образом:
QTextCursor cursor = ui->edtText->textCursor(); for(int i = 0; i < pix->count(); i++){ QImage img; img.loadFromData(pix->at(i)); cursor.insertImage(img.scaledToHeight(400)); cursor.movePosition(QTextCursor::End); }
Где pix это
QList<QByteArray> *pix;
Но картинки не появляются в диалоговом окне при просмотре записи. В базу что-то добавляется. Также картинка отражается в QTextEdit при добавлении. Но увидеть её после этого не получается.
Может существует другой метод как это можно сделать?
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.Вам це подобається? Поділіться в соціальних мережах!
- Akiv Doros
- 11 листопада 2024 р. 14:58
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:50бали,
- Рейтинг балів-4
- molni99
- 26 жовтня 2024 р. 01:37
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:80бали,
- Рейтинг балів4
- molni99
- 26 жовтня 2024 р. 01:29
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:20бали,
- Рейтинг балів-10
:)
Сделайте столбец в таблице с картинками или путями картинок и скройте этот столбец. А при открытии диалога передавайте в него путь или саму картинку и в нем уже отображайте
Если сделать ещё один столбец, то будет место для одной картинки. А идея в том, чтобы к каждой записи добавлять несколько картинок или вообще ничего не добавлять.
Ну тогда в этом столбце указывайте пути на несколько картинок
Если у вас модель, в переопределнном методе QVariant data надо привязываться к Qt::EditRole, это если открывающийся диалог редактирования является частью таблицы