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 can I center QCheckBox in QTableView?
QtWS25 Last Chance

How can I center QCheckBox in QTableView?

Scheduled Pinned Locked Moved Solved General and Desktop
qtableview
25 Posts 5 Posters 4.0k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • C Christian Ehrlicher
    9 Nov 2021, 16:31

    You should follow this example: https://wiki.qt.io/Center_a_QCheckBox_or_Decoration_in_an_Itemview

    C Offline
    C Offline
    CuriousPan
    wrote on 12 Nov 2021, 13:28 last edited by
    #6

    @Christian-Ehrlicher, hey, this is a really nice example, but I don't understand what 'role' should I use in the model to center the checkbox, because now it's in the left top corner.

    J 1 Reply Last reply 12 Nov 2021, 13:47
    0
    • C CuriousPan
      12 Nov 2021, 13:28

      @Christian-Ehrlicher, hey, this is a really nice example, but I don't understand what 'role' should I use in the model to center the checkbox, because now it's in the left top corner.

      J Offline
      J Offline
      JonB
      wrote on 12 Nov 2021, 13:47 last edited by JonB 11 Dec 2021, 13:47
      #7

      @CuriousPan
      The code at @Christian-Ehrlicher's https://wiki.qt.io/Center_a_QCheckBox_or_Decoration_in_an_Itemview tells you what role it is using

      As alignment indicator the Qt::TextAlignmentRole is 'misused' since no text is drawn for the cell.

      and you can see it in the code you are copying:

      opt.rect = QStyle::alignedRect(opt.direction, index.data(Qt::TextAlignmentRole).value<Qt::Alignment>(), rect.size(), opt.rect);

      Or use your own role if you don't want to use that.

      C 1 Reply Last reply 12 Nov 2021, 13:55
      1
      • J JonB
        12 Nov 2021, 13:47

        @CuriousPan
        The code at @Christian-Ehrlicher's https://wiki.qt.io/Center_a_QCheckBox_or_Decoration_in_an_Itemview tells you what role it is using

        As alignment indicator the Qt::TextAlignmentRole is 'misused' since no text is drawn for the cell.

        and you can see it in the code you are copying:

        opt.rect = QStyle::alignedRect(opt.direction, index.data(Qt::TextAlignmentRole).value<Qt::Alignment>(), rect.size(), opt.rect);

        Or use your own role if you don't want to use that.

        C Offline
        C Offline
        CuriousPan
        wrote on 12 Nov 2021, 13:55 last edited by CuriousPan 11 Dec 2021, 13:55
        #8

        @JonB, yeees, I understood this and I was using Qt::TextAlignmentRole and returning Qt::AlignCenter, but for some reason it's not aligned :(
        21cc5073-d844-4a87-ac13-f40a60c0cea3-image.png

        3076c24a-05b5-476e-9154-09e658caebab-image.png

        J C 2 Replies Last reply 12 Nov 2021, 13:57
        0
        • C CuriousPan
          12 Nov 2021, 13:55

          @JonB, yeees, I understood this and I was using Qt::TextAlignmentRole and returning Qt::AlignCenter, but for some reason it's not aligned :(
          21cc5073-d844-4a87-ac13-f40a60c0cea3-image.png

          3076c24a-05b5-476e-9154-09e658caebab-image.png

          J Offline
          J Offline
          JonB
          wrote on 12 Nov 2021, 13:57 last edited by JonB 11 Dec 2021, 13:58
          #9

          @CuriousPan
          I do not know about the behaviour of the delegate. But if you want to know to know whether it is being "triggered" and recognises the role in question put in a qDebug() statement (in the delegate) to find out.

          C 1 Reply Last reply 12 Nov 2021, 13:58
          0
          • C CuriousPan
            12 Nov 2021, 13:55

            @JonB, yeees, I understood this and I was using Qt::TextAlignmentRole and returning Qt::AlignCenter, but for some reason it's not aligned :(
            21cc5073-d844-4a87-ac13-f40a60c0cea3-image.png

            3076c24a-05b5-476e-9154-09e658caebab-image.png

            C Offline
            C Offline
            CuriousPan
            wrote on 12 Nov 2021, 13:57 last edited by
            #10
            This post is deleted!
            1 Reply Last reply
            0
            • J JonB
              12 Nov 2021, 13:57

              @CuriousPan
              I do not know about the behaviour of the delegate. But if you want to know to know whether it is being "triggered" and recognises the role in question put in a qDebug() statement (in the delegate) to find out.

              C Offline
              C Offline
              CuriousPan
              wrote on 12 Nov 2021, 13:58 last edited by
              #11

              @JonB, yes, it's defenitely triggered.

              J 1 Reply Last reply 12 Nov 2021, 14:04
              0
              • C CuriousPan
                12 Nov 2021, 13:58

                @JonB, yes, it's defenitely triggered.

                J Offline
                J Offline
                JonB
                wrote on 12 Nov 2021, 14:04 last edited by
                #12

                @CuriousPan
                Find all your occurrences of

                QStyle::alignedRect(opt.direction, index.data(Qt::TextAlignmentRole).value<Qt::Alignment>(), rect.size(), opt.rect)
                

                and qDebug() << index.data(Qt::TextAlignmentRole).value<Qt::Alignment>().

                C 1 Reply Last reply 12 Nov 2021, 14:07
                0
                • J JonB
                  12 Nov 2021, 14:04

                  @CuriousPan
                  Find all your occurrences of

                  QStyle::alignedRect(opt.direction, index.data(Qt::TextAlignmentRole).value<Qt::Alignment>(), rect.size(), opt.rect)
                  

                  and qDebug() << index.data(Qt::TextAlignmentRole).value<Qt::Alignment>().

                  C Offline
                  C Offline
                  CuriousPan
                  wrote on 12 Nov 2021, 14:07 last edited by
                  #13

                  @JonB, it always retruns QFlags<Qt::AlignmentFlag>() 1 which is Qt::DecorationRole, right?

                  R J 2 Replies Last reply 12 Nov 2021, 14:12
                  0
                  • C CuriousPan
                    12 Nov 2021, 14:07

                    @JonB, it always retruns QFlags<Qt::AlignmentFlag>() 1 which is Qt::DecorationRole, right?

                    R Offline
                    R Offline
                    raven-worx
                    Moderators
                    wrote on 12 Nov 2021, 14:12 last edited by
                    #14

                    @CuriousPan said in How can I center QCheckBox in QTableView?:

                    it always retruns QFlagsQt::AlignmentFlag() 1 which is Qt::DecorationRole, right

                    the Qt::AlignmentFlag flags/enum doesnt contain Qt::DecorationRole, so no
                    https://doc.qt.io/qt-5/qt.html#AlignmentFlag-enum

                    --- SUPPORT REQUESTS VIA CHAT WILL BE IGNORED ---
                    If you have a question please use the forum so others can benefit from the solution in the future

                    C 2 Replies Last reply 12 Nov 2021, 14:15
                    0
                    • R raven-worx
                      12 Nov 2021, 14:12

                      @CuriousPan said in How can I center QCheckBox in QTableView?:

                      it always retruns QFlagsQt::AlignmentFlag() 1 which is Qt::DecorationRole, right

                      the Qt::AlignmentFlag flags/enum doesnt contain Qt::DecorationRole, so no
                      https://doc.qt.io/qt-5/qt.html#AlignmentFlag-enum

                      C Offline
                      C Offline
                      CuriousPan
                      wrote on 12 Nov 2021, 14:15 last edited by
                      #15

                      @raven-worx, oh, I see. You're right. Anyway, why is that so?

                      1 Reply Last reply
                      0
                      • R raven-worx
                        12 Nov 2021, 14:12

                        @CuriousPan said in How can I center QCheckBox in QTableView?:

                        it always retruns QFlagsQt::AlignmentFlag() 1 which is Qt::DecorationRole, right

                        the Qt::AlignmentFlag flags/enum doesnt contain Qt::DecorationRole, so no
                        https://doc.qt.io/qt-5/qt.html#AlignmentFlag-enum

                        C Offline
                        C Offline
                        CuriousPan
                        wrote on 12 Nov 2021, 14:20 last edited by
                        #16

                        @raven-worx, wait! I confused you and me. This '1' is my custom printout. So what you suggested printing just gives following output: QFlags<Qt::AlignmentFlag>()

                        J 1 Reply Last reply 12 Nov 2021, 14:26
                        0
                        • C CuriousPan
                          12 Nov 2021, 14:20

                          @raven-worx, wait! I confused you and me. This '1' is my custom printout. So what you suggested printing just gives following output: QFlags<Qt::AlignmentFlag>()

                          J Offline
                          J Offline
                          JonB
                          wrote on 12 Nov 2021, 14:26 last edited by JonB 11 Dec 2021, 14:26
                          #17

                          @CuriousPan
                          Qt::AlignLeft 0x0001 Aligns with the left edge.

                          So this value 1 is left alignment, just as per your picture, and no kind of centering specified, which would have value 4.

                          C 1 Reply Last reply 12 Nov 2021, 14:28
                          0
                          • J JonB
                            12 Nov 2021, 14:26

                            @CuriousPan
                            Qt::AlignLeft 0x0001 Aligns with the left edge.

                            So this value 1 is left alignment, just as per your picture, and no kind of centering specified, which would have value 4.

                            C Offline
                            C Offline
                            CuriousPan
                            wrote on 12 Nov 2021, 14:28 last edited by
                            #18

                            @JonB, yeah, it is, but as I said, no numbers are printed.
                            f3a89a98-7f28-4581-955b-721b64fbfc0e-image.png

                            1 Reply Last reply
                            0
                            • C CuriousPan
                              12 Nov 2021, 14:07

                              @JonB, it always retruns QFlags<Qt::AlignmentFlag>() 1 which is Qt::DecorationRole, right?

                              J Offline
                              J Offline
                              JonB
                              wrote on 12 Nov 2021, 14:29 last edited by JonB 11 Dec 2021, 14:30
                              #19

                              @CuriousPan said in How can I center QCheckBox in QTableView?:

                              @JonB, it always retruns QFlagsQt::AlignmentFlag() 1 which is Qt::DecorationRole, right?

                              That's what you wrote. See that 1? Can you please concentrate on one thing at a time.

                              C 1 Reply Last reply 12 Nov 2021, 14:30
                              0
                              • J JonB
                                12 Nov 2021, 14:29

                                @CuriousPan said in How can I center QCheckBox in QTableView?:

                                @JonB, it always retruns QFlagsQt::AlignmentFlag() 1 which is Qt::DecorationRole, right?

                                That's what you wrote. See that 1? Can you please concentrate on one thing at a time.

                                C Offline
                                C Offline
                                CuriousPan
                                wrote on 12 Nov 2021, 14:30 last edited by
                                #20

                                @JonB, yep, I can. I'm really sorry for confusing you. No 1 is printed, it's just my mistake.

                                J 1 Reply Last reply 12 Nov 2021, 14:34
                                0
                                • C CuriousPan
                                  12 Nov 2021, 14:30

                                  @JonB, yep, I can. I'm really sorry for confusing you. No 1 is printed, it's just my mistake.

                                  J Offline
                                  J Offline
                                  JonB
                                  wrote on 12 Nov 2021, 14:34 last edited by
                                  #21

                                  @CuriousPan
                                  So that would be the value for left-align. Either you are not setting or returning the desired "center" flag on your item for the Qt::TextAlignmentRole --- you have to do that if you want it centered, that's what the code does --- or you are not looking at the right item/index.

                                  C 1 Reply Last reply 12 Nov 2021, 14:41
                                  0
                                  • J JonB
                                    12 Nov 2021, 14:34

                                    @CuriousPan
                                    So that would be the value for left-align. Either you are not setting or returning the desired "center" flag on your item for the Qt::TextAlignmentRole --- you have to do that if you want it centered, that's what the code does --- or you are not looking at the right item/index.

                                    C Offline
                                    C Offline
                                    CuriousPan
                                    wrote on 12 Nov 2021, 14:41 last edited by CuriousPan 11 Dec 2021, 14:42
                                    #22

                                    @JonB, I guess you're right, but, as I showed on this screenshot: fb7e083f-38ea-4de7-8c55-b8b77b24f946-image.png
                                    I'm using the correct role and column is defenitely correct (checked usingqDebug()).

                                    J 1 Reply Last reply 12 Nov 2021, 14:46
                                    0
                                    • C CuriousPan
                                      12 Nov 2021, 14:41

                                      @JonB, I guess you're right, but, as I showed on this screenshot: fb7e083f-38ea-4de7-8c55-b8b77b24f946-image.png
                                      I'm using the correct role and column is defenitely correct (checked usingqDebug()).

                                      J Offline
                                      J Offline
                                      JonB
                                      wrote on 12 Nov 2021, 14:46 last edited by JonB 11 Dec 2021, 14:46
                                      #23

                                      @CuriousPan

                                      • Print out index.column() in the delegate.
                                      • Print out RecurrentColumn.
                                      • Put a qDebug() just above return Qt::AlignCenter in your "screenshot" to make sure it's being hit.
                                      • Please don't paste code as screenshots, paste it as code. Show where you have that code and what is above the extract you show.
                                      C 1 Reply Last reply 12 Nov 2021, 15:01
                                      0
                                      • J JonB
                                        12 Nov 2021, 14:46

                                        @CuriousPan

                                        • Print out index.column() in the delegate.
                                        • Print out RecurrentColumn.
                                        • Put a qDebug() just above return Qt::AlignCenter in your "screenshot" to make sure it's being hit.
                                        • Please don't paste code as screenshots, paste it as code. Show where you have that code and what is above the extract you show.
                                        C Offline
                                        C Offline
                                        CuriousPan
                                        wrote on 12 Nov 2021, 15:01 last edited by CuriousPan 11 Dec 2021, 15:05
                                        #24

                                        @JonB

                                        • index.column() in the delegate has the proper number. 4 in my case as long as it is 4th (starting from 0) column in the table view.
                                        • What do you mean by printing RecurrentColumn?
                                        //checking other roles
                                        } else if (index.isValid() && role == Qt::TextAlignmentRole) { 
                                                 switch (index.column()) { 
                                                 case RecurrentColumn: 
                                                      qDebug() << "Hit"; 
                                                      return Qt::AlignCenter; 
                                                 case TotalColumn: 
                                                      return {Qt::AlignRight | Qt::AlignVCenter}; 
                                                 case PlnTotalColumn: 
                                                      return {Qt::AlignRight | Qt::AlignVCenter}; 
                                                 return Qt::AlignCenter; 
                                                 }
                                        }
                                        // "Hit" is getting printed.
                                        
                                        • Okay, will try to value your time and effort :)
                                        C 1 Reply Last reply 12 Nov 2021, 15:50
                                        0
                                        • C CuriousPan
                                          12 Nov 2021, 15:01

                                          @JonB

                                          • index.column() in the delegate has the proper number. 4 in my case as long as it is 4th (starting from 0) column in the table view.
                                          • What do you mean by printing RecurrentColumn?
                                          //checking other roles
                                          } else if (index.isValid() && role == Qt::TextAlignmentRole) { 
                                                   switch (index.column()) { 
                                                   case RecurrentColumn: 
                                                        qDebug() << "Hit"; 
                                                        return Qt::AlignCenter; 
                                                   case TotalColumn: 
                                                        return {Qt::AlignRight | Qt::AlignVCenter}; 
                                                   case PlnTotalColumn: 
                                                        return {Qt::AlignRight | Qt::AlignVCenter}; 
                                                   return Qt::AlignCenter; 
                                                   }
                                          }
                                          // "Hit" is getting printed.
                                          
                                          • Okay, will try to value your time and effort :)
                                          C Offline
                                          C Offline
                                          CuriousPan
                                          wrote on 12 Nov 2021, 15:50 last edited by CuriousPan 11 Dec 2021, 15:51
                                          #25

                                          @CuriousPan I have fixed the issue.
                                          I used pretty dirty, but working trick: set Qt::AlignedCenter right in the delegate:

                                          void CenteredCheckBoxDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
                                          {
                                              QStyleOptionViewItem opt = option;
                                              const QWidget *widget = option.widget;
                                              initStyleOption(&opt, index);
                                              QStyle *style = opt.widget ? opt.widget->style() : QApplication::style();
                                              style->drawPrimitive(QStyle::PE_PanelItemViewItem, &opt, painter, widget);
                                              if (opt.features & QStyleOptionViewItem::HasCheckIndicator) {
                                                  switch (opt.checkState) {
                                                  case Qt::Unchecked:
                                                      opt.state |= QStyle::State_Off;
                                                      break;
                                                  case Qt::PartiallyChecked:
                                                      opt.state |= QStyle::State_NoChange;
                                                      break;
                                                  case Qt::Checked:
                                                      opt.state |= QStyle::State_On;
                                                      break;
                                                  }
                                                  auto rect = style->subElementRect(QStyle::SE_ItemViewItemCheckIndicator, &opt, widget);
                                                  opt.rect = QStyle::alignedRect(opt.direction, Qt::AlignCenter/*index.data(Qt::TextAlignmentRole).value<Qt::Alignment>()*/, rect.size(), opt.rect);
                                                  opt.state = opt.state & ~QStyle::State_HasFocus;
                                                  style->drawPrimitive(QStyle::PE_IndicatorItemViewItemCheck, &opt, painter, widget);
                                              } else if (!opt.icon.isNull()) {
                                                  // draw the icon
                                                  QRect iconRect = style->subElementRect(QStyle::SE_ItemViewItemDecoration, &opt, widget);
                                                  iconRect = QStyle::alignedRect(opt.direction, Qt::AlignCenter/*index.data(Qt::TextAlignmentRole).value<Qt::Alignment>()*/, iconRect.size(), opt.rect);
                                                  QIcon::Mode mode = QIcon::Normal;
                                                  if (!(opt.state & QStyle::State_Enabled))
                                                      mode = QIcon::Disabled;
                                                  else if (opt.state & QStyle::State_Selected)
                                                      mode = QIcon::Selected;
                                                  QIcon::State state = opt.state & QStyle::State_Open ? QIcon::On : QIcon::Off;
                                                  opt.icon.paint(painter, iconRect, opt.decorationAlignment, mode, state);
                                              } else {
                                                  QStyledItemDelegate::paint(painter, option, index);
                                              }
                                          }
                                          
                                          bool CenteredCheckBoxDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
                                          {
                                              Q_ASSERT(event);
                                              Q_ASSERT(model);
                                              // make sure that the item is checkable
                                              Qt::ItemFlags flags = model->flags(index);
                                              if (!(flags & Qt::ItemIsUserCheckable) || !(option.state & QStyle::State_Enabled) || !(flags & Qt::ItemIsEnabled))
                                                  return false;
                                              // make sure that we have a check state
                                              QVariant value = index.data(Qt::CheckStateRole);
                                              if (!value.isValid())
                                                  return false;
                                              const QWidget *widget = option.widget;
                                              QStyle *style = option.widget ? widget->style() : QApplication::style();
                                              // make sure that we have the right event type
                                              if ((event->type() == QEvent::MouseButtonRelease) || (event->type() == QEvent::MouseButtonDblClick) || (event->type() == QEvent::MouseButtonPress)) {
                                                  QStyleOptionViewItem viewOpt(option);
                                                  initStyleOption(&viewOpt, index);
                                                  QRect checkRect = style->subElementRect(QStyle::SE_ItemViewItemCheckIndicator, &viewOpt, widget);
                                                  checkRect = QStyle::alignedRect(viewOpt.direction, Qt::AlignCenter/*index.data(Qt::TextAlignmentRole).value<Qt::Alignment>()*/, checkRect.size(), viewOpt.rect);
                                                  QMouseEvent *me = static_cast<QMouseEvent *>(event);
                                                  if (me->button() != Qt::LeftButton || !checkRect.contains(me->pos()))
                                                      return false;
                                                  if ((event->type() == QEvent::MouseButtonPress) || (event->type() == QEvent::MouseButtonDblClick))
                                                      return true;
                                              } else if (event->type() == QEvent::KeyPress) {
                                                  if (static_cast<QKeyEvent *>(event)->key() != Qt::Key_Space && static_cast<QKeyEvent *>(event)->key() != Qt::Key_Select)
                                                      return false;
                                              } else {
                                                  return false;
                                              }
                                              Qt::CheckState state = static_cast<Qt::CheckState>(value.toInt());
                                              if (flags & Qt::ItemIsUserTristate)
                                                  state = ((Qt::CheckState)((state + 1) % 3));
                                              else
                                                  state = (state == Qt::Checked) ? Qt::Unchecked : Qt::Checked;
                                              return model->setData(index, state, Qt::CheckStateRole);
                                          }
                                          
                                          

                                          Thanks everyone who took part in the discussion.

                                          1 Reply Last reply
                                          0

                                          15/25

                                          12 Nov 2021, 14:15

                                          • Login

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