Qt Forum

    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Unsolved

    Qt Academy Launch in California!

    Solved Insert fill circle into cell of QTableWidget

    General and Desktop
    5
    88
    20622
    Loading More Posts
    • 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.
    • J
      juaniyoalm last edited by

      Hi,

      Is posible insert circle into cell of QTableWidget? I need the size of the circle can be changed dynamically.

      1 Reply Last reply Reply Quote 0
      • SGaist
        SGaist Lifetime Qt Champion last edited by

        Hi,

        Use a custom QStyledItemDelegate and do the drawing yourself in there.

        Interested in AI ? www.idiap.ch
        Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

        1 Reply Last reply Reply Quote 5
        • J
          juaniyoalm last edited by juaniyoalm

          @SGaist Thank you for your answer.

          Sorry but I'm starting to use QT, could you give me an example? How would you insert it in the table?

          1 Reply Last reply Reply Quote 0
          • SGaist
            SGaist Lifetime Qt Champion last edited by

            See the Star Item Delegate Example.

            Interested in AI ? www.idiap.ch
            Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

            1 Reply Last reply Reply Quote 5
            • J
              juaniyoalm last edited by

              There are too many classes to just paint a circle in a cell. There is no other way?

              mrjj 1 Reply Last reply Reply Quote 0
              • mrjj
                mrjj Lifetime Qt Champion @juaniyoalm last edited by mrjj

                @juaniyoalm
                Well you can also add the circle as an icon to the cell.
                If you add blank text, the effect is similar.

                alt text

                However, how big do u need the circle to be ?
                It cannot be bigger than the cell height in any case.

                Update: this was just to answer if there was alternatives.
                However, a delegate is far better for it.

                1 Reply Last reply Reply Quote 0
                • SGaist
                  SGaist Lifetime Qt Champion last edited by

                  You need one class: the delegate.

                  In this example they have two if you take the custom editor that you likely don't need.

                  Interested in AI ? www.idiap.ch
                  Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                  1 Reply Last reply Reply Quote 2
                  • mrjj
                    mrjj Lifetime Qt Champion last edited by mrjj

                    Hi
                    Adding to SGaist . Its not as bad as it looks.
                    For a paint circle only delegate, you need very little code.

                    #include <QStyledItemDelegate>
                    #include <QPainter>
                    
                    class CircleDelegate: public QStyledItemDelegate {
                     protected:
                      void paint(QPainter* painter, const QStyleOptionViewItem& opt, const QModelIndex& index) const {
                    
                        // set brush to green if selected else blue ( not needed just for fun)
                        if (opt.state & QStyle::State_Selected) {
                          painter->setBrush(Qt::green);
                        } else {
                          painter->setBrush(Qt::blue);
                        }
                    
                        // paint a circle
                        int CircleSize=10;
                        painter->drawEllipse(opt.rect.center(), CircleSize, CircleSize);
                      }
                    };
                    

                    and you set it to the table by
                    ui->tableWidget->setItemDelegateForColumn(1, new CircleDelegate());
                    the 1 is the col where u want it

                    alt text

                    You will need to read over
                    http://doc.qt.io/qt-5/model-view-programming.html
                    mostly section Item roles
                    as to make circle dynamic in size, you can use
                    a Qt::UserRole and setData.
                    so the size comes from the model.

                    1 Reply Last reply Reply Quote 5
                    • V
                      VRonin last edited by

                      Just a couple of small addition to @mrjj 's code:

                      • you'll probably also need to reimplement sizeHint() to return a size appropriate to contain the circle.
                      • blindly modifying the painter argument is risky. You should call painter->save(); before setting the brush and painter->restore(); after you finished the painting

                      "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                      ~Napoleon Bonaparte

                      On a crusade to banish setIndexWidget() from the holy land of Qt

                      1 Reply Last reply Reply Quote 2
                      • J
                        juaniyoalm last edited by

                        Thank you, the solution is good for me!!! but I would like that the background of cells is fill too. This colour have to change too.
                        I thought about inserting a rectangle but I would need the circle to be located on top...

                        mrjj 1 Reply Last reply Reply Quote 0
                        • mrjj
                          mrjj Lifetime Qt Champion @juaniyoalm last edited by

                          @juaniyoalm
                          Hi
                          Just use other paint methods like
                          painter->drawRect(opt.rect);

                          J 1 Reply Last reply Reply Quote 1
                          • J
                            juaniyoalm @mrjj last edited by

                            @mrjj Thank you so much!!

                            Okay, I have that solved.

                            Another question is that the size of each circle depends on a value that my mushroom class has. In my class I created a paint method but I do not know how to link that method with the delegate or what is the way to write the method.

                            mrjj 1 Reply Last reply Reply Quote 0
                            • mrjj
                              mrjj Lifetime Qt Champion @juaniyoalm last edited by

                              @juaniyoalm
                              Hi, is the value in the model ?
                              The delegate can use values from model.
                              so the color and size of circle could come from model.

                              J 1 Reply Last reply Reply Quote 1
                              • J
                                juaniyoalm @mrjj last edited by

                                @mrjj

                                No, that value is in a c++class. I have to create a custom model... It's ok?? Or I can use a default model??

                                mrjj 1 Reply Last reply Reply Quote 0
                                • mrjj
                                  mrjj Lifetime Qt Champion @juaniyoalm last edited by

                                  @juaniyoalm
                                  You can use http://doc.qt.io/qt-5/qstandarditemmodel.html
                                  if it is. dont have to be custom.
                                  I though you already had a model ?
                                  Also is this with a QTableWidget ?
                                  (it uses a model already )

                                  J 1 Reply Last reply Reply Quote 1
                                  • J
                                    juaniyoalm @mrjj last edited by

                                    @mrjj

                                    No, I use QTableView.

                                    I used a model to try but I don't know how to implement it

                                    mrjj 1 Reply Last reply Reply Quote 0
                                    • mrjj
                                      mrjj Lifetime Qt Champion @juaniyoalm last edited by

                                      @juaniyoalm
                                      Super. With view its much easier.
                                      so you have to construct a model with the data
                                      that comes from the class.
                                      Did you make a qstandarditemmodel before ?

                                      J 1 Reply Last reply Reply Quote 1
                                      • J
                                        juaniyoalm @mrjj last edited by

                                        @mrjj
                                        Yes, I did but without data class

                                        1 Reply Last reply Reply Quote 0
                                        • J
                                          juaniyoalm last edited by

                                          @mrjj
                                          Do you show me how to make??

                                          mrjj 1 Reply Last reply Reply Quote 0
                                          • mrjj
                                            mrjj Lifetime Qt Champion @juaniyoalm last edited by

                                            @juaniyoalm
                                            Hi
                                            Please read about userRoles and setData

                                            http://doc.qt.io/qt-5/model-view-programming.html
                                            section Item roles

                                            you can simply put the color / size in user role, or you can have
                                            it directly as an item in your model.
                                            Both ways are fine.
                                            Then delegate read the user role and use the data.

                                            1 Reply Last reply Reply Quote 4
                                            • First post
                                              Last post