Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt
  • Unsolved
Collapse
qtws26_logo

The Qt Event of the Year: Qt World Summit 2026

Save Your Spot >
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Draw a PE_IndicatorBranch in a QLabel
Qt 6.12 LTS is out! See what's new in the release blog

Draw a PE_IndicatorBranch in a QLabel

Scheduled Pinned Locked Moved Solved General and Desktop
20 Posts 2 Posters 7.0k 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 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
                                        • Unsolved