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. How to add a spinbox column and combo box column in QTableWidget or QTableView?
Forum Updated to NodeBB v4.3 + New Features

How to add a spinbox column and combo box column in QTableWidget or QTableView?

Scheduled Pinned Locked Moved Unsolved General and Desktop
17 Posts 3 Posters 6.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.
  • Christian EhrlicherC Christian Ehrlicher

    @davidlabib said in How to add a spinbox column and combo box column in QTableWidget or QTableView?:

    not helpful any thing else

    Why not? You want a widget in a QTableWidget and that's the function you need for it...

    VRoninV Offline
    VRoninV Offline
    VRonin
    wrote on last edited by
    #5

    When did you switch to the dark side @Christian-Ehrlicher ? The only good setCellWidget is a Q_DECL_DEPRECATED void setCellWidget

    @davidlabib The jedi answer is to use a QStyledItemDelegate subclass. Would you want the Spin/Combo box to be always visible or just while you are editing?

    "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
    1
    • ? Offline
      ? Offline
      A Former User
      wrote on last edited by
      #6

      @VRonin said in How to add a spinbox column and combo box column in QTableWidget or QTableView?:

      Would you want the Spin/Combo box to be always visible or just while you are editing?

      combobox always visible , spinbox while editing

      VRoninV 1 Reply Last reply
      0
      • ? A Former User

        @VRonin said in How to add a spinbox column and combo box column in QTableWidget or QTableView?:

        Would you want the Spin/Combo box to be always visible or just while you are editing?

        combobox always visible , spinbox while editing

        VRoninV Offline
        VRoninV Offline
        VRonin
        wrote on last edited by VRonin
        #7

        @davidlabib said in How to add a spinbox column and combo box column in QTableWidget or QTableView?:

        spinbox while editing

        class SpinBoxDelegate : public QStyledItemDelegate{
            Q_OBJECT
            Q_DISABLE_COPY(SpinBoxDelegate)
        public:
            explicit SpinBoxDelegate(QObject* parent = Q_NULLPTR) 
                :QStyledItemDelegate(parent)
            {}
            QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const Q_DECL_OVERRIDE
            {
                Q_UNUSED(option)
                Q_UNUSED(index)
                return new QSpinBox(parent);
            }
            void  setEditorData(QWidget *editor, const QModelIndex &index) const Q_DECL_OVERRIDE
            {
                qobject_cast<QSpinBox>(editor)->setValue(index.data().toInt());
            }
            void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const Q_DECL_OVERRIDE
            {
                model->setData(index,qobject_cast<QSpinBox>(editor)->value());
            }
            void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const Q_DECL_OVERRIDE
            {
                Q_UNUSED(index)
                editor->setGeometry(option.rect());
            }
            QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const Q_DECL_OVERRIDE
            {
                qApp->style()->sizeFromContents(
                        QStyle::CT_SpinBox,
                        &option,
                        QSize(option.fontMetrics.horizontalAdvance(displayText(index.data(),option.locale)), option.fontMetrics.height())
                );
            }
        };
        

        combobox always visible

        same as above but you also have to reimplement paint and fill in manually a QStyleOptionComboBox. It's tedious but if you get stuck I'm happy to help.

        To use the delegate you can call something like tableView->setItemDelegateForColumn(0,new SpinBoxDelegate(tableView));

        "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
        1
        • Christian EhrlicherC Offline
          Christian EhrlicherC Offline
          Christian Ehrlicher
          Lifetime Qt Champion
          wrote on last edited by
          #8

          @VRonin said in [How to add a spinbox column and combo box column in QTableWidget or QTableView?]:

          When did you switch to the dark side @Christian-Ehrlicher ?

          but you also have to reimplement paint and fill in manually a QStyleOptionComboBox

          Because of this stupid limitation of the QStyledItemDelegate - I can't show the editor the whole time without custom painting and the up/down spinboxes also don't work well if the item doesn't have the focus. Maybe a task for you for Qt6 ;)

          Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
          Visit the Qt Academy at https://academy.qt.io/catalog

          VRoninV 1 Reply Last reply
          1
          • Christian EhrlicherC Christian Ehrlicher

            @VRonin said in [How to add a spinbox column and combo box column in QTableWidget or QTableView?]:

            When did you switch to the dark side @Christian-Ehrlicher ?

            but you also have to reimplement paint and fill in manually a QStyleOptionComboBox

            Because of this stupid limitation of the QStyledItemDelegate - I can't show the editor the whole time without custom painting and the up/down spinboxes also don't work well if the item doesn't have the focus. Maybe a task for you for Qt6 ;)

            VRoninV Offline
            VRoninV Offline
            VRonin
            wrote on last edited by
            #9

            @Christian-Ehrlicher Fair enough, when the widget to paint becomes complex the process is a nightmare, I agree.


            For a quick and dirty workaround without using setItemWidget, you can check https://pastebin.com/XrppLZ3m

            "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
            • VRoninV VRonin

              @davidlabib said in How to add a spinbox column and combo box column in QTableWidget or QTableView?:

              spinbox while editing

              class SpinBoxDelegate : public QStyledItemDelegate{
                  Q_OBJECT
                  Q_DISABLE_COPY(SpinBoxDelegate)
              public:
                  explicit SpinBoxDelegate(QObject* parent = Q_NULLPTR) 
                      :QStyledItemDelegate(parent)
                  {}
                  QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const Q_DECL_OVERRIDE
                  {
                      Q_UNUSED(option)
                      Q_UNUSED(index)
                      return new QSpinBox(parent);
                  }
                  void  setEditorData(QWidget *editor, const QModelIndex &index) const Q_DECL_OVERRIDE
                  {
                      qobject_cast<QSpinBox>(editor)->setValue(index.data().toInt());
                  }
                  void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const Q_DECL_OVERRIDE
                  {
                      model->setData(index,qobject_cast<QSpinBox>(editor)->value());
                  }
                  void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const Q_DECL_OVERRIDE
                  {
                      Q_UNUSED(index)
                      editor->setGeometry(option.rect());
                  }
                  QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const Q_DECL_OVERRIDE
                  {
                      qApp->style()->sizeFromContents(
                              QStyle::CT_SpinBox,
                              &option,
                              QSize(option.fontMetrics.horizontalAdvance(displayText(index.data(),option.locale)), option.fontMetrics.height())
                      );
                  }
              };
              

              combobox always visible

              same as above but you also have to reimplement paint and fill in manually a QStyleOptionComboBox. It's tedious but if you get stuck I'm happy to help.

              To use the delegate you can call something like tableView->setItemDelegateForColumn(0,new SpinBoxDelegate(tableView));

              ? Offline
              ? Offline
              A Former User
              wrote on last edited by
              #10

              @VRonin said in How to add a spinbox column and combo box column in QTableWidget or QTableView?:

              class SpinBoxDelegate : public QStyledItemDelegate{
              Q_OBJECT
              Q_DISABLE_COPY(SpinBoxDelegate)
              public:
              explicit SpinBoxDelegate(QObject* parent = Q_NULLPTR)
              :QStyledItemDelegate(parent)
              {}
              QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const Q_DECL_OVERRIDE
              {
              Q_UNUSED(option)
              Q_UNUSED(index)
              return new QSpinBox(parent);
              }
              void setEditorData(QWidget *editor, const QModelIndex &index) const Q_DECL_OVERRIDE
              {
              qobject_cast<QSpinBox>(editor)->setValue(index.data().toInt());
              }
              void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const Q_DECL_OVERRIDE
              {
              model->setData(index,qobject_cast<QSpinBox>(editor)->value());
              }
              void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const Q_DECL_OVERRIDE
              {
              Q_UNUSED(index)
              editor->setGeometry(option.rect());
              }
              QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const Q_DECL_OVERRIDE
              {
              qApp->style()->sizeFromContents(
              QStyle::CT_SpinBox,
              &option,
              QSize(option.fontMetrics.horizontalAdvance(displayText(index.data(),option.locale)), option.fontMetrics.height())
              );
              }
              };

              Alot of errors
              0_1536923921209_bd4db172-1cbd-4764-82f0-39f847677c0d-image.png

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

                It's all easy to solve.

                • qobject_cast<QSpinBox> should be qobject_cast<QSpinBox*>
                • option.rect() should be option.rect

                "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
                2
                • ? Offline
                  ? Offline
                  A Former User
                  wrote on last edited by
                  #12

                  @VRonin
                  0_1536954591996_4322db11-0dfc-4cef-974d-ab2e61c65da5-image.png
                  error: use of undeclared identifier 'tableView'

                  VRoninV 1 Reply Last reply
                  0
                  • ? Offline
                    ? Offline
                    A Former User
                    wrote on last edited by A Former User
                    #13
                    This post is deleted!
                    1 Reply Last reply
                    0
                    • ? A Former User

                      @VRonin
                      0_1536954591996_4322db11-0dfc-4cef-974d-ab2e61c65da5-image.png
                      error: use of undeclared identifier 'tableView'

                      VRoninV Offline
                      VRoninV Offline
                      VRonin
                      wrote on last edited by VRonin
                      #14

                      @davidlabib said in How to add a spinbox column and combo box column in QTableWidget or QTableView?:

                      @VRonin
                      0_1536954591996_4322db11-0dfc-4cef-974d-ab2e61c65da5-image.png
                      error: use of undeclared identifier 'tableView'

                      °_°

                      Did you even try to have a guess at what's wrong?! It's super easy. instead of tableView it should be ui->tableView or even a simple this will work

                      "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
                      3
                      • ? Offline
                        ? Offline
                        A Former User
                        wrote on last edited by A Former User
                        #15

                        @VRonin how can i make the spinbox always visible

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

                          You need to reimplement paint, fill a QStyleOptionSpinBox and use the style to paint the control

                          "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
                          3
                          • VRoninV VRonin

                            You need to reimplement paint, fill a QStyleOptionSpinBox and use the style to paint the control

                            ? Offline
                            ? Offline
                            A Former User
                            wrote on last edited by
                            #17

                            @VRonin give me an example please

                            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