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. Draw a PE_IndicatorBranch in a QLabel

Draw a PE_IndicatorBranch in a QLabel

Scheduled Pinned Locked Moved Solved General and Desktop
20 Posts 2 Posters 4.3k 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.
  • O Offline
    O Offline
    oberluz
    wrote on last edited by
    #1

    Hi,

    I'm trying to customise a QlistView row by having the first item in each row show an indicator branch such as that used in QTreeView.

    To accomplish this I add the following widget as the first item in each row. The label text is displayed correctly but I cannot get the indicator branch to display.

    I can get other primitive elements (eg down arrow) to display but not the indicator branch.

    Any ideas?

        class NodeWidget : public QLabel
        {
        public:
            NodeWidget(QWidget *parent = nullptr) :
                QLabel("this text is displayed", parent)
            {
            }
    
        private:
             void paintEvent(QPaintEvent *);
        };
    
        void NodeWidget::paintEvent(QPaintEvent *e)
        {
            QLabel::paintEvent(e);
            QPainter painter(this);
    
            QStyleOptionFocusRect option;
            option.initFrom(this);
            option.backgroundColor = palette().color(QPalette::Background);
            option.state = QStyle::State_Item | QStyle::State_Children;
            style()->drawPrimitive(QStyle::PE_IndicatorBranch, &option, &painter, this);
        }
    
    1 Reply Last reply
    0
    • mrjjM Offline
      mrjjM Offline
      mrjj
      Lifetime Qt Champion
      wrote on last edited by mrjj
      #2

      Hi
      I think it needs a rect also, but not sure its the only thing.

      class NodeWidget : public QLabel
      {
      public:
          NodeWidget(QWidget *parent = nullptr) :
              QLabel("this text is displayed", parent) { }
      private:
          void paintEvent(QPaintEvent *e)
          {
              
              QLabel::paintEvent(e);
              
              QStyleOption branchOption;
              QPainter painter(this);
              //painter.setBrush( Qt::white);
              //painter.drawRect(0, 0, width() - 1, height() - 1);
              branchOption.initFrom(this);
              branchOption.state = QStyle::State_Item | QStyle::State_Children;
              //  branchOption.state |= QStyle::State_Open; // if to draw open
              branchOption.rect = rect();// adjust this
              style()->drawPrimitive(QStyle::PE_IndicatorBranch, &branchOption, &painter, this);
      
          }
      };
      

      alt text
      alt text

      O 1 Reply Last reply
      2
      • mrjjM mrjj

        Hi
        I think it needs a rect also, but not sure its the only thing.

        class NodeWidget : public QLabel
        {
        public:
            NodeWidget(QWidget *parent = nullptr) :
                QLabel("this text is displayed", parent) { }
        private:
            void paintEvent(QPaintEvent *e)
            {
                
                QLabel::paintEvent(e);
                
                QStyleOption branchOption;
                QPainter painter(this);
                //painter.setBrush( Qt::white);
                //painter.drawRect(0, 0, width() - 1, height() - 1);
                branchOption.initFrom(this);
                branchOption.state = QStyle::State_Item | QStyle::State_Children;
                //  branchOption.state |= QStyle::State_Open; // if to draw open
                branchOption.rect = rect();// adjust this
                style()->drawPrimitive(QStyle::PE_IndicatorBranch, &branchOption, &painter, this);
        
            }
        };
        

        alt text
        alt text

        O Offline
        O Offline
        oberluz
        wrote on last edited by
        #3

        @mrjj thanks

        When I read you reply I was in fact playing around setting the option.rect which you correctly identified as not having been sent, although I still haven't been able to display the indicator branch.

        I think it may have to do with the fact that the label is within a layout in a QListwidget row item. Just assigning the QLabel rect doesn't seem enough in my case.

        I'll keep on trying...

        mrjjM 1 Reply Last reply
        0
        • O oberluz

          @mrjj thanks

          When I read you reply I was in fact playing around setting the option.rect which you correctly identified as not having been sent, although I still haven't been able to display the indicator branch.

          I think it may have to do with the fact that the label is within a layout in a QListwidget row item. Just assigning the QLabel rect doesn't seem enough in my case.

          I'll keep on trying...

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

          @oberluz
          Hi
          well if you look at the test code, it seems that
          style()->drawPrimitive(QStyle::PE_IndicatorBranch draws the
          the indicator in the center of the rect given.
          It should not matter if inside a QListwidget but you might want to
          check the rect label.

          O 1 Reply Last reply
          3
          • mrjjM mrjj

            @oberluz
            Hi
            well if you look at the test code, it seems that
            style()->drawPrimitive(QStyle::PE_IndicatorBranch draws the
            the indicator in the center of the rect given.
            It should not matter if inside a QListwidget but you might want to
            check the rect label.

            O Offline
            O Offline
            oberluz
            wrote on last edited by oberluz
            #5

            @mrjj Yes I noticed that. I've replicated your test example and I can now get it to display in the row of a QListWidget. Thanks

            mrjjM 1 Reply Last reply
            0
            • O oberluz

              @mrjj Yes I noticed that. I've replicated your test example and I can now get it to display in the row of a QListWidget. Thanks

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

              @oberluz
              You can simply calculate a new rect for the beginning of the text line and
              then ask QLabel to center text or similar.
              If you want complete control you should draw both text and PE_IndicatorBranch
              with painter.
              (and not call QLabel::paintEvent(e); )
              However, if you use rich text in Label or mutliple lines it is slightly more complicated.

              O 1 Reply Last reply
              4
              • mrjjM mrjj

                @oberluz
                You can simply calculate a new rect for the beginning of the text line and
                then ask QLabel to center text or similar.
                If you want complete control you should draw both text and PE_IndicatorBranch
                with painter.
                (and not call QLabel::paintEvent(e); )
                However, if you use rich text in Label or mutliple lines it is slightly more complicated.

                O Offline
                O Offline
                oberluz
                wrote on last edited by
                #7

                @mrjj thanks. I was able to get it to work if the QListWidget was the central widget in the QApplicaiton as per your example. However if I add it to a dock widget they fail to draw:

                #ifndef MAINWINDOW_H
                #define MAINWINDOW_H
                
                #include <QMainWindow>
                
                namespace Ui {
                    class MainWindow;
                }
                
                class MainWindow : public QMainWindow
                {
                    Q_OBJECT
                
                public:
                    explicit MainWindow(QWidget *parent = 0);
                    ~MainWindow();
                
                    QWidget* createListWidget();
                
                private:
                    Ui::MainWindow *ui;
                };
                
                #endif // MAINWINDOW_H
                
                #include "MainWindow.h"
                #include "ui_MainWindow.h"
                #include <QListWidget>
                #include <QLabel>
                #include <QPainter>
                #include <QHBoxLayout>
                #include <QApplication>
                #include <iostream>
                #include <QDockWidget>
                
                class NodeWidget : public QLabel
                {
                public:
                    NodeWidget(QWidget *parent = NULL) :
                        QLabel("", parent)
                    {
                    }
                
                private:
                     void paintEvent(QPaintEvent *);
                };
                
                void NodeWidget::paintEvent(QPaintEvent *e)
                {
                    QLabel::paintEvent(e);
                    QPainter painter(this);
                    QStyleOption option;
                    option.initFrom(this);
                    option.rect = rect();
                    option.state = QStyle::State_Item | QStyle::State_Children;
                    style()->drawPrimitive(QStyle::PE_IndicatorBranch, &option, &painter, this);
                }
                
                class RowWidget : public QWidget
                {
                public:
                    RowWidget(const QString& text, QWidget *parent = NULL);
                };
                
                
                RowWidget::RowWidget(const QString &text, QWidget *parent) :
                    QWidget(parent)
                {
                    QHBoxLayout* layout = new QHBoxLayout(this);
                    layout->setContentsMargins(0,0,0,0);
                
                    layout->addWidget(new NodeWidget(this));
                    layout->addWidget(new QLabel(text, this));
                    layout->addWidget(new QLabel("text", this));
                
                    setLayout(layout);
                }
                
                
                MainWindow::MainWindow(QWidget *parent) :
                    QMainWindow(parent),
                    ui(new Ui::MainWindow)
                {
                    ui->setupUi(this);
                    layout()->setContentsMargins(0,0,0,0);
                
                    QString styleSheet("QDockWidget::title { font: 75 11pt \"ubuntu\"; text-align: left; background: darkgray; }");
                
                    QDockWidget* m_dockWidget;
                    m_dockWidget = new QDockWidget(" Dock Window", this);
                    m_dockWidget->setObjectName(QString::fromUtf8("DockWidget"));
                    QSizePolicy sizePolicy6(QSizePolicy::Minimum, QSizePolicy::Minimum);
                    sizePolicy6.setHorizontalStretch(0);
                    sizePolicy6.setVerticalStretch(0);
                    sizePolicy6.setHeightForWidth(m_dockWidget->sizePolicy().hasHeightForWidth());
                    m_dockWidget->setSizePolicy(sizePolicy6);
                    m_dockWidget->setAllowedAreas(Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea|Qt::TopDockWidgetArea|Qt::BottomDockWidgetArea);
                
                    m_dockWidget->layout()->setContentsMargins(0,0,0,0);
                    m_dockWidget->setStyleSheet(styleSheet);
                
                    addDockWidget(Qt::BottomDockWidgetArea, m_dockWidget);
                
                    QWidget* list = createListWidget();
                    m_dockWidget->setWidget(list);
                
                    {
                        QWidget* list = createListWidget();
                        setCentralWidget(list);
                    }
                }
                
                MainWindow::~MainWindow()
                {
                    delete ui;
                }
                
                QWidget *MainWindow::createListWidget()
                {
                    QListWidget* list = new QListWidget(this);
                    list->setAlternatingRowColors(true);
                
                    RowWidget* widget = new RowWidget("one", list);
                    QListWidgetItem* item = new QListWidgetItem(list);
                    item->setSizeHint(widget->minimumSizeHint());
                    list->addItem(item);
                    list->setItemWidget(item, widget);
                
                    widget = new RowWidget("two", list);
                    item = new QListWidgetItem(list);
                    item->setSizeHint(widget->minimumSizeHint());
                    list->addItem(item);
                    list->setItemWidget(item, widget);
                
                    widget = new RowWidget("three", list);
                    item = new QListWidgetItem(list);
                    item->setSizeHint(widget->minimumSizeHint());
                    list->addItem(item);
                    list->setItemWidget(item, widget);
                
                    return list;
                }
                

                0_1561451749908_dockwidget.png

                O 1 Reply Last reply
                1
                • O oberluz

                  @mrjj thanks. I was able to get it to work if the QListWidget was the central widget in the QApplicaiton as per your example. However if I add it to a dock widget they fail to draw:

                  #ifndef MAINWINDOW_H
                  #define MAINWINDOW_H
                  
                  #include <QMainWindow>
                  
                  namespace Ui {
                      class MainWindow;
                  }
                  
                  class MainWindow : public QMainWindow
                  {
                      Q_OBJECT
                  
                  public:
                      explicit MainWindow(QWidget *parent = 0);
                      ~MainWindow();
                  
                      QWidget* createListWidget();
                  
                  private:
                      Ui::MainWindow *ui;
                  };
                  
                  #endif // MAINWINDOW_H
                  
                  #include "MainWindow.h"
                  #include "ui_MainWindow.h"
                  #include <QListWidget>
                  #include <QLabel>
                  #include <QPainter>
                  #include <QHBoxLayout>
                  #include <QApplication>
                  #include <iostream>
                  #include <QDockWidget>
                  
                  class NodeWidget : public QLabel
                  {
                  public:
                      NodeWidget(QWidget *parent = NULL) :
                          QLabel("", parent)
                      {
                      }
                  
                  private:
                       void paintEvent(QPaintEvent *);
                  };
                  
                  void NodeWidget::paintEvent(QPaintEvent *e)
                  {
                      QLabel::paintEvent(e);
                      QPainter painter(this);
                      QStyleOption option;
                      option.initFrom(this);
                      option.rect = rect();
                      option.state = QStyle::State_Item | QStyle::State_Children;
                      style()->drawPrimitive(QStyle::PE_IndicatorBranch, &option, &painter, this);
                  }
                  
                  class RowWidget : public QWidget
                  {
                  public:
                      RowWidget(const QString& text, QWidget *parent = NULL);
                  };
                  
                  
                  RowWidget::RowWidget(const QString &text, QWidget *parent) :
                      QWidget(parent)
                  {
                      QHBoxLayout* layout = new QHBoxLayout(this);
                      layout->setContentsMargins(0,0,0,0);
                  
                      layout->addWidget(new NodeWidget(this));
                      layout->addWidget(new QLabel(text, this));
                      layout->addWidget(new QLabel("text", this));
                  
                      setLayout(layout);
                  }
                  
                  
                  MainWindow::MainWindow(QWidget *parent) :
                      QMainWindow(parent),
                      ui(new Ui::MainWindow)
                  {
                      ui->setupUi(this);
                      layout()->setContentsMargins(0,0,0,0);
                  
                      QString styleSheet("QDockWidget::title { font: 75 11pt \"ubuntu\"; text-align: left; background: darkgray; }");
                  
                      QDockWidget* m_dockWidget;
                      m_dockWidget = new QDockWidget(" Dock Window", this);
                      m_dockWidget->setObjectName(QString::fromUtf8("DockWidget"));
                      QSizePolicy sizePolicy6(QSizePolicy::Minimum, QSizePolicy::Minimum);
                      sizePolicy6.setHorizontalStretch(0);
                      sizePolicy6.setVerticalStretch(0);
                      sizePolicy6.setHeightForWidth(m_dockWidget->sizePolicy().hasHeightForWidth());
                      m_dockWidget->setSizePolicy(sizePolicy6);
                      m_dockWidget->setAllowedAreas(Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea|Qt::TopDockWidgetArea|Qt::BottomDockWidgetArea);
                  
                      m_dockWidget->layout()->setContentsMargins(0,0,0,0);
                      m_dockWidget->setStyleSheet(styleSheet);
                  
                      addDockWidget(Qt::BottomDockWidgetArea, m_dockWidget);
                  
                      QWidget* list = createListWidget();
                      m_dockWidget->setWidget(list);
                  
                      {
                          QWidget* list = createListWidget();
                          setCentralWidget(list);
                      }
                  }
                  
                  MainWindow::~MainWindow()
                  {
                      delete ui;
                  }
                  
                  QWidget *MainWindow::createListWidget()
                  {
                      QListWidget* list = new QListWidget(this);
                      list->setAlternatingRowColors(true);
                  
                      RowWidget* widget = new RowWidget("one", list);
                      QListWidgetItem* item = new QListWidgetItem(list);
                      item->setSizeHint(widget->minimumSizeHint());
                      list->addItem(item);
                      list->setItemWidget(item, widget);
                  
                      widget = new RowWidget("two", list);
                      item = new QListWidgetItem(list);
                      item->setSizeHint(widget->minimumSizeHint());
                      list->addItem(item);
                      list->setItemWidget(item, widget);
                  
                      widget = new RowWidget("three", list);
                      item = new QListWidgetItem(list);
                      item->setSizeHint(widget->minimumSizeHint());
                      list->addItem(item);
                      list->setItemWidget(item, widget);
                  
                      return list;
                  }
                  

                  0_1561451749908_dockwidget.png

                  O Offline
                  O Offline
                  oberluz
                  wrote on last edited by oberluz
                  #8

                  @oberluz said in Draw a PE_IndicatorBranch in a QLabel:

                  drawPrimitive

                  my bad: the style sheet is causing the issue. Can't see why that could cause it?

                  1 Reply Last reply
                  0
                  • mrjjM Offline
                    mrjjM Offline
                    mrjj
                    Lifetime Qt Champion
                    wrote on last edited by
                    #9

                    Hi
                    What does the stylesheet target?
                    margins and such can affect lots of stuff if not
                    target using names or concrete types as selectors

                    O 1 Reply Last reply
                    1
                    • mrjjM mrjj

                      Hi
                      What does the stylesheet target?
                      margins and such can affect lots of stuff if not
                      target using names or concrete types as selectors

                      O Offline
                      O Offline
                      oberluz
                      wrote on last edited by
                      #10

                      @mrjj I only intended it to darken the dock window title bar:

                      QString styleSheet("QDockWidget::title { font: 75 11pt \"ubuntu\"; text-align: left; background: darkgray; }");
                      
                      mrjjM 1 Reply Last reply
                      0
                      • O oberluz

                        @mrjj I only intended it to darken the dock window title bar:

                        QString styleSheet("QDockWidget::title { font: 75 11pt \"ubuntu\"; text-align: left; background: darkgray; }");
                        
                        mrjjM Offline
                        mrjjM Offline
                        mrjj
                        Lifetime Qt Champion
                        wrote on last edited by
                        #11

                        @oberluz
                        so if you do use styleSheet it looks as you expect?
                        you are right, im not sure either how that should affect NodeWidget

                        O 1 Reply Last reply
                        0
                        • mrjjM mrjj

                          @oberluz
                          so if you do use styleSheet it looks as you expect?
                          you are right, im not sure either how that should affect NodeWidget

                          O Offline
                          O Offline
                          oberluz
                          wrote on last edited by
                          #12

                          @mrjj yes, without the stylesheet its fine:

                          0_1561455516847_without_style.png

                          Is its possible I need to get the current style sheet, then somehow add the title, and then set it ? I'm thinking that by just setting it rather than modifying it I might be deleting something

                          mrjjM 1 Reply Last reply
                          1
                          • O oberluz

                            @mrjj yes, without the stylesheet its fine:

                            0_1561455516847_without_style.png

                            Is its possible I need to get the current style sheet, then somehow add the title, and then set it ? I'm thinking that by just setting it rather than modifying it I might be deleting something

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

                            @oberluz
                            Hi
                            Unless you manually set a stylesheet, its empty pr default.
                            so if that is the ONLY stylesheet you set, i dont get it.

                            O 1 Reply Last reply
                            1
                            • mrjjM mrjj

                              @oberluz
                              Hi
                              Unless you manually set a stylesheet, its empty pr default.
                              so if that is the ONLY stylesheet you set, i dont get it.

                              O Offline
                              O Offline
                              oberluz
                              wrote on last edited by
                              #14

                              @mrjj its the only one, the example I posted is complete

                              mrjjM 1 Reply Last reply
                              0
                              • O oberluz

                                @mrjj its the only one, the example I posted is complete

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

                                @oberluz
                                Sorry, i really cant guess.
                                It seems not very connected.
                                and should only affect Title

                                O 1 Reply Last reply
                                1
                                • mrjjM mrjj

                                  @oberluz
                                  Sorry, i really cant guess.
                                  It seems not very connected.
                                  and should only affect Title

                                  O Offline
                                  O Offline
                                  oberluz
                                  wrote on last edited by
                                  #16

                                  @mrjj Maybe a bug.. I might raise one with this example

                                  mrjjM 1 Reply Last reply
                                  0
                                  • O oberluz

                                    @mrjj Maybe a bug.. I might raise one with this example

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

                                    @oberluz
                                    Could be.
                                    Please make a small sample that can reproduce it.
                                    Makes it far more likely we discover what it is. :)

                                    O 1 Reply Last reply
                                    0
                                    • mrjjM mrjj

                                      @oberluz
                                      Could be.
                                      Please make a small sample that can reproduce it.
                                      Makes it far more likely we discover what it is. :)

                                      O Offline
                                      O Offline
                                      oberluz
                                      wrote on last edited by
                                      #18

                                      @mrjj will do and I'll run it under 5.13 before submititng

                                      mrjjM 1 Reply Last reply
                                      3
                                      • O oberluz

                                        @mrjj will do and I'll run it under 5.13 before submititng

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

                                        @oberluz
                                        Super.
                                        and please post link to bug here :)

                                        O 1 Reply Last reply
                                        1
                                        • mrjjM mrjj

                                          @oberluz
                                          Super.
                                          and please post link to bug here :)

                                          O Offline
                                          O Offline
                                          oberluz
                                          wrote on last edited by
                                          #20

                                          @mrjj https://bugreports.qt.io/browse/QTBUG-76947
                                          as promised. reproduced it with 5.13.

                                          1 Reply Last reply
                                          4

                                          • Login

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • Users
                                          • Groups
                                          • Search
                                          • Get Qt Extensions
                                          • Unsolved