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
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.Magst du es? In sozialen Netzwerken teilen!
Kommentare
- sdfsdfkp fgskpgokspdog
- 14. Oktober 2024 15:09
C++ - Тест 004. Указатели, Массивы и Циклы
- Ergebnis:90punkte,
- Bewertungspunkte8
- Максим Васильев
- 2. Oktober 2024 04:14
Qt - Тест 001. Сигналы и слоты
- Ergebnis:68punkte,
- Bewertungspunkte-1
- Лев Семенов
- 30. September 2024 11:04
C++ - Тест 001. Первая программа и типы данных
- Ergebnis:53punkte,
- Bewertungspunkte-4
:)
Сделайте столбец в таблице с картинками или путями картинок и скройте этот столбец. А при открытии диалога передавайте в него путь или саму картинку и в нем уже отображайте
Если сделать ещё один столбец, то будет место для одной картинки. А идея в том, чтобы к каждой записи добавлять несколько картинок или вообще ничего не добавлять.
Ну тогда в этом столбце указывайте пути на несколько картинок
Если у вас модель, в переопределнном методе QVariant data надо привязываться к Qt::EditRole, это если открывающийся диалог редактирования является частью таблицы