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. Question: write a simple browser of data.
Forum Updated to NodeBB v4.3 + New Features

Question: write a simple browser of data.

Scheduled Pinned Locked Moved General and Desktop
9 Posts 2 Posters 2.9k 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.
  • S Offline
    S Offline
    stefbon
    wrote on last edited by
    #1

    Hi,

    I'm developing notifyfs, a fs event monitor and entry cache. The entries do have an index: ordered on name.

    What I want to create is a simple filebrowser with above line to enter the directory, and below that the entries it finds in this directory in the cache. Functions to get the entries are known.

    So after entering the directory in the line above it loads the entries in the "list" under it.
    Howto do this?

    And is it able to export the view parameters back to notifyfs?? I mean the first and the last entry visible in the view?

    Thanks in advance,

    Stef Bon

    1 Reply Last reply
    0
    • S Offline
      S Offline
      stefbon
      wrote on last edited by
      #2

      To add info:

      in my console testapplication it's possible to list entries which are stored in a cache, which is accessible via shared memory. After the user enters a path, a starting name, it's a directory or not, and the maximum number to show, the function list_entries is called:

      @void list_entries(char *path, char *name, unsigned char isdir, int maxentries)
      {
      struct notifyfs_entry_struct *parent_entry;

      parent_entry=check_notifyfs_path(path);
      
      if (parent_entry) {
          struct notifyfs_entry_struct *entry, *firstentry;
          struct notifyfs_inode_struct *inode;
          struct notifyfs_attr_struct *attr;
          int count=0;
          char *data;
      
          /* find the best entry based upon name */
      
          inode=get_inode(parent_entry->inode);
          entry=find_entry_raw(parent_entry, inode, name, 0);
          firstentry=entry;
      
          while(entry) {
      
              inode=get_inode(entry->inode);
              attr=get_attr(inode->attr);
              data=get_data(entry->name);
      
              if (!attr) {
      
                  fprintf(stdout, "- %-8i %-8i %-8i %s\n", -1, -1, -1, data);
      
                  goto next;
      
              }
      
              if (isdir==1) {
      
                  if (! S_ISDIR(attr->cached_st.st_mode)) {
      
                      entry=get_next_entry(parent_entry, entry);
      
                      if ( ! entry ) {
      
                          /* no directory anymore: after directories the other entries */
      
                          isdir=0;
                          entry=firstentry;
      
                      }
      
                      continue;
      
                  }
      
              } else {
      
                  if ( S_ISDIR(attr->cached_st.st_mode)) {
      
                      entry=get_next_entry(parent_entry, entry);
                      continue;
      
                  }
      
              }
      
              /* print first char */
      
              if ( isdir==1) {
      
                  fprintf(stdout, "d");
      
              } else {
      
                  fprintf(stdout, "-");
      
              }
      
              /* attributes */
      
              fprintf(stdout, "%-8i %-8i %-8i", attr->cached_st.st_uid, attr->cached_st.st_gid, attr->cached_st.st_size);
      
              /* file name */
      
              fprintf(stdout, "%s",data);
      
              /* goto next line */
      
              fprintf(stdout, "\n");
      
              next:
      
              count++;
      
              if (count>maxentries) break;
      
              entry=get_next_entry(parent_entry, entry);
      
          }
      
          if (count==0) {
      
              fprintf(stdout, "No entries found.\n");
      
          } else if (count==1) {
      
              fprintf(stdout, "One entry found.\n");
      
          } else {
      
              fprintf(stdout, "%i entries found.\n", count);
      
          }
      
      } else {
      
          fprintf(stdout, "Path %s not found.\n", path);
      
      }
      

      }@

      Note the entries point to a attr struct via an array index. This is required since shared memory is used. The pointers used by the server (notifyfs) are not valid for the clients, and then some conversion has to be used. This gives too much problems in my case.

      Now howto write a qt app which does the same?

      Note that the data is ordered to name, so it would be good to use that property.
      I know I have to use a model and a view.

      Thanks in advance.

      Stef Bon

      1 Reply Last reply
      0
      • K Offline
        K Offline
        KA51O
        wrote on last edited by
        #3

        Do you mean something like "QFileSystemModel":http://qt-project.org/doc/qt-4.8/qfilesystemmodel.html ? Have a look at "this article":http://doc.qt.digia.com/4.7-snapshot/model-view-programming.html#convenience-classes about Model/View. Especially the chapter "Using views with an existing model" in the section "Convenience Classes".

        1 Reply Last reply
        0
        • S Offline
          S Offline
          stefbon
          wrote on last edited by
          #4

          No, I don't want to use the built in QFileSystemModel. This uses the local filesystem directly, and I want it to use the cache povided by notifyfs, shared via shared memory.

          And I know there are different models and views, but can someone give me a clue howto begin. I'm new to qt. 15 years ago I programmed "gui's" in Clipper, using a browse type and codeblocks to get the entries.

          I have to use something like a QlistBox widget, and assign a QListView to it.

          And then?

          Stef

          1 Reply Last reply
          0
          • K Offline
            K Offline
            KA51O
            wrote on last edited by
            #5

            Ah ok. Then you need to implement your own Model for the ListView. Derive it from a suitable abstract model (see list of classes that inherit "QAbstractItemModel":http://doc.qt.digia.com/4.7-snapshot/qabstractitemmodel.html). For more informations just read the "article on Model/View programming in Qt":http://doc.qt.digia.com/4.7-snapshot/model-view-programming.html#model-classes, it pretty much contains all you need.

            1 Reply Last reply
            0
            • S Offline
              S Offline
              stefbon
              wrote on last edited by
              #6

              Thanks for the hint.

              I've found the page about model/view, it contains a lot of information. Isn't there a simple example to show a list (ui design, connect widget with model, assign right data connections/functions with the underlying data)?

              Stef

              1 Reply Last reply
              0
              • K Offline
                K Offline
                KA51O
                wrote on last edited by
                #7

                Sure there are official examples. They are listed at the bottom of "QAbstractItemModels sublassing section":http://doc.qt.digia.com/4.7-snapshot/qabstractitemmodel.html#subclassing.

                Try these:

                • "simple tree model example":http://doc.qt.digia.com/4.7-snapshot/itemviews-simpletreemodel.html
                • "simple dom model example":http://doc.qt.digia.com/4.7-snapshot/itemviews-simpledommodel.html
                • "editable tree model example":http://doc.qt.digia.com/4.7-snapshot/itemviews-editabletreemodel.html
                1 Reply Last reply
                0
                • S Offline
                  S Offline
                  stefbon
                  wrote on last edited by
                  #8

                  Hi,

                  I've also found:

                  http://doc.qt.digia.com/4.7-snapshot/itemviews-fetchmore.html

                  This is really close to what I'm trying to create. It's using QAbstractListModel

                  Stef

                  1 Reply Last reply
                  0
                  • S Offline
                    S Offline
                    stefbon
                    wrote on last edited by
                    #9

                    Hi,

                    I'm looking howto implement it, the function

                    QVariant FileListModel::data(const QModelIndex &index, int role) const

                    should return the data for a certain indexvalue.

                    (this is by the way very confusing, where in the documentation is written index, the indexvalue is meant; the index is the --whole-- list of references of entries, not just an individual value/entry)

                    Now, the entries in my datamodel are like a linked list:
                    the first entry is:
                    entry=get_next_entry(parent_entry, NULL);

                    and every next :
                    entry=get_next_entry(parent_entry, entry);

                    Is it possible to use the previous value (row) of the index (which points to the previous entry)?

                    And futher the implementation of shared memory in qt is using the "old" interface: using keys. In my app the newer calls shm_open and shm_unlink are used, which use a filename in stead of a key. Is the new interface also available in qt?

                    Stef

                    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