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 delete dots from QWidget?
Forum Updated to NodeBB v4.3 + New Features

How to delete dots from QWidget?

Scheduled Pinned Locked Moved Solved General and Desktop
18 Posts 2 Posters 1.6k Views 1 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.
  • mrjjM Offline
    mrjjM Offline
    mrjj
    Lifetime Qt Champion
    wrote on last edited by
    #2

    Hi
    The delegate is a fine solution if no focus or stylesheet dont fit.

    1 Reply Last reply
    2
    • T Offline
      T Offline
      TomNow99
      wrote on last edited by TomNow99
      #3

      @mrjj Can you explain me ( I'm looking onMikhail Zimka' solution from link ) why I have to write:

          if(!f_focus_border_enabled && option->state & QStyle::State_HasFocus)
          {
              option->state = option->state & ~QStyle::State_HasFocus;
          }
      

      ?

      When I delete that lines, so my initStyleOption() method look like this:

      void FocusControlDelegate::initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const {
          QStyledItemDelegate::initStyleOption(option, index);
      }
      

      everything is ok - I don't see any dots.

      And extra question:

      Can you explain me why I can't write in initStyleOption() method:

          if(option->state & QStyle::State_Selected)
          {
              option->state = option->state & ~QStyle::State_Selected;
          }
      

      Of course I can and I can compile this code, but I still see selections.

      mrjjM 1 Reply Last reply
      0
      • T TomNow99

        @mrjj Can you explain me ( I'm looking onMikhail Zimka' solution from link ) why I have to write:

            if(!f_focus_border_enabled && option->state & QStyle::State_HasFocus)
            {
                option->state = option->state & ~QStyle::State_HasFocus;
            }
        

        ?

        When I delete that lines, so my initStyleOption() method look like this:

        void FocusControlDelegate::initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const {
            QStyledItemDelegate::initStyleOption(option, index);
        }
        

        everything is ok - I don't see any dots.

        And extra question:

        Can you explain me why I can't write in initStyleOption() method:

            if(option->state & QStyle::State_Selected)
            {
                option->state = option->state & ~QStyle::State_Selected;
            }
        

        Of course I can and I can compile this code, but I still see selections.

        mrjjM Offline
        mrjjM Offline
        mrjj
        Lifetime Qt Champion
        wrote on last edited by mrjj
        #4

        @TomNow99
        Hi
        The first code just uses a flag f_focus_border_enabled to allow to turn on/off this functionality

        if(option->state & QStyle::State_Selected)
           {
               option->state = option->state & ~QStyle::State_Selected;
           }
        

        will just always remove the State_Selected with no flag.

        Its odd if it doesn't work for you. Do you have stylesheets put on it ?

        update: tested the code and it works here
        alt text

        1 Reply Last reply
        2
        • T Offline
          T Offline
          TomNow99
          wrote on last edited by TomNow99
          #5

          @mrjj Thank you for answer.

          1. I see that flag - f_focus_border_enabled. But when I look at my code: it is always false - I don't change it using setFocusBorderEnabled() or something else. So I always go to if condition, so I always do:
          option->state = option->state & ~QStyle::State_HasFocus;
          

          And I would like to know what will be when I delete this line, so from code:

          void FocusControlDelegate::initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const {
              QStyledItemDelegate::initStyleOption(option, index);
              if(!f_focus_border_enabled && option->state & QStyle::State_HasFocus)
              {
                  option->state = option->state & ~QStyle::State_HasFocus;
              }
          }
          

          I have now:

          void FocusControlDelegate::initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const {
              QStyledItemDelegate::initStyleOption(option, index);
          }
          

          And I don't see any changes ( in the first and in the second code I don't see any dots ). And my question: why?

          1. Now I would like to delete selections ( blue rectangle in your picture ), which will be for example when I move cursor to the cell. I thought that I can do something simillar and my code is:
          void FocusControlDelegate::initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const {
              QStyledItemDelegate::initStyleOption(option, index);
              if(!f_focus_border_enabled && option->state & QStyle::State_HasFocus)
              {
                  option->state = option->state & ~QStyle::State_HasFocus;
              }
          
              if(option->state & QStyle::State_Selected)
              {
                  option->state = option->state & ~QStyle::State_Selected;
              }
          }
          

          But it doesn't works. I still see blue select rectangle. I don't have any styleSheets.

          mrjjM 1 Reply Last reply
          0
          • T TomNow99

            @mrjj Thank you for answer.

            1. I see that flag - f_focus_border_enabled. But when I look at my code: it is always false - I don't change it using setFocusBorderEnabled() or something else. So I always go to if condition, so I always do:
            option->state = option->state & ~QStyle::State_HasFocus;
            

            And I would like to know what will be when I delete this line, so from code:

            void FocusControlDelegate::initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const {
                QStyledItemDelegate::initStyleOption(option, index);
                if(!f_focus_border_enabled && option->state & QStyle::State_HasFocus)
                {
                    option->state = option->state & ~QStyle::State_HasFocus;
                }
            }
            

            I have now:

            void FocusControlDelegate::initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const {
                QStyledItemDelegate::initStyleOption(option, index);
            }
            

            And I don't see any changes ( in the first and in the second code I don't see any dots ). And my question: why?

            1. Now I would like to delete selections ( blue rectangle in your picture ), which will be for example when I move cursor to the cell. I thought that I can do something simillar and my code is:
            void FocusControlDelegate::initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const {
                QStyledItemDelegate::initStyleOption(option, index);
                if(!f_focus_border_enabled && option->state & QStyle::State_HasFocus)
                {
                    option->state = option->state & ~QStyle::State_HasFocus;
                }
            
                if(option->state & QStyle::State_Selected)
                {
                    option->state = option->state & ~QStyle::State_Selected;
                }
            }
            

            But it doesn't works. I still see blue select rectangle. I don't have any styleSheets.

            mrjjM Offline
            mrjjM Offline
            mrjj
            Lifetime Qt Champion
            wrote on last edited by mrjj
            #6

            Hi
            Very odd

            void FocusControlDelegate::initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const {
                QStyledItemDelegate::initStyleOption(option, index);
            }
            

            still show the dots for me. ( as expected)

            Are you sure it works for you just as this ?

            Anyway, you can remove the blue selection like this (simply dont paint it)

            void FocusControlDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
                                             const QModelIndex &index) const
            {
                QStyleOptionViewItem myOption = QStyleOptionViewItem(option);
                myOption.state &= ~QStyle::State_Selected;
                QStyledItemDelegate::paint( painter, myOption, index );
            }
            
            1 Reply Last reply
            0
            • mrjjM Offline
              mrjjM Offline
              mrjj
              Lifetime Qt Champion
              wrote on last edited by
              #7

              hi
              This works for me to remove both dots and blue

              void FocusControlDelegate::initStyleOption(QStyleOptionViewItem *option,
                                                         const QModelIndex &index) const
              {   
                      option->state = option->state & ~QStyle::State_HasFocus;
                      QStyledItemDelegate::initStyleOption(option, index);
              }
              
              void FocusControlDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
                                               const QModelIndex &index) const
              {
                  QStyleOptionViewItem myOption = QStyleOptionViewItem(option);
                  if ( myOption.state & QStyle::State_Selected )
                    myOption.state &= ~QStyle::State_Selected;
              
                  QStyledItemDelegate::paint( painter, myOption, index );
              }
              
              
              1 Reply Last reply
              0
              • T Offline
                T Offline
                TomNow99
                wrote on last edited by
                #8

                Why I can't do:

                 if ( myOption.state & QStyle::State_Selected )
                      myOption.state &= ~QStyle::State_Selected;
                

                in initStyleOption?

                Yes that code works in paint() method for me too.

                mrjjM 1 Reply Last reply
                0
                • T TomNow99

                  Why I can't do:

                   if ( myOption.state & QStyle::State_Selected )
                        myOption.state &= ~QStyle::State_Selected;
                  

                  in initStyleOption?

                  Yes that code works in paint() method for me too.

                  mrjjM Offline
                  mrjjM Offline
                  mrjj
                  Lifetime Qt Champion
                  wrote on last edited by mrjj
                  #9

                  Hi

                  • Why I can't do in initStyleOption?

                  I dont think its called for all changes in selection etc so
                  it must be handled in paint.

                  I was wrong. This also works. ( with no paint() )

                  void FocusControlDelegate::initStyleOption(QStyleOptionViewItem *option,
                                                             const QModelIndex &index) const
                  {
                          option->state = option->state & ~QStyle::State_HasFocus;
                          option->state &= ~QStyle::State_Selected;
                          QStyledItemDelegate::initStyleOption(option, index);
                  }
                  
                  1 Reply Last reply
                  3
                  • T Offline
                    T Offline
                    TomNow99
                    wrote on last edited by
                    #10

                    @mrjj It doesn't work :(

                    I create very simple code:

                    #include "selectionkillerdelegate.h"
                    
                    SelectionKillerDelegate::SelectionKillerDelegate()
                    {
                    
                    }
                    
                    void SelectionKillerDelegate::initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const
                    {
                        option->state = option->state & ~QStyle::State_HasFocus;
                        option->state &= ~QStyle::State_Selected;
                        QStyledItemDelegate::initStyleOption(option, index);
                    }
                    
                    #include <QScrollBar>
                    #include <QFocusEvent>
                    #include <windows.h>
                    #include <QStandardItem>
                    #include "selectionkillerdelegate.h"
                    #include <QStandardItemModel>
                    #include <QCoreApplication>
                    myComboBox::myComboBox(QWidget *parent): QComboBox(parent)
                    {
                        QStandardItemModel *model = new QStandardItemModel;
                    
                        QStandardItem *item = new QStandardItem("dsadsa");
                    
                        SelectionKillerDelegate *delegate = new SelectionKillerDelegate;
                    
                        model->setItem(0,0,item);
                    
                       item = new QStandardItem("32");
                    
                        model->setItem(1,0,item);
                    
                        item = new QStandardItem("53");
                    
                        model->setItem(2,0,item);
                    
                        item = new QStandardItem("7564");
                    
                        model->setItem(3,0,item);
                        setItemDelegate(delegate);
                        setModel(model);
                    }
                    

                    When I do

                        setItemDelegate(delegate); // that my Delegate
                    

                    or

                        setItemDelegate(new QStyledItemDelegate());
                    

                    effect is the same: I don't see dots, but see selects.

                    mrjjM 1 Reply Last reply
                    0
                    • T TomNow99

                      @mrjj It doesn't work :(

                      I create very simple code:

                      #include "selectionkillerdelegate.h"
                      
                      SelectionKillerDelegate::SelectionKillerDelegate()
                      {
                      
                      }
                      
                      void SelectionKillerDelegate::initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const
                      {
                          option->state = option->state & ~QStyle::State_HasFocus;
                          option->state &= ~QStyle::State_Selected;
                          QStyledItemDelegate::initStyleOption(option, index);
                      }
                      
                      #include <QScrollBar>
                      #include <QFocusEvent>
                      #include <windows.h>
                      #include <QStandardItem>
                      #include "selectionkillerdelegate.h"
                      #include <QStandardItemModel>
                      #include <QCoreApplication>
                      myComboBox::myComboBox(QWidget *parent): QComboBox(parent)
                      {
                          QStandardItemModel *model = new QStandardItemModel;
                      
                          QStandardItem *item = new QStandardItem("dsadsa");
                      
                          SelectionKillerDelegate *delegate = new SelectionKillerDelegate;
                      
                          model->setItem(0,0,item);
                      
                         item = new QStandardItem("32");
                      
                          model->setItem(1,0,item);
                      
                          item = new QStandardItem("53");
                      
                          model->setItem(2,0,item);
                      
                          item = new QStandardItem("7564");
                      
                          model->setItem(3,0,item);
                          setItemDelegate(delegate);
                          setModel(model);
                      }
                      

                      When I do

                          setItemDelegate(delegate); // that my Delegate
                      

                      or

                          setItemDelegate(new QStyledItemDelegate());
                      

                      effect is the same: I don't see dots, but see selects.

                      mrjjM Offline
                      mrjjM Offline
                      mrjj
                      Lifetime Qt Champion
                      wrote on last edited by mrjj
                      #11

                      @TomNow99
                      Hi
                      Hmm, this is a combobox, right ?
                      Not a Table as i test with.

                      But it does call the delegate code right ?
                      So you can use the paint() vesion and it should work ?

                      Just to be sure its this light blue selection ?
                      alt text
                      Oh that is not the blue selection, its a hover effect.
                      The delegate does remove blue selection with he paint() \o/

                      1 Reply Last reply
                      0
                      • T Offline
                        T Offline
                        TomNow99
                        wrote on last edited by
                        #12

                        @mrjj Yes, I was talking and still talk about QComboBox.

                        I did test.

                        My results:

                        delegate.png

                        On the right I have QComboBox without delegate. And here we can see dots around item, and blue select rectangle.

                        On the left i have QComboBox with delegate but QStyledItemDelegate:

                        setItemDelegate(new QStyledItemDelegate());
                        

                        So I don't subclass QStyledItemDelegate, but use QT QStyledDelegate. Result? No dots, no select rectangle, only hover rectangle.

                        So I don't need any method like initStyleOption and paint to delete dots and select rectangle?

                        How Can I delete that hover rectangle?

                        mrjjM 1 Reply Last reply
                        0
                        • T TomNow99

                          @mrjj Yes, I was talking and still talk about QComboBox.

                          I did test.

                          My results:

                          delegate.png

                          On the right I have QComboBox without delegate. And here we can see dots around item, and blue select rectangle.

                          On the left i have QComboBox with delegate but QStyledItemDelegate:

                          setItemDelegate(new QStyledItemDelegate());
                          

                          So I don't subclass QStyledItemDelegate, but use QT QStyledDelegate. Result? No dots, no select rectangle, only hover rectangle.

                          So I don't need any method like initStyleOption and paint to delete dots and select rectangle?

                          How Can I delete that hover rectangle?

                          mrjjM Offline
                          mrjjM Offline
                          mrjj
                          Lifetime Qt Champion
                          wrote on last edited by mrjj
                          #13

                          Hi
                          Hmm, you are right. simply giving it a plain QStyledItemDelegate
                          also removes both dots and selection colors.
                          That was pretty lucky :)

                          I dont know. Using stylesheet has side effects and on Windows it ignores palette.
                          https://stackoverflow.com/questions/37765673/changing-hover-style-for-qcombobox

                          1 Reply Last reply
                          0
                          • T Offline
                            T Offline
                            TomNow99
                            wrote on last edited by
                            #14

                            @mrjj I thought about css. Do you know any delegate way?

                            Something like:

                            option->state = option->state & ~QStyle::State_HASHOVER;
                            

                            Big letters because this doesn't exists ;)

                            mrjjM 1 Reply Last reply
                            0
                            • T TomNow99

                              @mrjj I thought about css. Do you know any delegate way?

                              Something like:

                              option->state = option->state & ~QStyle::State_HASHOVER;
                              

                              Big letters because this doesn't exists ;)

                              mrjjM Offline
                              mrjjM Offline
                              mrjj
                              Lifetime Qt Champion
                              wrote on last edited by
                              #15

                              @TomNow99

                              Hi
                              It seems that

                              void FocusControlDelegate::initStyleOption(QStyleOptionViewItem *option,
                                                                         const QModelIndex &index) const
                              {
                                  option->state = option->state & ~QStyle::State_HasFocus;
                                  option->state &= ~QStyle::State_Selected;
                              
                                  option->state &= ~QStyle::State_MouseOver;
                              
                                  QStyledItemDelegate::initStyleOption(option, index);
                              }
                              
                              

                              does the trick.

                              1 Reply Last reply
                              2
                              • T Offline
                                T Offline
                                TomNow99
                                wrote on last edited by
                                #16

                                @mrjj Wow. Perfect! Thank you! :)

                                mrjjM 1 Reply Last reply
                                0
                                • T TomNow99

                                  @mrjj Wow. Perfect! Thank you! :)

                                  mrjjM Offline
                                  mrjjM Offline
                                  mrjj
                                  Lifetime Qt Champion
                                  wrote on last edited by
                                  #17

                                  @TomNow99
                                  Np.
                                  I did
                                  qDebug() << option->state;
                                  to see what state was being used and State_MouseOver seemed promising :)

                                  1 Reply Last reply
                                  0
                                  • T Offline
                                    T Offline
                                    TomNow99
                                    wrote on last edited by
                                    #18

                                    @mrjj I have other question ( I ask to many questions to better understand delegate ). I would like to use that subclass of QStyledItemDelegate, but now I would like to see dots and selections ( QStyledItemDelegate removes dots and selection colors ). How? I check:

                                            std::cout<<index.row();
                                            if(option.state & QStyle::State_Selected)
                                                std::cout<<"selected";
                                            if(option.state & QStyle::State_HasFocus)
                                                std::cout<<"focus";
                                    

                                    and I see that item, which I hover give me text "selected" and "focus".

                                    So I would like to use subclass of QStyledItemDelegate and have dots and selections colors.

                                    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