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. Conclusion of fixed lists in the editing table. Qt 6.2.1
Forum Update on Monday, May 27th 2025

Conclusion of fixed lists in the editing table. Qt 6.2.1

Scheduled Pinned Locked Moved Solved General and Desktop
qt6
20 Posts 6 Posters 1.2k Views
  • 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.
  • jsulmJ jsulm

    @MyNick-0 https://doc.qt.io/qt-6/qtwidgets-itemviews-spinboxdelegate-example.html
    https://doc.qt.io/qt-6/qtwidgets-itemviews-stardelegate-example.html

    M Offline
    M Offline
    MyNick 0
    wrote on last edited by
    #11

    @jsulm Hi,

    Now my code looks like this:

    statusdelegat.h

    #ifndef STATUSDELEGAT_H
    #define STATUSDELEGAT_H
    
    #include <QStyledItemDelegate>
    #include <QObject>
    #include <QComboBox>
    
    class statusDelegat : public QStyledItemDelegate
    {
        Q_OBJECT
    public:
        explicit statusDelegat(QObject *parent = nullptr);
    
        QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
    
        void setEditorData(QWidget *editor, const QModelIndex &index) const override;
    
    };
    
    #endif // STATUSDELEGAT_H
    

    statusdelegat.cpp

    #include "statusdelegat.h"
    
    statusDelegat::statusDelegat(QObject *parent)
        : QStyledItemDelegate{parent}
    {
    
    }
    
    QWidget *statusDelegat::createEditor(QWidget *parent, const QStyleOptionViewItem &/* option */, const QModelIndex &/* index */) const
    {
        QComboBox *editor = new QComboBox(parent);
    
        return editor;
    }
    
    void statusDelegat::setEditorData(QWidget *editor, const QModelIndex &index) const
    {
        //int value = index.model()->data(index, Qt::EditRole).toInt();
    
        QComboBox *statusComboBox = static_cast<QComboBox*>(editor);
    
        QMap<int, QString> map;
        map[1] = "Show";
        map[2] = "Hide";
        map[5] = "Moderation";
    
        for (auto e : map.keys()) statusComboBox->addItem(map.value(e), map.value(e));
    
    }
    

    dbeditor.cpp

    #include "dbeditor.h"
    #include "ui_dbeditor.h"
    #include "statusdelegat.h"
    
    model = new QSqlTableModel;
    
    model->setTable("TABLE");
    model->setEditStrategy(QSqlTableModel::OnFieldChange);
    model->setHeaderData(0, Qt::Horizontal, tr("id"));
    model->setHeaderData(1, Qt::Horizontal, tr("Status"));
    model->setHeaderData(2, Qt::Horizontal, tr("Name"));
    
    ui->tableView->setModel(model);
    ui->tableView->setItemDelegateForColumn(1, new statusDelegat);
    model->select();
    

    What else should I do to make it work?

    JonBJ 1 Reply Last reply
    0
    • M MyNick 0

      @jsulm Hi,

      Now my code looks like this:

      statusdelegat.h

      #ifndef STATUSDELEGAT_H
      #define STATUSDELEGAT_H
      
      #include <QStyledItemDelegate>
      #include <QObject>
      #include <QComboBox>
      
      class statusDelegat : public QStyledItemDelegate
      {
          Q_OBJECT
      public:
          explicit statusDelegat(QObject *parent = nullptr);
      
          QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
      
          void setEditorData(QWidget *editor, const QModelIndex &index) const override;
      
      };
      
      #endif // STATUSDELEGAT_H
      

      statusdelegat.cpp

      #include "statusdelegat.h"
      
      statusDelegat::statusDelegat(QObject *parent)
          : QStyledItemDelegate{parent}
      {
      
      }
      
      QWidget *statusDelegat::createEditor(QWidget *parent, const QStyleOptionViewItem &/* option */, const QModelIndex &/* index */) const
      {
          QComboBox *editor = new QComboBox(parent);
      
          return editor;
      }
      
      void statusDelegat::setEditorData(QWidget *editor, const QModelIndex &index) const
      {
          //int value = index.model()->data(index, Qt::EditRole).toInt();
      
          QComboBox *statusComboBox = static_cast<QComboBox*>(editor);
      
          QMap<int, QString> map;
          map[1] = "Show";
          map[2] = "Hide";
          map[5] = "Moderation";
      
          for (auto e : map.keys()) statusComboBox->addItem(map.value(e), map.value(e));
      
      }
      

      dbeditor.cpp

      #include "dbeditor.h"
      #include "ui_dbeditor.h"
      #include "statusdelegat.h"
      
      model = new QSqlTableModel;
      
      model->setTable("TABLE");
      model->setEditStrategy(QSqlTableModel::OnFieldChange);
      model->setHeaderData(0, Qt::Horizontal, tr("id"));
      model->setHeaderData(1, Qt::Horizontal, tr("Status"));
      model->setHeaderData(2, Qt::Horizontal, tr("Name"));
      
      ui->tableView->setModel(model);
      ui->tableView->setItemDelegateForColumn(1, new statusDelegat);
      model->select();
      

      What else should I do to make it work?

      JonBJ Offline
      JonBJ Offline
      JonB
      wrote on last edited by
      #12

      @MyNick-0 said in Conclusion of fixed lists in the editing table. Qt 6.2.1:

      What else should I do to make it work?

      Would be nice if you indicated what does not work?

      for (auto e : map.keys()) statusComboBox->addItem(map.value(e), map.value(e));

      You intend to make the text and the value both be the same string?

      You implement setEditorData() but have no need for setModelData()?

      I don't know the answers to these, they are questions for you.

      M 1 Reply Last reply
      2
      • JonBJ JonB

        @MyNick-0 said in Conclusion of fixed lists in the editing table. Qt 6.2.1:

        What else should I do to make it work?

        Would be nice if you indicated what does not work?

        for (auto e : map.keys()) statusComboBox->addItem(map.value(e), map.value(e));

        You intend to make the text and the value both be the same string?

        You implement setEditorData() but have no need for setModelData()?

        I don't know the answers to these, they are questions for you.

        M Offline
        M Offline
        MyNick 0
        wrote on last edited by
        #13

        @JonB Hi,

        1. Nothing has changed, in the first column values of 1, 2, 5

        2. No, there should be values of 1, 2, 5. I still do not know how to get them

        3. Setmodeldata() probably needed, but I still do not know how to write this method.
          After all, I already have ui->tableView->setModel(model);

        JonBJ 1 Reply Last reply
        0
        • M MyNick 0

          @JonB Hi,

          1. Nothing has changed, in the first column values of 1, 2, 5

          2. No, there should be values of 1, 2, 5. I still do not know how to get them

          3. Setmodeldata() probably needed, but I still do not know how to write this method.
            After all, I already have ui->tableView->setModel(model);

          JonBJ Offline
          JonBJ Offline
          JonB
          wrote on last edited by
          #14

          @MyNick-0 said in Conclusion of fixed lists in the editing table. Qt 6.2.1:

          Nothing has changed, in the first column values of 1, 2, 5

          With your code you should be seeing the strings. Do you mean in the model/database? You have done nothing to update the model.

          To get a combobox still showing the string texts but having the values 1,2 5, you should need

          for (auto e : map.keys()) statusComboBox->addItem(map.value(e), e);
          

          You should review what setEditorData() is called to do. The creation of the combo items belongs in the createEditor() method. setEditorData() needs to use index to read the current value in the model and select the corresponding item in the combobox.

          Similarly nothing is going to store the user's selection back to the model till you implement setModelData(). Which needs to use the index passed to it to set the value into the model from the item chosen in the combo.

          M 1 Reply Last reply
          1
          • JonBJ JonB

            @MyNick-0 said in Conclusion of fixed lists in the editing table. Qt 6.2.1:

            Nothing has changed, in the first column values of 1, 2, 5

            With your code you should be seeing the strings. Do you mean in the model/database? You have done nothing to update the model.

            To get a combobox still showing the string texts but having the values 1,2 5, you should need

            for (auto e : map.keys()) statusComboBox->addItem(map.value(e), e);
            

            You should review what setEditorData() is called to do. The creation of the combo items belongs in the createEditor() method. setEditorData() needs to use index to read the current value in the model and select the corresponding item in the combobox.

            Similarly nothing is going to store the user's selection back to the model till you implement setModelData(). Which needs to use the index passed to it to set the value into the model from the item chosen in the combo.

            M Offline
            M Offline
            MyNick 0
            wrote on last edited by
            #15

            @JonB
            Excellent! I added SetModeldata():

            void statusDelegat::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
            {
                QComboBox *statusComboBox = static_cast<QComboBox*>(editor);
            
                QString value = QString::number(statusComboBox->itemData(statusComboBox->currentIndex()).toInt());
            
                model->setData(index, value, Qt::EditRole);
            }
            

            and appeared ComboBox and I can change the values.

            I only have to replace the numbers with the corresponding text values from the map array, with the initial show of the "Status" field, but I do not understand what method I should do this?

            JonBJ 1 Reply Last reply
            0
            • M MyNick 0

              @JonB
              Excellent! I added SetModeldata():

              void statusDelegat::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
              {
                  QComboBox *statusComboBox = static_cast<QComboBox*>(editor);
              
                  QString value = QString::number(statusComboBox->itemData(statusComboBox->currentIndex()).toInt());
              
                  model->setData(index, value, Qt::EditRole);
              }
              

              and appeared ComboBox and I can change the values.

              I only have to replace the numbers with the corresponding text values from the map array, with the initial show of the "Status" field, but I do not understand what method I should do this?

              JonBJ Offline
              JonBJ Offline
              JonB
              wrote on last edited by
              #16

              @MyNick-0
              If you use statusComboBox->addItem(map.value(e), e) then the numeric value, e, is stored as userdata with the item. Then QVariant currentData(int role = Qt::UserRole) const returns the selected item's value. You will want that during setModelData().

              There are also methods to read any item's value or find an item with a specified value if you need them, e.g. during your setEditorData().

              M 1 Reply Last reply
              1
              • JonBJ JonB

                @MyNick-0
                If you use statusComboBox->addItem(map.value(e), e) then the numeric value, e, is stored as userdata with the item. Then QVariant currentData(int role = Qt::UserRole) const returns the selected item's value. You will want that during setModelData().

                There are also methods to read any item's value or find an item with a specified value if you need them, e.g. during your setEditorData().

                M Offline
                M Offline
                MyNick 0
                wrote on last edited by
                #17

                @JonB
                I don't understand.
                This is what the "Status" field looks when opening the table - it is with numbers:
                status_field.png
                I need to replace these numbers with the corresponding values from the array map.
                How can i do this?

                JonBJ 1 Reply Last reply
                0
                • M MyNick 0

                  @JonB
                  I don't understand.
                  This is what the "Status" field looks when opening the table - it is with numbers:
                  status_field.png
                  I need to replace these numbers with the corresponding values from the array map.
                  How can i do this?

                  JonBJ Offline
                  JonBJ Offline
                  JonB
                  wrote on last edited by
                  #18

                  @MyNick-0
                  Up until now you have been asking about editing and the combobox which goes with that. Now you are asking about a different situation, when the table is just showing the data.

                  A QStyledItemDelegate handles the normal display as well as the editing. You could use QString QStyledItemDelegate::displayText(const QVariant &value, const QLocale &locale) const to do your mapping from the numeric value to the string.

                  Another possibility is to override the model's data() method to return the mapped string for DisplayRole but the numeric value for EditRole.

                  Since you already have an editing delegate you might as well do it the first way.

                  M 1 Reply Last reply
                  0
                  • A Offline
                    A Offline
                    aintcross7
                    wrote on last edited by
                    #19

                    I need to somehow create it in my "model" model.

                    https://panoramacharter.ltd/
                    https://19216811.vin/

                    1 Reply Last reply
                    0
                    • JonBJ JonB

                      @MyNick-0
                      Up until now you have been asking about editing and the combobox which goes with that. Now you are asking about a different situation, when the table is just showing the data.

                      A QStyledItemDelegate handles the normal display as well as the editing. You could use QString QStyledItemDelegate::displayText(const QVariant &value, const QLocale &locale) const to do your mapping from the numeric value to the string.

                      Another possibility is to override the model's data() method to return the mapped string for DisplayRole but the numeric value for EditRole.

                      Since you already have an editing delegate you might as well do it the first way.

                      M Offline
                      M Offline
                      MyNick 0
                      wrote on last edited by
                      #20

                      @JonB
                      Yes, I asked because this question is related to the first. Sorry if I confused you.

                      I displayed text data using the displayText() method.

                      Thank you all very much!

                      1 Reply Last reply
                      0
                      • M MyNick 0 has marked this topic as solved on

                      • Login

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