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. commitData and closeEditor signals
Forum Updated to NodeBB v4.3 + New Features

commitData and closeEditor signals

Scheduled Pinned Locked Moved Unsolved General and Desktop
11 Posts 2 Posters 4.6k Views 2 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 Offline
    G Offline
    gabor53
    wrote on last edited by
    #1

    Hi,
    I have a delegate:

    #include "fixviewdelegate.h"
    
    FixViewDelegate::FixViewDelegate(QObject* parent) : QStyledItemDelegate(parent) {
      qDebug() << "Entered fixViewDelegate (1).";
    }
    
    QWidget* FixViewDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const {
    
      qDebug() << "Entered createEditor";
      Q_UNUSED(option);
      Q_UNUSED(index);
    
    //  ImagePickButton* imgPick = qobject_cast<ImagePickButton*>(parent);
    //  connect (imgPick, SIGNAL(editingFinished()), this, SLOT(commitAndCloseEditor()));
      return new ImagePickButton(parent);
    
    }
    
    void FixViewDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const {
    
      QPixmap loadedImage;
    
      loadedImage.loadFromData (index.data ().toByteArray ()) ;
      loadedImage = loadedImage.scaled (100, 100, Qt::KeepAspectRatio);
    
      const QWidget* widget = option.widget;
    
    
      QStyle* style = widget ? widget->style() : QApplication::style();
      style->drawItemPixmap (painter, option.rect, Qt::AlignCenter, loadedImage);
    
    }
    
    void FixViewDelegate::updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index) const {
      Q_UNUSED(index);
      editor->setGeometry(option.rect);
    }
    
    void FixViewDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const {
    
      qDebug() << "Entered setEditorData.";
      ImagePickButton* imgPick = qobject_cast<ImagePickButton*>(editor);
      Q_ASSERT(imgPick);
      imgPick->setSelectedFile(index.data(Qt::UserRole).toString());
      connect (imgPick, &ImagePickButton::editingFinished, this, FixViewDelegate::commitAndCloseEditor );
    }
    
    void FixViewDelegate::setModelData(QWidget* editor, QSqlTableModel* fixModel, const QModelIndex& index) const {
      qDebug() << "Entered setModelData. ";//Didn't come hee.
    
      ImagePickButton* imgPick = qobject_cast<ImagePickButton*>(editor);
      Q_ASSERT(imgPick);
    
      if(imgPick->selectedFile().isEmpty()) {
        fixModel->setData(index, QVariant(), Qt::UserRole);
        fixModel->setData(index, QVariant(), Qt::DecorationRole);
      } else {
        fixModel->setData(index, imgPick->selectedFile(), Qt::UserRole);
        fixModel->setData(index, QIcon(imgPick->selectedFile()), Qt::DecorationRole);
    
        qDebug() << "Selectedfile size: " << (imgPick->selectedFile ()).size ();
      }
    
    
    }
    
    void FixViewDelegate::commitAndCloseEditor() {
      ImagePickButton* imgPick = qobject_cast<ImagePickButton*>(sender ());
      qDebug() << "Entered commitandclose.";
      emit commitData(imgPick);
      emit closeEditor(imgPick);
    }
    

    When I close the editor the chosen new image appears on the editor, but the new image is not written back to the model and the db. I assume I'm supposed to use the closeEditor and commitData signals, but where am I supposed to put them?
    Thank you for your help.

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

      Hi,

      Add the override keyword to the methods you re-implement so you'll have a build time error when you write it with the wrong signature.

      Take a look at the original signature, the parameter is not QSqlTableModel.

      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
      3
      • SGaistS SGaist

        Hi,

        Add the override keyword to the methods you re-implement so you'll have a build time error when you write it with the wrong signature.

        Take a look at the original signature, the parameter is not QSqlTableModel.

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

        @SGaist
        I made the recommended changes:

        void FixViewDelegate::setModelData(QWidget* editor, QAbstractItemModel* fixModel, const QModelIndex& index) const {
        

        This section works now.
        My next step would be to commit thecchanges to the model and the db.From which function am I supposed to call

          emit  commitData (editor);
          emit closeEditor (editor);
        

        ? Or should I do it differently?
        Thank you.

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

          setModelData is where you modify your model so what do you mean by "commit the changes" ?

          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
          1
          • SGaistS SGaist

            setModelData is where you modify your model so what do you mean by "commit the changes" ?

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

            @SGaist
            What am I supposed to use in setModelData to commit the changes to the model and the db?

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

              I can't answer, there's not enough data to ensure you have everything.

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

              G 2 Replies Last reply
              0
              • SGaistS SGaist

                I can't answer, there's not enough data to ensure you have everything.

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

                @SGaist
                I hope this helps.
                fixdb.cpp:

                #include "fixdb.h"
                #include "ui_fixdb.h"
                #include <QDebug>
                
                FixDb::FixDb(QWidget* parent) :
                  QDialog(parent),
                  ui(new Ui::FixDb) {
                  ui->setupUi(this);
                
                  correctFriend ();
                }
                
                FixDb::~FixDb() {
                  delete ui;
                }
                
                void FixDb::correctFriend() {
                //  QSqlQuery query_fix;
                
                //  int recNum = 0;
                //  query_fix.prepare ("SELECT COUNT(*) FROM Items");
                //  query_fix.exec ();
                
                //  if(query_fix.next ()) {
                //    recNum = query_fix.value (0).toInt ();
                //  };
                
                //  qDebug() << "Record count in fixdb: " << recNum;
                
                
                
                  QSqlDatabase db = QSqlDatabase::addDatabase ("QSQLITE");
                  db.setDatabaseName ( "C:/Programming/Projects/Folkfriends_bzr/checkout/db.db");
                  if(!db.open ())
                    QMessageBox::information (this, "Error", "Couldn't open database.");
                
                
                  QSqlTableModel* fixModel = new QSqlTableModel(this);
                  fixModel->setTable ("Items");
                  fixModel->setEditStrategy (QSqlTableModel::OnFieldChange);
                  fixModel->setSort (2, Qt::DescendingOrder);
                
                  fixModel->select ();
                
                
                  ui->tableView_Fix->setModel (fixModel);
                
                  ui->tableView_Fix->setItemDelegateForColumn(2, new FixViewDelegate(this));
                
                 
                  QSqlQuery fixQueryDisp;
                  fixQueryDisp.prepare("SELECT * FROM Items");
                  fixQueryDisp.exec ();
                
                  for(int row1 = 0; fixQueryDisp.next (); row1++) {
                    ui->tableView_Fix->setRowHeight (row1, 100);
                
                  };
                
                  ui->tableView_Fix->horizontalHeader ()->setStyleSheet ("QHeaderView{font: 14pt Arial; color: blue; font-weight: bold; text-decoration: underline;}");
                  ui->tableView_Fix->verticalHeader ()->setVisible (false);
                  ui->tableView_Fix->setAlternatingRowColors (true);
                  ui->tableView_Fix->setStyleSheet ("alternate-background-color: rgb(224,255,248); background-color: white; font: 14pt Arial; ");
                
                  fixModel->setHeaderData (0, Qt::Horizontal, QObject::tr ("ID"));
                  fixModel->setHeaderData (1, Qt::Horizontal, QObject::tr ("Name"));
                  fixModel->setHeaderData (3, Qt::Horizontal, QObject::tr ("What"));
                  fixModel->setHeaderData (2, Qt::Horizontal, QObject::tr ("Image"));
                  fixModel->setHeaderData (4, Qt::Horizontal, QObject::tr ("Material"));
                  fixModel->setHeaderData (5, Qt::Horizontal, QObject::tr ("Color"));
                  fixModel->setHeaderData (6, Qt::Horizontal, QObject::tr ("Description"));
                  fixModel->setHeaderData (7, Qt::Horizontal, QObject::tr ("Adoption Date"));
                  fixModel->setHeaderData (8, Qt::Horizontal, QObject::tr ("Signed by"));
                  fixModel->setHeaderData (9, Qt::Horizontal, QObject::tr ("History"));
                  fixModel->setHeaderData (10, Qt::Horizontal, QObject::tr ("Age"));
                  fixModel->setHeaderData (11, Qt::Horizontal, QObject::tr ("Notes"));
                
                
                  ui->tableView_Fix->setColumnWidth (0, 60);
                  ui->tableView_Fix->setColumnWidth (1, 120);
                  ui->tableView_Fix->setColumnWidth (2, 150);
                  ui->tableView_Fix->setColumnWidth (3, 100);
                  ui->tableView_Fix->setColumnWidth (4, 130);
                  ui->tableView_Fix->setColumnWidth (5, 120);
                  ui->tableView_Fix->setColumnWidth (6, 400);
                  ui->tableView_Fix->setColumnWidth (7, 150);
                  ui->tableView_Fix->setColumnWidth (8, 200);
                  ui->tableView_Fix->setColumnWidth (9, 400);
                  ui->tableView_Fix->setColumnWidth (10, 130);
                  ui->tableView_Fix->setColumnWidth (11, 300);
                
                  ui->tableView_Fix->setWordWrap (true);
                
                }//end of correctFriend
                

                fixviewdelegate.cpp:

                #include "fixviewdelegate.h"
                
                FixViewDelegate::FixViewDelegate(QObject* parent) : QStyledItemDelegate(parent) {
                  qDebug() << "Entered fixViewDelegate (1).";
                }
                
                QWidget* FixViewDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const {
                
                  qDebug() << "Entered createEditor";
                  Q_UNUSED(option);
                  Q_UNUSED(index);
                
                
                  return new ImagePickButton(parent);
                
                }
                
                void FixViewDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const {
                
                  QPixmap loadedImage;
                
                  loadedImage.loadFromData (index.data ().toByteArray ()) ;
                  loadedImage = loadedImage.scaled (100, 100, Qt::KeepAspectRatio);
                
                  const QWidget* widget = option.widget;
                
                
                  QStyle* style = widget ? widget->style() : QApplication::style();
                  style->drawItemPixmap (painter, option.rect, Qt::AlignCenter, loadedImage);
                
                }
                
                void FixViewDelegate::updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index) const {
                  Q_UNUSED(index);
                  editor->setGeometry(option.rect);
                }
                
                void FixViewDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const {
                
                  qDebug() << "Entered setEditorData.";
                  ImagePickButton* imgPick = qobject_cast<ImagePickButton*>(editor);
                  Q_ASSERT(imgPick);
                  imgPick->setSelectedFile(index.data(Qt::UserRole).toString());
                
                }
                
                void FixViewDelegate::setModelData(QWidget* editor, QAbstractItemModel* fixModel, const QModelIndex& index) const {
                  qDebug() << "Entered setModelData. ";//Didn't come hee.
                
                  ImagePickButton* imgPick = qobject_cast<ImagePickButton*>(editor);
                  Q_ASSERT(imgPick);
                
                  if(imgPick->selectedFile().isEmpty()) {
                    fixModel->setData(index, QVariant(), Qt::UserRole);
                    fixModel->setData(index, QVariant(), Qt::DecorationRole);
                  } else {
                    fixModel->setData(index, imgPick->selectedFile(), Qt::UserRole);
                
                    fixModel->setData(index, QIcon(imgPick->selectedFile()), Qt::DecorationRole);
                
                
                
                  }
                
                }
                
                void FixViewDelegate::commitAndCloseEditor() {
                  qDebug() << "Entred commitAndCloseEditor.";
                  ImagePickButton* editor = qobject_cast<ImagePickButton*>(sender());
                
                  emit  commitData (editor);
                  emit closeEditor (editor);
                
                }
                

                imagepickbutton.cpp:

                #include "imagepickbutton.h"
                
                ImagePickButton::ImagePickButton(QWidget* parent) : QWidget(parent) {
                  m_mainButton = new QPushButton(tr("Select \n Image"), this);
                
                  m_mainButton->setStyleSheet ("font: bold;"
                                               "font-size: 12px;"
                                               "background-color: rgba(255, 255, 255, 100);");
                
                
                  m_mainButton->setMaximumWidth(100);
                  m_mainButton->setMinimumWidth (100);
                  m_mainButton->setMaximumHeight (100);
                  m_mainButton->setMinimumHeight (100);
                
                  m_mainButton->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
                
                  QGridLayout* mainLay = new QGridLayout(this);
                  mainLay->setSpacing(0);
                  mainLay->setContentsMargins(0, 0, 0, 0);
                  mainLay->addWidget(m_mainButton, 1, 1);
                  mainLay->addItem(new QSpacerItem(1, 1, QSizePolicy::Preferred, QSizePolicy::Expanding), 0, 1);
                  mainLay->addItem(new QSpacerItem(1, 1, QSizePolicy::Preferred, QSizePolicy::Expanding), 2, 1);
                  mainLay->addItem(new QSpacerItem(1, 1, QSizePolicy::Expanding, QSizePolicy::Preferred), 1, 0);
                  mainLay->addItem(new QSpacerItem(1, 1, QSizePolicy::Expanding, QSizePolicy::Preferred), 1, 2);
                
                  connect(m_mainButton, &QPushButton::clicked, this, &ImagePickButton::selectImageFile);
                }
                
                const QString& ImagePickButton::selectedFile() const {
                  return  m_selectedFile;
                }
                
                void ImagePickButton::setSelectedFile(const QString& val) {
                  if(m_selectedFile == val)
                    return;
                
                  m_selectedFile = val;
                
                  if(m_selectedFile.isEmpty()) {
                    m_mainButton->setText(tr("Select Image"));
                    QFont buttonFont = m_mainButton->font();
                    buttonFont.setPointSize(5);
                    m_mainButton->setIcon(QIcon());
                  } else {
                    m_mainButton->setText(QString());
                    m_mainButton->setIcon(QIcon(m_selectedFile));
                    m_mainButton->setMaximumWidth(100);
                    m_mainButton->setMinimumWidth(100);
                  }
                  emit selectedFileChanged(m_selectedFile);
                  emit editingFinished ();
                  FixViewDelegate* fixView = new FixViewDelegate;
                  fixView->commitAndCloseEditor ();
                
                }
                
                void ImagePickButton::selectImageFile() {
                  const QString newFile = QFileDialog::getOpenFileName(this, tr("Open Image"), QString(), tr("Images (*.png *.xpm *.jpg)"));
                
                  if(!newFile.isEmpty())
                    setSelectedFile(newFile);
                }
                

                Thank you for your help.

                1 Reply Last reply
                0
                • SGaistS SGaist

                  I can't answer, there's not enough data to ensure you have everything.

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

                  @SGaist
                  The new image is displayed at the correct location, but when the focus moves from the changed image the image disappears. I assume it is not really saved in the model and the db is not updated either. I'm trying to fix these two issues. Thank you for any help.

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

                    Looks like you are using custom roles with a QSqlTableModel, you should subclass it to handle custom roles properly the way you want it.

                    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

                      Looks like you are using custom roles with a QSqlTableModel, you should subclass it to handle custom roles properly the way you want it.

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

                      @SGaist
                      Am I supposed to subclass it in setModelData?

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

                        That question doesn't make sense. The suggestion is to make your own class inheriting from QSqlTableModel.

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

                        1 Reply Last reply
                        2

                        • Login

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