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. Different Font Color and Style, QStandardItem
Forum Updated to NodeBB v4.3 + New Features

Different Font Color and Style, QStandardItem

Scheduled Pinned Locked Moved Solved General and Desktop
qstylesheetqstandarditemm
11 Posts 3 Posters 2.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.
  • Q qblacky

    Is it possible to set different Color and Style for QStandardItem into QTreeView dependent on data from Model?
    with QStyleSheet or other Methods?

    eyllanescE Offline
    eyllanescE Offline
    eyllanesc
    wrote on last edited by
    #2

    @qblacky what is the meaning of custom style?

    If you want me to help you develop some work then you can write to my email: e.yllanescucho@gmal.com.

    1 Reply Last reply
    0
    • Q qblacky

      Is it possible to set different Color and Style for QStandardItem into QTreeView dependent on data from Model?
      with QStyleSheet or other Methods?

      JoeCFDJ Offline
      JoeCFDJ Offline
      JoeCFD
      wrote on last edited by
      #3

      @qblacky said in Different Font Color and Style, QStandardItem:

      QStandardItem

      https://forum.qt.io/topic/63715/how-to-style-qtreeview-items-by-role-with-css/9

      1 Reply Last reply
      0
      • Q qblacky

        Is it possible to set different Color and Style for QStandardItem into QTreeView dependent on data from Model?
        with QStyleSheet or other Methods?

        eyllanescE Offline
        eyllanescE Offline
        eyllanesc
        wrote on last edited by eyllanesc
        #4

        @qblacky QStandardItem is not a visual element but a container for information (texts, colors, etc.) so the question makes little sense, if you want to change the view then use a delegate:

        class Delegate: public QStyledItemDelegate{
        public: 
            using QStyledItemDelegate::QStyledItemDelegate;
        protected:
            void initStyleOption(QStyleOptionViewItem * option, const QModelIndex & index) const{
                QVariant data = index.data();
                qDebug() << data;
                QStyledItemDelegate::initStyleOption(option, index);
                if(/*some conditions*/){
                    QFont font(option->font);
                    /*modify fonts*/
                    option->font = font;
                    option->fontMetrics = QFontMetrics(font);
                }
            }
        }
        
        treview->setItemDelegate(new Delegate);
        

        If you want me to help you develop some work then you can write to my email: e.yllanescucho@gmal.com.

        1 Reply Last reply
        0
        • Q Offline
          Q Offline
          qblacky
          wrote on last edited by
          #5

          Hello,

          thanks for answer, i have same solution,
          but FontColor , Foreground or color of QPalette::WindowText
          have no effects for Item.

          void ItemDelegate::initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const 
          {
          
              QStyleOptionViewItem localOpt(*option);
              bool ok = false;
          // value from item 
              double data = index.data(Qt::DisplayRole).toDouble(&ok);
          // data range from item 
              ItemDisclosure *id = new ItemDisclosure(index.data(QtExtUserRoles::LastRole + 1).value<ItemDisclosure>());
              if (id != nullptr)
              {
                if (ok && (id->maxValue() <= data || id->minValue() >= data))
                {
                  //option = id->itemOption();
                  if (id->itemOption() != nullptr)
                  {
          
                    option->font = id->itemOption()->font;
                    option->palette = id->itemOption()->palette;
                    option->palette.setBrush(QPalette::Text, id->itemOption()->palette.brush(QPalette::Text));
                    option->palette.setBrush(QPalette::WindowText, id->itemOption()->palette.brush(QPalette::WindowText));
                    option->palette.setColor(QPalette::Text, id->itemOption()->palette.color(QPalette::Text));
                    option->palette.setColor(QPalette::WindowText, id->itemOption()->palette.color(QPalette::WindowText));
          
                  }
                }
                
              }
              QStyledItemDelegate::initStyleOption(option, index);
            }
          

          only font style and font size are change but not color.

          Thank you.

          eyllanescE 1 Reply Last reply
          0
          • Q qblacky

            Hello,

            thanks for answer, i have same solution,
            but FontColor , Foreground or color of QPalette::WindowText
            have no effects for Item.

            void ItemDelegate::initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const 
            {
            
                QStyleOptionViewItem localOpt(*option);
                bool ok = false;
            // value from item 
                double data = index.data(Qt::DisplayRole).toDouble(&ok);
            // data range from item 
                ItemDisclosure *id = new ItemDisclosure(index.data(QtExtUserRoles::LastRole + 1).value<ItemDisclosure>());
                if (id != nullptr)
                {
                  if (ok && (id->maxValue() <= data || id->minValue() >= data))
                  {
                    //option = id->itemOption();
                    if (id->itemOption() != nullptr)
                    {
            
                      option->font = id->itemOption()->font;
                      option->palette = id->itemOption()->palette;
                      option->palette.setBrush(QPalette::Text, id->itemOption()->palette.brush(QPalette::Text));
                      option->palette.setBrush(QPalette::WindowText, id->itemOption()->palette.brush(QPalette::WindowText));
                      option->palette.setColor(QPalette::Text, id->itemOption()->palette.color(QPalette::Text));
                      option->palette.setColor(QPalette::WindowText, id->itemOption()->palette.color(QPalette::WindowText));
            
                    }
                  }
                  
                }
                QStyledItemDelegate::initStyleOption(option, index);
              }
            

            only font style and font size are change but not color.

            Thank you.

            eyllanescE Offline
            eyllanescE Offline
            eyllanesc
            wrote on last edited by eyllanesc
            #6

            @qblacky You have to make the changes after QStyledItemDelegate::initStyleOption(option, index);:

                void initStyleOption(QStyleOptionViewItem * option, const QModelIndex & index) const{
                    QVariant data = index.data();
                    qDebug() << data;
                    QStyledItemDelegate::initStyleOption(option, index);
                    if(/*some conditions*/){
                        QFont font(option->font);
                        /*modify fonts*/
                        option->font = font;
                        option->fontMetrics = QFontMetrics(font);
                        option->palette.setBrush(QPalette::Text, QBrush(QColor("red")));
                    }
                }
            

            If you want me to help you develop some work then you can write to my email: e.yllanescucho@gmal.com.

            1 Reply Last reply
            0
            • Q Offline
              Q Offline
              qblacky
              wrote on last edited by
              #7
              void ItemDelegate::initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const 
              {
              
                  QStyleOptionViewItem localOpt(*option);
                  bool ok = false;
              // value from item 
                  double data = index.data(Qt::DisplayRole).toDouble(&ok);
              // data range from item 
                  ItemDisclosure *id = new ItemDisclosure(index.data(QtExtUserRoles::LastRole + 1).value<ItemDisclosure>());
                  if (id != nullptr)
                  {
                    QStyledItemDelegate::initStyleOption(option, index);
                    if (ok && (id->maxValue() <= data || id->minValue() >= data))
                    {
                      //option = id->itemOption();
                      if (id->itemOption() != nullptr)
                      {
                         option->font = id->itemOption()->font;          
                         option->palette = id->itemOption()->palette; 
                         option->palette.setBrush(QPalette::Text, QBrush(QColor("red")));
                         option->palette.setBrush(QPalette::WindowText, QBrush(QColor("red")));      }
                    }
                    
                  }
              
                }
              

              This has no effects on the color of the item.

              eyllanescE 1 Reply Last reply
              0
              • Q qblacky
                void ItemDelegate::initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const 
                {
                
                    QStyleOptionViewItem localOpt(*option);
                    bool ok = false;
                // value from item 
                    double data = index.data(Qt::DisplayRole).toDouble(&ok);
                // data range from item 
                    ItemDisclosure *id = new ItemDisclosure(index.data(QtExtUserRoles::LastRole + 1).value<ItemDisclosure>());
                    if (id != nullptr)
                    {
                      QStyledItemDelegate::initStyleOption(option, index);
                      if (ok && (id->maxValue() <= data || id->minValue() >= data))
                      {
                        //option = id->itemOption();
                        if (id->itemOption() != nullptr)
                        {
                           option->font = id->itemOption()->font;          
                           option->palette = id->itemOption()->palette; 
                           option->palette.setBrush(QPalette::Text, QBrush(QColor("red")));
                           option->palette.setBrush(QPalette::WindowText, QBrush(QColor("red")));      }
                      }
                      
                    }
                
                  }
                

                This has no effects on the color of the item.

                eyllanescE Offline
                eyllanescE Offline
                eyllanesc
                wrote on last edited by
                #8

                @qblacky I do not reproduce what you indicate:

                #include <QApplication>
                #include <QStandardItemModel>
                #include <QStyledItemDelegate>
                #include <QTreeView>
                
                class StyledItemDelegate: public QStyledItemDelegate{
                public:
                    using QStyledItemDelegate::QStyledItemDelegate;
                protected:
                    void initStyleOption(QStyleOptionViewItem * option, const QModelIndex & index) const{
                
                        QStyledItemDelegate::initStyleOption(option, index);
                        QFont font(option->font);
                        // change font
                        font.setBold(true);
                        option->font = font;
                        option->fontMetrics = QFontMetrics(font);
                        //change text color
                        option->palette.setBrush(QPalette::Text, QBrush(QColor("red")));
                    }
                
                };
                
                int main(int argc, char *argv[])
                {
                    QApplication a(argc, argv);
                    a.setStyle("fusion");
                    QTreeView w;
                    w.setItemDelegate(new StyledItemDelegate);
                    QStandardItemModel model;
                    model.appendRow(new QStandardItem("FOO"));
                    w.setModel(&model);
                    w.show();
                    return a.exec();
                }
                

                Screenshot_20210817_011846.png

                If you want me to help you develop some work then you can write to my email: e.yllanescucho@gmal.com.

                1 Reply Last reply
                0
                • Q Offline
                  Q Offline
                  qblacky
                  wrote on last edited by
                  #9

                  We have a StyleSheet behind of QTreeView.
                  I want change only from one Item the Color.
                  Not all.

                  Without StyleSheet:
                  5621c54c-ceed-4ca1-9ed3-ffaebac18af8-image.png

                  With StyleSheet:
                  34177bc0-00ee-41d8-9803-f8212d627202-image.png

                  eyllanescE 1 Reply Last reply
                  0
                  • Q qblacky

                    We have a StyleSheet behind of QTreeView.
                    I want change only from one Item the Color.
                    Not all.

                    Without StyleSheet:
                    5621c54c-ceed-4ca1-9ed3-ffaebac18af8-image.png

                    With StyleSheet:
                    34177bc0-00ee-41d8-9803-f8212d627202-image.png

                    eyllanescE Offline
                    eyllanescE Offline
                    eyllanesc
                    wrote on last edited by
                    #10

                    @qblacky You cannot use both technologies: Either you use the delegate OR you use the stylesheet but not both. What happens is that when you use QtStyleSheet a private QStyle is used that interprets the stylesheet and sometimes takes some information but mostly discards the information from QStyleOption.

                    If you want me to help you develop some work then you can write to my email: e.yllanescucho@gmal.com.

                    1 Reply Last reply
                    0
                    • Q Offline
                      Q Offline
                      qblacky
                      wrote on last edited by
                      #11

                      If i'm not define the StyleSheet for item,
                      then work initStyleOption() from delegate.

                      Thank you.

                      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