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.
  • T Offline
    T Offline
    TomNow99
    wrote on last edited by TomNow99
    #1

    Hi,

    I have QComboBox with QTableView on it and with model with QStandardItems. It looks like this:

    alex.png

    Selected item ( here "Alex" ) has dots around the cell. I would like to delete that dots. A few days ago I asked about it in other QWidget ( no QComboBox / QTableView ). Someone wrote that I should use "widget->setFocusPolicy(Qt::NoFocus)" and in that other widget it was a solution. Here I try it:

            myComboBox->setFocusPolicy(Qt::NoFocus);
            tableView->setFocusPolicy(Qt::NoFocus);
    

    but it doesn't work.

    So how Can I delete this dots ( focus )?

    EDIT:
    I think I find a good solution (Mikhail Zimka's solution with delegate ). Solution with css doesn't work for me.

    https://stackoverflow.com/questions/9044570/qt-qtablewidgets-gray-dotted-border-around-a-selected-cell

    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
      • 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