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 при добавлении. Но увидеть её после этого не получается.
Может существует другой метод как это можно сделать?
Вам это нравится? Поделитесь в социальных сетях!
Комментарии
Пожалуйста, авторизуйтесь или зарегистрируйтесь
- Последние комментарии
- AK1 апреля 2025 г. 11:41Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
- VP9 марта 2025 г. 16:14Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
- ИМ22 ноября 2024 г. 21:51Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
- Сейчас обсуждают на форуме
- f15 февраля 2025 г. 13:46Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
- Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
- Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
- Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.
:)
Сделайте столбец в таблице с картинками или путями картинок и скройте этот столбец. А при открытии диалога передавайте в него путь или саму картинку и в нем уже отображайте
Если сделать ещё один столбец, то будет место для одной картинки. А идея в том, чтобы к каждой записи добавлять несколько картинок или вообще ничего не добавлять.
Ну тогда в этом столбце указывайте пути на несколько картинок
Если у вас модель, в переопределнном методе QVariant data надо привязываться к Qt::EditRole, это если открывающийся диалог редактирования является частью таблицы