Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Reading image from QSqlTableModel
Forum Updated to NodeBB v4.3 + New Features

Reading image from QSqlTableModel

Scheduled Pinned Locked Moved Unsolved General and Desktop
53 Posts 8 Posters 20.8k Views 4 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • G gabor53

    @raven-worx
    I believe in the paint() method I need to use

    void QPainter::drawPixmap(const QRectF &target, const QPixmap &pixmap, const QRectF &source)
    

    How can I get the pixmap out of the model?

    artwawA Offline
    artwawA Offline
    artwaw
    wrote on last edited by
    #24

    @gabor53 of course. Model's data() method returns QVariant, you can get QByteArray this way.

    For more information please re-read.

    Kind Regards,
    Artur

    G 3 Replies Last reply
    0
    • artwawA artwaw

      @gabor53 of course. Model's data() method returns QVariant, you can get QByteArray this way.

      G Offline
      G Offline
      gabor53
      wrote on last edited by gabor53
      #25
      This post is deleted!
      1 Reply Last reply
      0
      • artwawA artwaw

        @gabor53 of course. Model's data() method returns QVariant, you can get QByteArray this way.

        G Offline
        G Offline
        gabor53
        wrote on last edited by
        #26

        @artwaw
        The delegate's paint looks like this:

        void FixViewDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const {
        

        I can get the index of the item from QModelIndex& index, but as there is no model, how can I get the QByteArray from the db (or model)?
        Thank you.

        1 Reply Last reply
        0
        • artwawA artwaw

          @gabor53 of course. Model's data() method returns QVariant, you can get QByteArray this way.

          G Offline
          G Offline
          gabor53
          wrote on last edited by
          #27

          @artwaw
          As I have no access to the model, is it OK to use a query to get the bytearray from the model?

          1 Reply Last reply
          0
          • SGaistS Offline
            SGaistS Offline
            SGaist
            Lifetime Qt Champion
            wrote on last edited by
            #28

            Index is your point of access to the model. See QModelIndex::data.

            Interested in AI ? www.idiap.ch
            Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

            G 1 Reply Last reply
            2
            • SGaistS SGaist

              Index is your point of access to the model. See QModelIndex::data.

              G Offline
              G Offline
              gabor53
              wrote on last edited by
              #29

              @SGaist
              I tried the following:

              QVariant fixImg;
              
                fixImg = index.data (Qt::DisplayRole);
              
                QPixmap pixMap2;
                pixMap2 = fixImg.value<QPixmap>();
              
                qDebug() << "pixMap2 size: " << pixMap2.size ();
                qDebug() << "pixMap2 width: " << pixMap2.width ();
              
              

              No error message, but the size is 0. Did I miss a step?
              Thank you.

              1 Reply Last reply
              0
              • SGaistS Offline
                SGaistS Offline
                SGaist
                Lifetime Qt Champion
                wrote on last edited by SGaist
                #30

                Do you store a QPixmap in your model for that role ?

                Interested in AI ? www.idiap.ch
                Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                G 1 Reply Last reply
                0
                • G Offline
                  G Offline
                  gabor53
                  wrote on last edited by
                  #31

                  It's a QByteArray.

                  jsulmJ 1 Reply Last reply
                  0
                  • SGaistS SGaist

                    Do you store a QPixmap in your model for that role ?

                    G Offline
                    G Offline
                    gabor53
                    wrote on last edited by
                    #32

                    @SGaist
                    I ran

                     QVariant fixImg(index.data (Qt::EditRole));
                    
                      qDebug() << "QVariant type: " << fixImg.type ();
                    

                    and the result was
                    QVariant type: QVariant::QString

                    1 Reply Last reply
                    0
                    • G gabor53

                      It's a QByteArray.

                      jsulmJ Offline
                      jsulmJ Offline
                      jsulm
                      Lifetime Qt Champion
                      wrote on last edited by
                      #33

                      @gabor53 said in Reading image from QSqlTableModel:

                      It's a QByteArray.

                      QByteArray of what? What and how are you storing in the DB? What is the data type of the corresponding column?

                      https://forum.qt.io/topic/113070/qt-code-of-conduct

                      G 1 Reply Last reply
                      0
                      • jsulmJ jsulm

                        @gabor53 said in Reading image from QSqlTableModel:

                        It's a QByteArray.

                        QByteArray of what? What and how are you storing in the DB? What is the data type of the corresponding column?

                        G Offline
                        G Offline
                        gabor53
                        wrote on last edited by
                        #34

                        @jsulm
                        QByteArray of the original image. The data type of that column is BLOB.

                        raven-worxR 1 Reply Last reply
                        0
                        • G gabor53

                          @jsulm
                          QByteArray of the original image. The data type of that column is BLOB.

                          raven-worxR Offline
                          raven-worxR Offline
                          raven-worx
                          Moderators
                          wrote on last edited by raven-worx
                          #35

                          @gabor53
                          i asked in a post before:

                          QByteArray ba = fixModel->record (1).value ("Pic").toByteArray ();
                          qDebug() << ba.size() << ba;
                          

                          in your delegates paint() method (if really a QByteArray is returned) do the following:

                          if( index.column() == NUMBER_OF_PIXMAP_COLUMN )
                          {
                                QByteArray ba = index.data( ROLE_USED_IN_MODEL ).toByteArray();
                               QPixmap pix;
                                  pix.loadFromData ( ba );
                               painter->save();
                                   painter->translate( option.rect.topLeft() );
                                   painter->drawPixmap( pix );
                               painter->restore();
                          }
                          

                          I you should probably post your model code to avoid further guessing.

                          --- SUPPORT REQUESTS VIA CHAT WILL BE IGNORED ---
                          If you have a question please use the forum so others can benefit from the solution in the future

                          VRoninV 1 Reply Last reply
                          0
                          • raven-worxR raven-worx

                            @gabor53
                            i asked in a post before:

                            QByteArray ba = fixModel->record (1).value ("Pic").toByteArray ();
                            qDebug() << ba.size() << ba;
                            

                            in your delegates paint() method (if really a QByteArray is returned) do the following:

                            if( index.column() == NUMBER_OF_PIXMAP_COLUMN )
                            {
                                  QByteArray ba = index.data( ROLE_USED_IN_MODEL ).toByteArray();
                                 QPixmap pix;
                                    pix.loadFromData ( ba );
                                 painter->save();
                                     painter->translate( option.rect.topLeft() );
                                     painter->drawPixmap( pix );
                                 painter->restore();
                            }
                            

                            I you should probably post your model code to avoid further guessing.

                            VRoninV Offline
                            VRoninV Offline
                            VRonin
                            wrote on last edited by
                            #36
                            • I don't like index.column() == NUMBER_OF_PIXMAP_COLUMN as it ties the delegate to a single model so I consider it bad design, view->setItemDelegateForColumn() should be used instead.
                            • index.data( ROLE_USED_IN_MODEL ) it's a QSqlTableModel so just delete ROLE_USED_IN_MODEL and use the default
                            • It's a QStyledItemDelegate so let's use style
                            void FixViewDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const {
                            QPixmap loadedImage;
                            loadedImage.loadFromData(index.data().toByteArray());
                            const QWidget *widget = option.widget;
                            QStyle *style = widget ? widget->style() : QApplication::style();
                            style->drawItemPixmap(painter,option.rect,Qt::AlignCenter,loadedImage);
                            }
                            

                            "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                            ~Napoleon Bonaparte

                            On a crusade to banish setIndexWidget() from the holy land of Qt

                            G 2 Replies Last reply
                            3
                            • VRoninV VRonin
                              • I don't like index.column() == NUMBER_OF_PIXMAP_COLUMN as it ties the delegate to a single model so I consider it bad design, view->setItemDelegateForColumn() should be used instead.
                              • index.data( ROLE_USED_IN_MODEL ) it's a QSqlTableModel so just delete ROLE_USED_IN_MODEL and use the default
                              • It's a QStyledItemDelegate so let's use style
                              void FixViewDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const {
                              QPixmap loadedImage;
                              loadedImage.loadFromData(index.data().toByteArray());
                              const QWidget *widget = option.widget;
                              QStyle *style = widget ? widget->style() : QApplication::style();
                              style->drawItemPixmap(painter,option.rect,Qt::AlignCenter,loadedImage);
                              }
                              
                              G Offline
                              G Offline
                              gabor53
                              wrote on last edited by
                              #37
                              This post is deleted!
                              1 Reply Last reply
                              0
                              • VRoninV VRonin
                                • I don't like index.column() == NUMBER_OF_PIXMAP_COLUMN as it ties the delegate to a single model so I consider it bad design, view->setItemDelegateForColumn() should be used instead.
                                • index.data( ROLE_USED_IN_MODEL ) it's a QSqlTableModel so just delete ROLE_USED_IN_MODEL and use the default
                                • It's a QStyledItemDelegate so let's use style
                                void FixViewDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const {
                                QPixmap loadedImage;
                                loadedImage.loadFromData(index.data().toByteArray());
                                const QWidget *widget = option.widget;
                                QStyle *style = widget ? widget->style() : QApplication::style();
                                style->drawItemPixmap(painter,option.rect,Qt::AlignCenter,loadedImage);
                                }
                                
                                G Offline
                                G Offline
                                gabor53
                                wrote on last edited by
                                #38

                                @VRonin
                                Thank you. It runs without error, but paint nothing in the view.

                                1 Reply Last reply
                                0
                                • VRoninV Offline
                                  VRoninV Offline
                                  VRonin
                                  wrote on last edited by
                                  #39

                                  How do you save your image in the database? do you save it via Qt? can you show us the save part of the code?

                                  "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                                  ~Napoleon Bonaparte

                                  On a crusade to banish setIndexWidget() from the holy land of Qt

                                  G 1 Reply Last reply
                                  0
                                  • VRoninV VRonin

                                    How do you save your image in the database? do you save it via Qt? can you show us the save part of the code?

                                    G Offline
                                    G Offline
                                    gabor53
                                    wrote on last edited by gabor53
                                    #40

                                    @VRonin
                                    Sure. I also added

                                     qDebug() << "loadedImage size: " << loadedImage.size ();
                                    

                                    and the result is
                                    loadedImage size: QSize(0, 0)

                                    I save the image via Qt like this:

                                    #include "review.h"
                                    #include "ui_review.h"
                                    
                                    Review::Review(QWidget* parent) :
                                      QDialog(parent),
                                      ui(new Ui::Review) {
                                      ui->setupUi(this);
                                    
                                      connect(this, &Review::RecAdded, this, &Review::updateTable);
                                    
                                    }
                                    
                                    Review::~Review() {
                                      delete ui;
                                    }
                                    
                                    void Review::dispRev(QString sID, QString& name, QString& whatChosen, QString& fileNameChosen, QString& materialChosen, QString& colorChosen, QString& description, QDate& adoptDate, QString& SignedbyChosen, QString& history, QString& age, QString& notesTemp) {
                                      name = name.simplified ();
                                      description = description.simplified ();
                                    
                                      ui->ID_display_Label->setText (sID);
                                      ui->Name_Disp_Label->setText (name);
                                      ui->What_Display_Label->setText (whatChosen);
                                      ui->MadeOf_Disp_Label->setText (materialChosen);
                                      ui->Color_Disp_Label->setText (colorChosen);
                                      ui->textBrowser_Descr->setText (description);
                                      adoptDateStr = adoptDate.toString ("MM/dd/yyyy");
                                      ui->AdoptionDate_Disp_Label->setText (adoptDateStr);
                                      ui->SignedBy_Disp_label->setText (SignedbyChosen);
                                      ui->textBrowser_History->setText (history);
                                      ui->Age_Display_Label_2->setText (age);
                                      ui->textBrowser_Notes->setText (notesTemp);
                                    
                                    
                                      QPixmap pix2(fileNameChosen);
                                      int w = 0;
                                      int h = 0;
                                      w = ui->Image_Display_Label->width ();
                                      h = ui->Image_Display_Label->height ();
                                      ui->Image_Display_Label->setPixmap (pix2.scaled(w, h, Qt::KeepAspectRatio));
                                    
                                      QFile fileReview(fileNameChosen);
                                    
                                      if(fileReview.open (QIODevice::ReadOnly)) {
                                        fileByteArray = fileReview.readAll ();
                                      }
                                    
                                      nameReview = name;
                                      whatReview = whatChosen;
                                      fileNameReview = fileNameChosen;
                                      materialReview = materialChosen;
                                      colorReview = colorChosen;
                                      descriptionReview = description;
                                      adoptDateReview = adoptDate;
                                      SignedbyReview = SignedbyChosen;
                                      historyReview = history;
                                      sIDReview = sID;
                                      ageReview = age;
                                      notesReview = notesTemp;
                                    
                                    }
                                    
                                    
                                    void Review::on_pushButton_Add_to_DB_clicked() {
                                    
                                    //    date = adoptDateReview.toString ("MM/dd/yyyy");
                                      qDebug() << "date in review.cpp: " << date;
                                      QSqlDatabase db = QSqlDatabase::addDatabase ("QSQLITE", "writedb");
                                      db.setDatabaseName (fileQstring);
                                    
                                      QSqlQuery querys(db);
                                    
                                      if(!db.open ())
                                    
                                      {
                                        qDebug() << "The database is not open (submit)!";
                                      } else {
                                        qDebug() << "The database is open (submit)!";
                                      }
                                      querys.prepare("INSERT INTO Items (ID, Name, Pic, Description, AdoptDate, History, Age, Notes, Color, Material, Signed, What) VALUES(:ID, :Name, :Pic, :Description, :AdoptDate, :History, :Age, :Notes, :Color, :Material, :Signed, :What)" );
                                      querys.bindValue (":ID", sIDReview);
                                      querys.bindValue (":Name", nameReview);
                                      querys.bindValue (":Pic", fileByteArray);
                                      querys.bindValue (":Description", descriptionReview);
                                      querys.bindValue (":AdoptDate", adoptDateStr);
                                      querys.bindValue (":History", historyReview);
                                      querys.bindValue (":Age", ageReview);
                                      querys.bindValue (":Notes", notesReview);
                                      querys.bindValue (":Color", colorReview);
                                      querys.bindValue (":Material", materialReview);
                                      querys.bindValue (":Signed", SignedbyReview);
                                      querys.bindValue (":What", whatReview);
                                    
                                      bool result = querys.exec ();
                                    
                                      if(!result) {
                                        qDebug() << "Error inserting into the main db!" << querys.lastError ();
                                    
                                        QMessageBox::warning (this, "Add to Database Warning", "<b><font size='16' color='red'>Error 1002: The Friend was not added to the database.");
                                    
                                      } else {
                                        qDebug() << "Entered FunctAdd OK loop.";
                                    
                                        QMessageBox::information (this, "Confirmation", "<b><font size = '16' color = 'green'>The Friend was added to the database.</font>");
                                    
                                    
                                    
                                        emit RecAdded ();
                                      }
                                    }
                                    
                                    
                                    void Review::on_pushButton_Fix_clicked() {
                                      Additem* mAdditem = new Additem(this);
                                      mAdditem->FixFriend (sIDReview, nameReview, whatReview, fileNameReview, materialReview, colorReview, descriptionReview, date, SignedbyReview, historyReview, ageReview, notesReview);
                                    
                                    
                                      mAdditem->show ();
                                    }
                                    
                                    
                                    void Review::updateTable() {
                                      qDebug() << "Entered updateTable!";
                                      MainWindow* mMainWindow = new MainWindow(this);
                                    
                                      mMainWindow->Addview ();
                                      mMainWindow->show ();
                                    }
                                    
                                    

                                    Data in the db is stored as BLOB.

                                    1 Reply Last reply
                                    0
                                    • SGaistS Offline
                                      SGaistS Offline
                                      SGaist
                                      Lifetime Qt Champion
                                      wrote on last edited by
                                      #41

                                      You don't do anything in case fileReview.open fails so you might be storing empty QByteArrays in your database.

                                      Interested in AI ? www.idiap.ch
                                      Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                                      G 1 Reply Last reply
                                      0
                                      • SGaistS SGaist

                                        You don't do anything in case fileReview.open fails so you might be storing empty QByteArrays in your database.

                                        G Offline
                                        G Offline
                                        gabor53
                                        wrote on last edited by gabor53
                                        #42

                                        @SGaist
                                        I tried to add a record and I got an error message:
                                        The database is open (submit)!
                                        Error inserting into the main db! QSqlError("", "Parameter count mismatch", "")

                                        I'm not sure this has anything to do with the original issue.
                                        I checked a Pic field in the db using DB Browser and there is binary data in the Pic column.
                                        I also made the following changes:

                                         if(loadedImage.loadFromData (index.data ().toByteArray ()) != true) {
                                            qDebug() << "Fiximage not loaded";
                                          } else {
                                            qDebug() << "Fiximage IS loaded";
                                          };
                                          
                                        

                                        The result was Fiximage not loaded

                                        1 Reply Last reply
                                        0
                                        • VRoninV Offline
                                          VRoninV Offline
                                          VRonin
                                          wrote on last edited by VRonin
                                          #43

                                          Error inserting into the main db! QSqlError("", "Parameter count mismatch", "")

                                          I'm not sure this has anything to do with the original issue

                                          It does.

                                          SQLite some/all of Qt's SQLite drivers do not support named binding and apparently Qt is not smart enough to go around it seamlessly.

                                          use positional binding instead, see http://doc.qt.io/qt-5/qsqlquery.html#approaches-to-binding-values

                                          You should use the ? version instead of the :id version.

                                          You can check what your database can do using db.driver()->hasFeature() in your case db.driver()->hasFeature(QSqlDriver::NamedPlaceholders) will return false

                                          EDIT:

                                          @SGaist is right, corrected my post

                                          "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                                          ~Napoleon Bonaparte

                                          On a crusade to banish setIndexWidget() from the holy land of Qt

                                          1 Reply Last reply
                                          0

                                          • Login

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • Users
                                          • Groups
                                          • Search
                                          • Get Qt Extensions
                                          • Unsolved