Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. General talk
  3. Brainstorm
  4. need ideas for list/table implementation
Forum Updated to NodeBB v4.3 + New Features

need ideas for list/table implementation

Scheduled Pinned Locked Moved Solved Brainstorm
57 Posts 5 Posters 18.1k Views 3 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.
  • mzimmersM Offline
    mzimmersM Offline
    mzimmers
    wrote on last edited by
    #1

    I need to add a list or table (I'm not sure which) to the UI of a program I'm developing. This is to display a (fairly short) list of connected devices. The information on each entry would be a few columns, such as name, type, most recent activity. The table would be updated a few times per second. Some color coding (based on most recent activity) and sorting would be nice additions.

    I did a little reading on Qt's model/view programming, and it seems rather elaborate for my needs, though maybe I have to go that route. Before I jump in, I'd be interested in hearing any other ideas on how best to implement this.

    Thanks...

    JonBJ kshegunovK 2 Replies Last reply
    0
    • mzimmersM mzimmers

      I need to add a list or table (I'm not sure which) to the UI of a program I'm developing. This is to display a (fairly short) list of connected devices. The information on each entry would be a few columns, such as name, type, most recent activity. The table would be updated a few times per second. Some color coding (based on most recent activity) and sorting would be nice additions.

      I did a little reading on Qt's model/view programming, and it seems rather elaborate for my needs, though maybe I have to go that route. Before I jump in, I'd be interested in hearing any other ideas on how best to implement this.

      Thanks...

      JonBJ Online
      JonBJ Online
      JonB
      wrote on last edited by JonB
      #2

      @mzimmers
      So http://doc.qt.io/qt-5/qtablewidget.html#details or a http://doc.qt.io/qt-5/qtableview.html would indeed be my first suggestion.

      1 Reply Last reply
      1
      • mzimmersM mzimmers

        I need to add a list or table (I'm not sure which) to the UI of a program I'm developing. This is to display a (fairly short) list of connected devices. The information on each entry would be a few columns, such as name, type, most recent activity. The table would be updated a few times per second. Some color coding (based on most recent activity) and sorting would be nice additions.

        I did a little reading on Qt's model/view programming, and it seems rather elaborate for my needs, though maybe I have to go that route. Before I jump in, I'd be interested in hearing any other ideas on how best to implement this.

        Thanks...

        kshegunovK Offline
        kshegunovK Offline
        kshegunov
        Moderators
        wrote on last edited by
        #3

        @mzimmers said in need ideas for list/table implementation:

        I did a little reading on Qt's model/view programming, and it seems rather elaborate for my needs, though maybe I have to go that route.

        That would be my go-to solution. You would need to implement only a couple of methods from QAbstractTableModel and use the standard view that goes with it.

        Read and abide by the Qt Code of Conduct

        1 Reply Last reply
        2
        • mzimmersM Offline
          mzimmersM Offline
          mzimmers
          wrote on last edited by
          #4

          OK, if I'm going to attempt this, I'll need a good example to follow. Is the frozencolumn example (found in Creator->Welcome->Examples) a good one to use as a model (so to speak)?

          Thanks...

          kshegunovK 1 Reply Last reply
          0
          • mzimmersM mzimmers

            OK, if I'm going to attempt this, I'll need a good example to follow. Is the frozencolumn example (found in Creator->Welcome->Examples) a good one to use as a model (so to speak)?

            Thanks...

            kshegunovK Offline
            kshegunovK Offline
            kshegunov
            Moderators
            wrote on last edited by kshegunov
            #5

            @mzimmers said in need ideas for list/table implementation:

            OK, if I'm going to attempt this, I'll need a good example to follow. Is the frozencolumn example (found in Creator->Welcome->Examples) a good one to use as a model (so to speak)?

            Yes it should do, although it seems a bit elaborate for what you describe. If you need to have simply a list also consider QAbstractListModel (e.g. puzzle example) which provides even more methods already overriden, so there's less to write. The model subclassing page should also be of use to check.

            Read and abide by the Qt Code of Conduct

            1 Reply Last reply
            2
            • mzimmersM Offline
              mzimmersM Offline
              mzimmers
              wrote on last edited by
              #6

              I'll need a table (2 dimensions of data). I'm working through an example I found in an old 4.8 tutorial...it's starting to make sense. I'm curious, though, about how this works with the traditional Qt worker/widget paradigm. Currently, my worker sends table data to the widget (via the signal mechanism). Obviously, my widget needs to update the table, but it can't do this directly because the data structure is contained in my table class. Do I manually create methods for the widget object to call, or is there something automatic that does this for me?

              kshegunovK 1 Reply Last reply
              0
              • mzimmersM mzimmers

                I'll need a table (2 dimensions of data). I'm working through an example I found in an old 4.8 tutorial...it's starting to make sense. I'm curious, though, about how this works with the traditional Qt worker/widget paradigm. Currently, my worker sends table data to the widget (via the signal mechanism). Obviously, my widget needs to update the table, but it can't do this directly because the data structure is contained in my table class. Do I manually create methods for the widget object to call, or is there something automatic that does this for me?

                kshegunovK Offline
                kshegunovK Offline
                kshegunov
                Moderators
                wrote on last edited by
                #7

                @mzimmers said in need ideas for list/table implementation:

                I'm curious, though, about how this works with the traditional Qt worker/widget paradigm.

                You lost me here. Could you rephrase? I don't get what you're asking.

                Read and abide by the Qt Code of Conduct

                1 Reply Last reply
                0
                • mzimmersM Offline
                  mzimmersM Offline
                  mzimmers
                  wrote on last edited by
                  #8

                  So, an application might typically have a worker object and a widget object. Now, we're introducing the table object (based on QAbstractTableModel). I'm accustomed to the worker receiving data from a remote device, and passing that along to the widget. Now, however, the widget doesn't directly process that data, but somehow needs to get it into the table. How is this best accomplished?

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

                    Hi,

                    In this case, your worker should work with your table model. When implemented properly, the model signals that it has new/modified data through begin/endInsertRows, dataChanged and their signal friends. All views that you set this model on will then update themselves.

                    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
                    1
                    • mzimmersM Offline
                      mzimmersM Offline
                      mzimmers
                      wrote on last edited by
                      #10

                      Hi SGaist -

                      Just to be clear, my table is read-only to the user. The only changes to the table will be initiated by the worker object (via a socket message from the target device). Does the worker directly signal the model object?

                      1 Reply Last reply
                      0
                      • SGaistS Offline
                        SGaistS Offline
                        SGaist
                        Lifetime Qt Champion
                        wrote on last edited by
                        #11

                        The fact that it's read-only is a detail. You can disable all edit triggers and even make the setData method of your model a "no-op" method.

                        So, yes, your worker can still work with your model directly.

                        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
                        0
                        • mzimmersM Offline
                          mzimmersM Offline
                          mzimmers
                          wrote on last edited by
                          #12

                          So, the examples I'm looking at are somewhat lightweight on the data. It isn't clear to me if/how the worker is supposed to store a copy of this data. I don't see where the call to insertRows() provides any actual data.

                          Each row in my table will consist of 3 columns, all strings. When I want to update a row, what do I call to do this? The first column will be like my primary key.

                          1 Reply Last reply
                          0
                          • SGaistS Offline
                            SGaistS Offline
                            SGaist
                            Lifetime Qt Champion
                            wrote on last edited by
                            #13

                            Are you using your model as wrapper on top of a custom data structure or as holder of said data ?

                            Your worker can feed the model, it doesn't need to store anything.

                            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
                            1
                            • mzimmersM Offline
                              mzimmersM Offline
                              mzimmers
                              wrote on last edited by mzimmers
                              #14

                              I don't know how to answer that; I'm new to this model/view stuff. But the intention is simply to pass information along from the worker to the UI. If i can bypass the need to store the information locally, so much the better. But I don't see how to do that.

                              I gather that I'm supposed to re-implement the insert rows function, but I don't see how to use that to actually inject data into the model.

                              Also, now that I've bypassed the widget, my table is showing up in a separate window. Do I correct this by passing a different parent object (like the Ui) to its constructor?

                              EDIT:

                              Oh, I think I get it a little better now. So, the class derived from the table model holds the data. The table object receives the data updates from the worker and stores them, then emits the dataChanged() signal. And the data() function then conveys the current data to the UI. That about right?

                              So, am I responsible for maintaining a row index for my records? (Since data uses an int to identify a row.) I could store my table data in a hash, with an int as the key, and a structure containing the strings as the value.

                              kshegunovK 1 Reply Last reply
                              1
                              • mzimmersM mzimmers

                                I don't know how to answer that; I'm new to this model/view stuff. But the intention is simply to pass information along from the worker to the UI. If i can bypass the need to store the information locally, so much the better. But I don't see how to do that.

                                I gather that I'm supposed to re-implement the insert rows function, but I don't see how to use that to actually inject data into the model.

                                Also, now that I've bypassed the widget, my table is showing up in a separate window. Do I correct this by passing a different parent object (like the Ui) to its constructor?

                                EDIT:

                                Oh, I think I get it a little better now. So, the class derived from the table model holds the data. The table object receives the data updates from the worker and stores them, then emits the dataChanged() signal. And the data() function then conveys the current data to the UI. That about right?

                                So, am I responsible for maintaining a row index for my records? (Since data uses an int to identify a row.) I could store my table data in a hash, with an int as the key, and a structure containing the strings as the value.

                                kshegunovK Offline
                                kshegunovK Offline
                                kshegunov
                                Moderators
                                wrote on last edited by
                                #15

                                @mzimmers said in need ideas for list/table implementation:

                                Oh, I think I get it a little better now. So, the class derived from the table model holds the data. The table object receives the data updates from the worker and stores them, then emits the dataChanged() signal. And the data() function then conveys the current data to the UI. That about right?

                                Yep, quite correct.

                                So, am I responsible for maintaining a row index for my records? (Since data uses an int to identify a row.)

                                Yep.

                                I could store my table data in a hash, with an int as the key, and a structure containing the strings as the value.

                                You could, but if your keys are sequential and uninterrupted a hash isn't exactly efficient, maybe a vector.

                                Read and abide by the Qt Code of Conduct

                                1 Reply Last reply
                                2
                                • mzimmersM Offline
                                  mzimmersM Offline
                                  mzimmers
                                  wrote on last edited by
                                  #16

                                  OK, I seem to have the basics working. Thanks for the help. Now..what do I have to do to get my table to not appear as a separate window?

                                  kshegunovK 1 Reply Last reply
                                  0
                                  • mzimmersM mzimmers

                                    OK, I seem to have the basics working. Thanks for the help. Now..what do I have to do to get my table to not appear as a separate window?

                                    kshegunovK Offline
                                    kshegunovK Offline
                                    kshegunov
                                    Moderators
                                    wrote on last edited by
                                    #17

                                    @mzimmers said in need ideas for list/table implementation:

                                    Now..what do I have to do to get my table to not appear as a separate window?

                                    Give it a parent widget and/or add it to an active layout (which will give it a parent widget).

                                    Read and abide by the Qt Code of Conduct

                                    1 Reply Last reply
                                    1
                                    • mzimmersM Offline
                                      mzimmersM Offline
                                      mzimmers
                                      wrote on last edited by
                                      #18

                                      The table belongs to the worker class, which doesn't currently have knowledge of the main widget class. Is there a clean way to do this?

                                      kshegunovK 1 Reply Last reply
                                      0
                                      • mzimmersM Offline
                                        mzimmersM Offline
                                        mzimmers
                                        wrote on last edited by
                                        #19

                                        My program isn't working quite correctly, and I'm wondering if it has to do with my non-use of insertRows().

                                        Do I correctly understand that in order to insert a new row into my table, I need to do something like this:

                                        // part of the subclass update function
                                        
                                        devices.insert({row, device}); // my local copy of the data
                                        beginInsertRow(parent, rowCount(), rowCount());
                                        insertRow(rowCount(), 1, parent);
                                        endInsertRow();
                                        
                                        1 Reply Last reply
                                        0
                                        • mzimmersM mzimmers

                                          The table belongs to the worker class, which doesn't currently have knowledge of the main widget class. Is there a clean way to do this?

                                          kshegunovK Offline
                                          kshegunovK Offline
                                          kshegunov
                                          Moderators
                                          wrote on last edited by
                                          #20

                                          @mzimmers said in need ideas for list/table implementation:

                                          The table belongs to the worker class

                                          If you mean the table view belongs the the worker object (which is presumably living in another thread), then this is wrong. You must keep the GUI classes in the GUI thread. If you mean the table model is in the worker thread then I think it is okay. What I meant is that you should parent the table view to a widget (and add it to a layout), so it's not a native widget and doesn't get its own window.

                                          My program isn't working quite correctly, and I'm wondering if it has to do with my non-use of insertRows().

                                          Perhaps, can you share the actual code?

                                          Do I correctly understand that in order to insert a new row into my table, I need to do something like this:

                                          insertRow calls the virtual insertRows, so it's a convenience method. You should implement insertRows for your model in which you'd call beginInsertRows before saving the data, and endInsertRows after that.

                                          Read and abide by the Qt Code of Conduct

                                          VRoninV 1 Reply Last reply
                                          1

                                          • Login

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