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. Qtableview set background color to some columns
Forum Updated to NodeBB v4.3 + New Features

Qtableview set background color to some columns

Scheduled Pinned Locked Moved Solved General and Desktop
22 Posts 7 Posters 7.0k Views 3 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.
  • V VRonin
    21 Apr 2021, 12:45

    @n-2204 said in Qtableview set background color to some columns:

    I need to enter integer values in column

    You don't need to do anything special. The default delegate already does this.
    If, and this is a guess on my part, you are using QStandardItemModel you can solve your problem by never using the constructors QStandardItem(QIcon,QString) or QStandardItem(QString). Just construct an empty item and then call item->setData and pass yor integer to it, do not convert it to a string. You'll see the default delegate (or the modifed version I posted above) will do exactly what you want

    N Offline
    N Offline
    n-2204
    wrote on 21 Apr 2021, 12:54 last edited by
    #11

    @VRonin so in above share your code how can i add int delegate ?
    item->setdata i tried but not working for me
    if you have code can you pls share it?
    Thanks

    1 Reply Last reply
    0
    • V Offline
      V Offline
      VRonin
      wrote on 21 Apr 2021, 13:38 last edited by VRonin
      #12

      Disclaimer

      I think your delegate is doing more harm than good but i'll go along with it anyway.


      Inside the class you defined in intvalmodel.h add:

      public:
      void setBrushForColumn(int col, const QBrush& brush);
      protected:
      void initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const override;
      private:
      QMap<int,QBrush> m_brushes;
      

      now intvalmodel.cpp

      #include "intvalmodel.h"
      #include "GAS_tool.h"
      
      intvalmodel::intvalmodel(QObject* parent) :QStyledItemDelegate(parent)
      {
      
      
      }
      QWidget* QStyledItemDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& option,
      	const QModelIndex& index) const
      {
      	QLineEdit* editor = new QLineEdit(parent);
      	// QIntValidator* data = new QIntValidator(0, 999);
      	 //editor->setValidator(data);
      	editor->setValidator(new QIntValidator);
      	return editor;
      
      }
      void intvalmodel::setEditorData(QWidget* editor, const QModelIndex& index) const
      {
      	 QString value1 = index.model()->data(index, Qt::EditRole).toString();
       QLineEdit* line = static_cast<QLineEdit*>(editor);
       line->setText(value1);
      }
      void intvalmodel::setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const
      {
      	  QLineEdit* line = static_cast<QLineEdit*>(editor);
         model->setData(index, line->text().toInt());
      }
      void intvalmodel::updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index) const
      {
      	editor->setGeometry(option.rect);
      }
      
      void intvalmodel::initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const override
          {
              QStyledItemDelegate::initStyleOption(option,index);
              option->backgroundBrush = m_brushes.value(index.column(),option->backgroundBrush);
          }
      void intvalmodel::setBrushForColumn(int col, const QBrush& brush){
      if(col<0 || col >= columnCount())
      return;
      m_brushes[col]=brush;
      }
      

      Now you can use it:

      delegate = new intvalmodel();
      delegate ->setBrushForColumn(1,QBrush(Qt::yellow));
      delegate ->setBrushForColumn(2,QBrush(Qt::red));
      delegate ->setBrushForColumn(3,QBrush(Qt::blue));
       ui.tableView->setItemDelegateForColumn(1,delegate); 
          ui.tableView->setItemDelegateForColumn(2, delegate);
        ui.tableView->setItemDelegateForColumn(3,delegate); 
      

      "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

      N 1 Reply Last reply 22 Apr 2021, 04:46
      2
      • V VRonin
        21 Apr 2021, 13:38

        Disclaimer

        I think your delegate is doing more harm than good but i'll go along with it anyway.


        Inside the class you defined in intvalmodel.h add:

        public:
        void setBrushForColumn(int col, const QBrush& brush);
        protected:
        void initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const override;
        private:
        QMap<int,QBrush> m_brushes;
        

        now intvalmodel.cpp

        #include "intvalmodel.h"
        #include "GAS_tool.h"
        
        intvalmodel::intvalmodel(QObject* parent) :QStyledItemDelegate(parent)
        {
        
        
        }
        QWidget* QStyledItemDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& option,
        	const QModelIndex& index) const
        {
        	QLineEdit* editor = new QLineEdit(parent);
        	// QIntValidator* data = new QIntValidator(0, 999);
        	 //editor->setValidator(data);
        	editor->setValidator(new QIntValidator);
        	return editor;
        
        }
        void intvalmodel::setEditorData(QWidget* editor, const QModelIndex& index) const
        {
        	 QString value1 = index.model()->data(index, Qt::EditRole).toString();
         QLineEdit* line = static_cast<QLineEdit*>(editor);
         line->setText(value1);
        }
        void intvalmodel::setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const
        {
        	  QLineEdit* line = static_cast<QLineEdit*>(editor);
           model->setData(index, line->text().toInt());
        }
        void intvalmodel::updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index) const
        {
        	editor->setGeometry(option.rect);
        }
        
        void intvalmodel::initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const override
            {
                QStyledItemDelegate::initStyleOption(option,index);
                option->backgroundBrush = m_brushes.value(index.column(),option->backgroundBrush);
            }
        void intvalmodel::setBrushForColumn(int col, const QBrush& brush){
        if(col<0 || col >= columnCount())
        return;
        m_brushes[col]=brush;
        }
        

        Now you can use it:

        delegate = new intvalmodel();
        delegate ->setBrushForColumn(1,QBrush(Qt::yellow));
        delegate ->setBrushForColumn(2,QBrush(Qt::red));
        delegate ->setBrushForColumn(3,QBrush(Qt::blue));
         ui.tableView->setItemDelegateForColumn(1,delegate); 
            ui.tableView->setItemDelegateForColumn(2, delegate);
          ui.tableView->setItemDelegateForColumn(3,delegate); 
        
        N Offline
        N Offline
        n-2204
        wrote on 22 Apr 2021, 04:46 last edited by n-2204
        #13

        @VRonin Thanks

        1 Reply Last reply
        0
        • N Offline
          N Offline
          n-2204
          wrote on 22 Apr 2021, 05:58 last edited by
          #14

          if just to color one column and no validation on input in column then that done using Qt::BackgroundRole either via setData so need to refer which class QAbstractitem

          1 Reply Last reply
          0
          • V VRonin
            21 Apr 2021, 09:43

            While the answers above are perfectly valid I think in your case it might be easier to just use a delegate:

            class BackgroundBrushDelegate : public QStyledItemDelegate{
                Q_OBJECT
                Q_PROPERTY(QBrush backgroundBrush READ backgroundBrush WRITE setBackgroundBrush NOTIFY backgroundBrushChanged)
                Q_DISABLE_COPY(BackgroundBrushDelegate)
            public:
                explicit BackgroundBrushDelegate(QObject *parent = nullptr)
                    : QStyledItemDelegate(parent)
                {}
                BackgroundBrushDelegate(const QBrush& brush, QObject *parent = nullptr)
                    : QStyledItemDelegate(parent)
                    , m_backgroundBrush(brush)
                {}
                const QBrush& backgroundBrush() const { return m_backgroundBrush; }
                void setBackgroundBrush(const QBrush& brush)
                {
                    if(m_backgroundBrush==brush)
                        return;
                    m_backgroundBrush=brush;
                    backgroundBrushChanged(m_backgroundBrush);
                }
            signals:
                void backgroundBrushChanged(const QBrush& brush);
            protected:
                void initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const override
                {
                    QStyledItemDelegate::initStyleOption(option,index);
                    option->backgroundBrush = m_backgroundBrush;
                }
            private:
                QBrush m_backgroundBrush;
            }
            

            You can use it with tableView->setItemDelegateForColumn(0,new BackgroundBrushDelegate(QBrush(Qt::yellow),tableView));

            N Offline
            N Offline
            n-2204
            wrote on 22 Apr 2021, 11:41 last edited by VRonin
            #15

            @VRonin

            class BackgroundBrushDelegate : public QStyledItemDelegate{
                Q_OBJECT
                Q_PROPERTY(QBrush backgroundBrush READ backgroundBrush WRITE setBackgroundBrush NOTIFY backgroundBrushChanged)
                Q_DISABLE_COPY(BackgroundBrushDelegate)
            public:
                explicit BackgroundBrushDelegate(QObject *parent = nullptr)
                    : QStyledItemDelegate(parent)
                {}
                BackgroundBrushDelegate(const QBrush& brush, QObject *parent = nullptr)
                    : QStyledItemDelegate(parent)
                    , m_backgroundBrush(brush)
                {}
                const QBrush& backgroundBrush() const { return m_backgroundBrush; }
                void setBackgroundBrush(const QBrush& brush)
                {
                    if(m_backgroundBrush==brush)
                        return;
                    m_backgroundBrush=brush;
                    backgroundBrushChanged(m_backgroundBrush);
                }
            signals:
                void backgroundBrushChanged(const QBrush& brush);
            protected:
                void initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const override
                {
                    QStyledItemDelegate::initStyleOption(option,index);
                    option->backgroundBrush = m_backgroundBrush;
                }
            private:
                QBrush m_backgroundBrush;
            }
            

            when i am using this code
            after applying brushdelegate in that column i am not able to type other then integer can you plz help me how to do ?

            JonBJ 1 Reply Last reply 22 Apr 2021, 17:18
            0
            • N Offline
              N Offline
              n-2204
              wrote on 22 Apr 2021, 11:54 last edited by
              #16

              Please help
              stuck for some assignment
              Thankyou

              V 1 Reply Last reply 22 Apr 2021, 19:21
              0
              • N n-2204
                22 Apr 2021, 11:41

                @VRonin

                class BackgroundBrushDelegate : public QStyledItemDelegate{
                    Q_OBJECT
                    Q_PROPERTY(QBrush backgroundBrush READ backgroundBrush WRITE setBackgroundBrush NOTIFY backgroundBrushChanged)
                    Q_DISABLE_COPY(BackgroundBrushDelegate)
                public:
                    explicit BackgroundBrushDelegate(QObject *parent = nullptr)
                        : QStyledItemDelegate(parent)
                    {}
                    BackgroundBrushDelegate(const QBrush& brush, QObject *parent = nullptr)
                        : QStyledItemDelegate(parent)
                        , m_backgroundBrush(brush)
                    {}
                    const QBrush& backgroundBrush() const { return m_backgroundBrush; }
                    void setBackgroundBrush(const QBrush& brush)
                    {
                        if(m_backgroundBrush==brush)
                            return;
                        m_backgroundBrush=brush;
                        backgroundBrushChanged(m_backgroundBrush);
                    }
                signals:
                    void backgroundBrushChanged(const QBrush& brush);
                protected:
                    void initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const override
                    {
                        QStyledItemDelegate::initStyleOption(option,index);
                        option->backgroundBrush = m_backgroundBrush;
                    }
                private:
                    QBrush m_backgroundBrush;
                }
                

                when i am using this code
                after applying brushdelegate in that column i am not able to type other then integer can you plz help me how to do ?

                JonBJ Offline
                JonBJ Offline
                JonB
                wrote on 22 Apr 2021, 17:18 last edited by JonB
                #17

                @n-2204 said in Qtableview set background color to some columns:

                after applying brushdelegate in that column i am not able to type other then integer can you plz help me how to do ?

                This does not sound like a brush delegate issue. Earlier you have in createEditor() :

                editor->setValidator(new QIntValidator);
                

                Make sure that is applying to the column (look at index parameter) where you want an integer, not some other column, at a guess?

                1 Reply Last reply
                2
                • N n-2204
                  22 Apr 2021, 11:54

                  Please help
                  stuck for some assignment
                  Thankyou

                  V Offline
                  V Offline
                  VRonin
                  wrote on 22 Apr 2021, 19:21 last edited by
                  #18

                  @n-2204 said in Qtableview set background color to some columns:

                  stuck for some assignment

                  I'll quote the wise @mrjj

                  the teacher will catch it and fail them if too much code is just copied.

                  We gave you 2 possible solutions, one with and one without validator. We even integrated it in your existing code. What more can we do to help?

                  "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
                  • N Offline
                    N Offline
                    n-2204
                    wrote on 23 Apr 2021, 04:31 last edited by
                    #19

                    Thanks all for you help
                    May be i asked more that is easy for you ,but as i am new to c++ and qt, so i am not aware of all the concepts.
                    so for me its little tough in implementation

                    1 Reply Last reply
                    0
                    • V VRonin
                      21 Apr 2021, 09:43

                      While the answers above are perfectly valid I think in your case it might be easier to just use a delegate:

                      class BackgroundBrushDelegate : public QStyledItemDelegate{
                          Q_OBJECT
                          Q_PROPERTY(QBrush backgroundBrush READ backgroundBrush WRITE setBackgroundBrush NOTIFY backgroundBrushChanged)
                          Q_DISABLE_COPY(BackgroundBrushDelegate)
                      public:
                          explicit BackgroundBrushDelegate(QObject *parent = nullptr)
                              : QStyledItemDelegate(parent)
                          {}
                          BackgroundBrushDelegate(const QBrush& brush, QObject *parent = nullptr)
                              : QStyledItemDelegate(parent)
                              , m_backgroundBrush(brush)
                          {}
                          const QBrush& backgroundBrush() const { return m_backgroundBrush; }
                          void setBackgroundBrush(const QBrush& brush)
                          {
                              if(m_backgroundBrush==brush)
                                  return;
                              m_backgroundBrush=brush;
                              backgroundBrushChanged(m_backgroundBrush);
                          }
                      signals:
                          void backgroundBrushChanged(const QBrush& brush);
                      protected:
                          void initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const override
                          {
                              QStyledItemDelegate::initStyleOption(option,index);
                              option->backgroundBrush = m_backgroundBrush;
                          }
                      private:
                          QBrush m_backgroundBrush;
                      }
                      

                      You can use it with tableView->setItemDelegateForColumn(0,new BackgroundBrushDelegate(QBrush(Qt::yellow),tableView));

                      C Offline
                      C Offline
                      Chuck333
                      wrote on 7 Feb 2023, 10:36 last edited by
                      #20
                      This post is deleted!
                      1 Reply Last reply
                      0
                      • V VRonin
                        21 Apr 2021, 09:43

                        While the answers above are perfectly valid I think in your case it might be easier to just use a delegate:

                        class BackgroundBrushDelegate : public QStyledItemDelegate{
                            Q_OBJECT
                            Q_PROPERTY(QBrush backgroundBrush READ backgroundBrush WRITE setBackgroundBrush NOTIFY backgroundBrushChanged)
                            Q_DISABLE_COPY(BackgroundBrushDelegate)
                        public:
                            explicit BackgroundBrushDelegate(QObject *parent = nullptr)
                                : QStyledItemDelegate(parent)
                            {}
                            BackgroundBrushDelegate(const QBrush& brush, QObject *parent = nullptr)
                                : QStyledItemDelegate(parent)
                                , m_backgroundBrush(brush)
                            {}
                            const QBrush& backgroundBrush() const { return m_backgroundBrush; }
                            void setBackgroundBrush(const QBrush& brush)
                            {
                                if(m_backgroundBrush==brush)
                                    return;
                                m_backgroundBrush=brush;
                                backgroundBrushChanged(m_backgroundBrush);
                            }
                        signals:
                            void backgroundBrushChanged(const QBrush& brush);
                        protected:
                            void initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const override
                            {
                                QStyledItemDelegate::initStyleOption(option,index);
                                option->backgroundBrush = m_backgroundBrush;
                            }
                        private:
                            QBrush m_backgroundBrush;
                        }
                        

                        You can use it with tableView->setItemDelegateForColumn(0,new BackgroundBrushDelegate(QBrush(Qt::yellow),tableView));

                        C Offline
                        C Offline
                        Chuck333
                        wrote on 7 Feb 2023, 11:46 last edited by
                        #21

                        @VRonin Hi! I am trying to do something similar; however, I am building an application in python, not C++. Could you help me how to understand this code better so I can convert it to python? Or could you maybe show me how it would be in python?

                        jsulmJ 1 Reply Last reply 7 Feb 2023, 12:46
                        0
                        • C Chuck333
                          7 Feb 2023, 11:46

                          @VRonin Hi! I am trying to do something similar; however, I am building an application in python, not C++. Could you help me how to understand this code better so I can convert it to python? Or could you maybe show me how it would be in python?

                          jsulmJ Offline
                          jsulmJ Offline
                          jsulm
                          Lifetime Qt Champion
                          wrote on 7 Feb 2023, 12:46 last edited by
                          #22

                          @Chuck333 What is your exact problem/question?

                          https://forum.qt.io/topic/113070/qt-code-of-conduct

                          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