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.4k 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 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