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.5k 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 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 Offline
    JonBJ Offline
    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
                                        • mzimmersM Offline
                                          mzimmersM Offline
                                          mzimmers
                                          wrote on last edited by
                                          #21

                                          OK, I'm doing it wrong.

                                          My table view is in my worker. If I move it to my widget, how do I give it the model information in the setModel() call -- do I do something like pass the model as an argument to the widget constructor?

                                          I'll post some code in a bit, when it's more "post-worthy." In the meantime, I'm still a little unclear on the insertRows() function I need to write. Does this operate on my local copy of the data? So, the pseudocode would be something like:

                                          void Devices::MyInsertRow()
                                          {
                                              devices.insert(etc)
                                          }
                                          ...
                                          beginInsertRow(parent, rowCount(), rowCount());
                                          myInsertRow();
                                          endInsertRow();
                                          
                                          1 Reply Last reply
                                          0

                                          • Login

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