Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt
  • Unsolved
Collapse
qtws26_logo

The Qt Event of the Year: Qt World Summit 2026

Save Your Spot >
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?
Qt 6.12 LTS is out! See what's new in the release blog

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 8.7k 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.
  • ? 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
                        • Unsolved