VB
8 октября 2020 г. 16:05

QSqlTableModel - Как добавить картинки в таблицу, чтобы они отражались в диалоговом окне, но не были частью модели

QAbstractTableModel, Qt

Добрый день.

Решил сделать дневник для записей. Дневник основан на одной таблице SQLite. Есть класс Model, унаследованный от QSqlTableModel с функциями добавления записи, редактирования, удаления + система поиска. Всё работает, но возникла необходимость добавления нескольких фотографий в каждой записи.

Чтобы решить эту задачу создал ещё одну таблицу SQLite. Поле date (переменная QDateTime date) одинакова в обоих таблицах. Она уникальная, так как присваивается при создании записи. Создал в классе Model список QByteArray, который передаю в диалоговое окно, после поиска в списке фотографий методом:

  1. bool Model::selectPicList(QDateTime date)
  2. {
  3. db_pic->connectToDataBase();
  4. QSqlQuery qry(QSqlDatabase::database("diary_img"));
  5. qry.prepare(
  6. "SELECT \n"
  7. " id, \n"
  8. " date, \n"
  9. " pic \n"
  10. "FROM diary_img \n"
  11. "WHERE date = :date; \n"
  12. );
  13.  
  14. qry.bindValue(":date", date);
  15.  
  16. if(qry.exec()){
  17. while(qry.next()){
  18. QByteArray arr = qry.value("pic").toByteArray();
  19. pix.append(arr);
  20. }
  21. } else {
  22. qCritical() << "Cannot execute query!";
  23. QSqlError err = qry.lastError();
  24. qCritical() << err.nativeErrorCode();
  25. qCritical() << err.databaseText().toUtf8().data();
  26. qCritical() << err.driverText().toUtf8().data();
  27. qDebug() << qry.executedQuery();
  28. }
  29.  
  30. db_pic->closeDataBase();
  31. }

Далее в диалоговом окне, если создаётся новая запись, то пытаюсь записать в базу добавленные фотографии и дату на момент записи методами, которые на этом форуме упоминались:

  1. void Dialog::addImg()
  2. {
  3. if(!item->Date().isValid()){
  4. QMessageBox::information(this, "Информация", "Добавьте назвние папки!");
  5. return;
  6. }
  7.  
  8. QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), QString(),
  9. tr("Images (*.png *.xpm *.jpg)"));
  10. QPixmap inixmap(fileName);
  11. QByteArray inByteArray;
  12. QBuffer inBuffer(&inByteArray);
  13. inBuffer.open(QIODevice::WriteOnly);
  14. inixmap.save(&inBuffer, "JPG");
  15.  
  16. insertIntoTable(item->Date(), inByteArray);
  17.  
  18. QTextCursor cursor = ui->edtText->textCursor();
  19. QImage img;
  20. img.loadFromData(inByteArray);
  21. cursor.insertImage(img.scaledToHeight(400));
  22. cursor.movePosition(QTextCursor::End);
  23. }
  1. bool Dialog::insertIntoTable(const QVariantList &data)
  2. {
  3. QSqlQuery query(QSqlDatabase::database("diary_img"));
  4.  
  5. query.prepare("INSERT INTO diary_img (date, pic) VALUES (:date, :pic)");
  6. query.bindValue(":date", data[0].toDateTime());
  7. query.bindValue(":pic", data[1].toByteArray());
  8.  
  9. if(query.exec()) {
  10. return true;
  11. } else {
  12. qCritical() << query.lastError().databaseText();
  13. qCritical() << query.lastError().driverText();
  14. qCritical() << query.lastError().nativeErrorCode();
  15.  
  16. return false;
  17. }
  18. }
  19.  
  20. bool Dialog::insertIntoTable(const QDateTime &date, const QByteArray &pic)
  21. {
  22. QVariantList data;
  23. data.append(date);
  24. data.append(pic);
  25.  
  26. if(insertIntoTable(data))
  27. return true;
  28. else
  29. return false;
  30. }

Если редактирую уже существующую запись, то пытаюсь вставить картинки из базы данных таким образом:

  1. QTextCursor cursor = ui->edtText->textCursor();
  2. for(int i = 0; i < pix->count(); i++){
  3. QImage img;
  4. img.loadFromData(pix->at(i));
  5. cursor.insertImage(img.scaledToHeight(400));
  6. cursor.movePosition(QTextCursor::End);
  7. }

Где pix это

  1. QList<QByteArray> *pix;

Но картинки не появляются в диалоговом окне при просмотре записи. В базу что-то добавляется. Также картинка отражается в QTextEdit при добавлении. Но увидеть её после этого не получается.
Может существует другой метод как это можно сделать?

Внешний вид

5

Вам это нравится? Поделитесь в социальных сетях!

5
VB
  • 8 октября 2020 г. 18:44
  • (ред.)

:)

    Михаиллл
    • 12 октября 2020 г. 15:15

    Сделайте столбец в таблице с картинками или путями картинок и скройте этот столбец. А при открытии диалога передавайте в него путь или саму картинку и в нем уже отображайте

      VB
      • 12 октября 2020 г. 16:49

      Если сделать ещё один столбец, то будет место для одной картинки. А идея в том, чтобы к каждой записи добавлять несколько картинок или вообще ничего не добавлять.

        Михаиллл
        • 12 октября 2020 г. 17:39

        Ну тогда в этом столбце указывайте пути на несколько картинок

          Serj Demchenko
          • 15 января 2021 г. 14:51

          Если у вас модель, в переопределнном методе QVariant data надо привязываться к Qt::EditRole, это если открывающийся диалог редактирования является частью таблицы

            Комментарии

            Только авторизованные пользователи могут публиковать комментарии.
            Пожалуйста, авторизуйтесь или зарегистрируйтесь
            • Последние комментарии
            • IscanderChe
              12 апреля 2025 г. 17:12
              Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
            • AK
              1 апреля 2025 г. 11:41
              Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
            • Evgenii Legotckoi
              9 марта 2025 г. 21:02
              К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
            • VP
              9 марта 2025 г. 16:14
              Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
            • ИМ
              22 ноября 2024 г. 21:51
              Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…