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. Save QTreeView/QStandardItemModel with DataStream to file?
Forum Updated to NodeBB v4.3 + New Features

Save QTreeView/QStandardItemModel with DataStream to file?

Scheduled Pinned Locked Moved Unsolved General and Desktop
40 Posts 5 Posters 7.0k 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.
  • JonBJ JonB

    @StudentScripter
    Like we said, it's your duty to write that code. So you know where e.g. the scene data ends so that the treeview data can begin.

    QDataStream just lets you write (binary) data to a file, i.e. it's concerned with how to write an integer or a string. I would suggest you consider saving your data as either XML or JSON. (They happen to save as text, but that's not really the issue here.) That will allow you more easily to place structure on what you save, so that e.g. you can recognise where the scene data ends and the treeview data begins.

    S Offline
    S Offline
    StudentScripter
    wrote on last edited by
    #12

    @JonB @SGaist

    Well, i understand that my request before sounded wacky, sorry for that. I tried inserting a string as marker to differentiate where which data begins but somehow it wasn't able to read that correctly, it didn't worked. Please give me a hint on how to differentiate between different data in qdatastream files, i want to stick to that format if possible.

    I have a main save methode from where i trigger the save scene first and the save qtreeview second:

    //Save Action in der Menuleiste, ermöglicht save in der GraphicsScene
    void MainWindow::saveActionTriggered()
    {
        QString filename = QFileDialog::getSaveFileName(this, tr("Save File"), 
                                                "", 
                                                tr("MyEditor (*.xle)"));
                                                
        if(!filename.isNull())
        {
            scene->saveScene(filename);
                                //Saven der ViewLayerList
                                ViewLayerList *LayerList = this->findChild<ViewLayerList *>("UNQViewLayerList");
                                LayerList->saveTreeView(filename);
        }                                       
    }
    
    
    //Load Action in der menuleiste, ermöglicht load in der GraphicsScene
    void MainWindow::loadActionTriggered()
    {
        QMessageBox::StandardButton reply;
            reply = QMessageBox::warning(this, "Caution", "Loading a file will clear your current project, \ndo you want to save it first?",
                                        QMessageBox::Yes|QMessageBox::No);                                 
            if (reply == QMessageBox::No) 
            {    
                QString filename = QFileDialog::getOpenFileName(this, tr("Open File"), 
                                                            "", 
                                                            tr("MyEditor (*.xle)")); 
                if(!filename.isNull())
                {   
                    scene->loadScene(filename);
                    
                                //Laden der ViewLayerList
                                ViewLayerList *LayerList = this->findChild<ViewLayerList *>("UNQViewLayerList");
                                LayerList->loadTreeView(filename);
                }
            }
    }
    

    And here ist the load/save methode from my qtreeview:

        
    void ViewLayerList::saveTreeView(QString &filename)
    {
        qDebug() << "SaveAction TreeView";
        QFile file(filename);
        
        if(!file.open(QIODevice::WriteOnly | QIODevice::Append))
            return;
        
        QDataStream dataStream(&file);
        int rowCount = model->rowCount();
        int columnCount = model->columnCount();
        dataStream << rowCount;
        dataStream << columnCount;
     
        for(int row = 0; row < rowCount; row++)
            for(int column = 0; column < columnCount; column++) {
            dataStream << model->item(row, column)->text();
     
     
            }
        
        file.close();
    }
    
    
    
    
    
    void ViewLayerList::loadTreeView(QString &filename)
    {
        qDebug() << "LoadAction TreeView";
        
        //File laden und öffnen
        QFile file(filename);
        if(!file.open(QIODevice::ReadOnly))
            return;
    
        QDataStream dataStream(&file);
        
        int rowCount, columnCount;
        dataStream >> rowCount;
        dataStream >> columnCount;
     
        for(int row = 0; row < rowCount; row++)
            for(int column = 0; column < columnCount; column++) {
            QString item;
            dataStream >> item;
            QStandardItem * w_item = new QStandardItem(item);
            model->setItem(row, column, w_item);
     
          }
       
    
          
       
    
        file.close();
    }
    
    
    
    
    

    The code does work on it's own but breaks when second data is saved from my graphicsscene, i guess cause it cannot differentiate.

    M 1 Reply Last reply
    0
    • S StudentScripter

      @JonB @SGaist

      Well, i understand that my request before sounded wacky, sorry for that. I tried inserting a string as marker to differentiate where which data begins but somehow it wasn't able to read that correctly, it didn't worked. Please give me a hint on how to differentiate between different data in qdatastream files, i want to stick to that format if possible.

      I have a main save methode from where i trigger the save scene first and the save qtreeview second:

      //Save Action in der Menuleiste, ermöglicht save in der GraphicsScene
      void MainWindow::saveActionTriggered()
      {
          QString filename = QFileDialog::getSaveFileName(this, tr("Save File"), 
                                                  "", 
                                                  tr("MyEditor (*.xle)"));
                                                  
          if(!filename.isNull())
          {
              scene->saveScene(filename);
                                  //Saven der ViewLayerList
                                  ViewLayerList *LayerList = this->findChild<ViewLayerList *>("UNQViewLayerList");
                                  LayerList->saveTreeView(filename);
          }                                       
      }
      
      
      //Load Action in der menuleiste, ermöglicht load in der GraphicsScene
      void MainWindow::loadActionTriggered()
      {
          QMessageBox::StandardButton reply;
              reply = QMessageBox::warning(this, "Caution", "Loading a file will clear your current project, \ndo you want to save it first?",
                                          QMessageBox::Yes|QMessageBox::No);                                 
              if (reply == QMessageBox::No) 
              {    
                  QString filename = QFileDialog::getOpenFileName(this, tr("Open File"), 
                                                              "", 
                                                              tr("MyEditor (*.xle)")); 
                  if(!filename.isNull())
                  {   
                      scene->loadScene(filename);
                      
                                  //Laden der ViewLayerList
                                  ViewLayerList *LayerList = this->findChild<ViewLayerList *>("UNQViewLayerList");
                                  LayerList->loadTreeView(filename);
                  }
              }
      }
      

      And here ist the load/save methode from my qtreeview:

          
      void ViewLayerList::saveTreeView(QString &filename)
      {
          qDebug() << "SaveAction TreeView";
          QFile file(filename);
          
          if(!file.open(QIODevice::WriteOnly | QIODevice::Append))
              return;
          
          QDataStream dataStream(&file);
          int rowCount = model->rowCount();
          int columnCount = model->columnCount();
          dataStream << rowCount;
          dataStream << columnCount;
       
          for(int row = 0; row < rowCount; row++)
              for(int column = 0; column < columnCount; column++) {
              dataStream << model->item(row, column)->text();
       
       
              }
          
          file.close();
      }
      
      
      
      
      
      void ViewLayerList::loadTreeView(QString &filename)
      {
          qDebug() << "LoadAction TreeView";
          
          //File laden und öffnen
          QFile file(filename);
          if(!file.open(QIODevice::ReadOnly))
              return;
      
          QDataStream dataStream(&file);
          
          int rowCount, columnCount;
          dataStream >> rowCount;
          dataStream >> columnCount;
       
          for(int row = 0; row < rowCount; row++)
              for(int column = 0; column < columnCount; column++) {
              QString item;
              dataStream >> item;
              QStandardItem * w_item = new QStandardItem(item);
              model->setItem(row, column, w_item);
       
            }
         
      
            
         
      
          file.close();
      }
      
      
      
      
      

      The code does work on it's own but breaks when second data is saved from my graphicsscene, i guess cause it cannot differentiate.

      M Offline
      M Offline
      mpergand
      wrote on last edited by mpergand
      #13

      @StudentScripter
      You save your tree as a flat array, then you loose any parent/child relationship.

      S 1 Reply Last reply
      0
      • M mpergand

        @StudentScripter
        You save your tree as a flat array, then you loose any parent/child relationship.

        S Offline
        S Offline
        StudentScripter
        wrote on last edited by
        #14

        @mpergand I know i've just done that for now to simpliefy the process as my main problem for now is getting both different data saved and loaded from within the same file.

        1 Reply Last reply
        0
        • JonBJ JonB

          @StudentScripter
          Like we said, it's your duty to write that code. So you know where e.g. the scene data ends so that the treeview data can begin.

          QDataStream just lets you write (binary) data to a file, i.e. it's concerned with how to write an integer or a string. I would suggest you consider saving your data as either XML or JSON. (They happen to save as text, but that's not really the issue here.) That will allow you more easily to place structure on what you save, so that e.g. you can recognise where the scene data ends and the treeview data begins.

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

          @StudentScripter

          @JonB said in Save QTreeView/QStandardItemModel with DataStream to file?:

          I would suggest you consider saving your data as either XML or JSON.

          That would encapsulate the tree structure. personally I don't like the idea of a binary data stream with some "markers" you have tried to put in it as "separators". You seem to be only saving string data from your model anyway. Perhaps a touch more initial work, easier to work with in the long run. Don't forget that if you get one thing wrong in binary data it's basically non-recoverable, XML/JSON is easily addressed in a text correction if required.

          S 1 Reply Last reply
          0
          • JonBJ JonB

            @StudentScripter

            @JonB said in Save QTreeView/QStandardItemModel with DataStream to file?:

            I would suggest you consider saving your data as either XML or JSON.

            That would encapsulate the tree structure. personally I don't like the idea of a binary data stream with some "markers" you have tried to put in it as "separators". You seem to be only saving string data from your model anyway. Perhaps a touch more initial work, easier to work with in the long run. Don't forget that if you get one thing wrong in binary data it's basically non-recoverable, XML/JSON is easily addressed in a text correction if required.

            S Offline
            S Offline
            StudentScripter
            wrote on last edited by
            #16

            @JonB Well but if i have doesn't xml files i can't load/save a projectfile. I want a binary file with all data in it so it functions as a project file. Also i need to save: EditRole, CheckStateRole, DecorationRole, a few UserRoles.

            M 1 Reply Last reply
            0
            • S StudentScripter

              @JonB Well but if i have doesn't xml files i can't load/save a projectfile. I want a binary file with all data in it so it functions as a project file. Also i need to save: EditRole, CheckStateRole, DecorationRole, a few UserRoles.

              M Offline
              M Offline
              mpergand
              wrote on last edited by
              #17

              @StudentScripter
              The principle to save/load a binary tree is always the same.
              Starting with the root item, for each item you need to:

              • save its data
              • save the nb of children
              • save the children items ( looks like we have some recursion here)

              For loading, you have to reverse the process:

              • create a item
              • set its data
              • get the nb of children
              • create the children ( recursion again)
              S 1 Reply Last reply
              1
              • M mpergand

                @StudentScripter
                The principle to save/load a binary tree is always the same.
                Starting with the root item, for each item you need to:

                • save its data
                • save the nb of children
                • save the children items ( looks like we have some recursion here)

                For loading, you have to reverse the process:

                • create a item
                • set its data
                • get the nb of children
                • create the children ( recursion again)
                S Offline
                S Offline
                StudentScripter
                wrote on last edited by StudentScripter
                #18

                @mpergand Yes i really appreciate your answer, but that wasn't actually the point of my question yet. I just wanted to know: how do differentiate data within a binary?

                How can i determine till where to read the data for my graphicsscene and where to start reading the data for my qtreeview?

                Or to formulate it different:
                Lets say I add an String named "MARKER" into my datastream and write this string to file. I want the datastream to search for this string and only read data after this string.

                M 1 Reply Last reply
                0
                • S StudentScripter

                  @mpergand Yes i really appreciate your answer, but that wasn't actually the point of my question yet. I just wanted to know: how do differentiate data within a binary?

                  How can i determine till where to read the data for my graphicsscene and where to start reading the data for my qtreeview?

                  Or to formulate it different:
                  Lets say I add an String named "MARKER" into my datastream and write this string to file. I want the datastream to search for this string and only read data after this string.

                  M Offline
                  M Offline
                  mpergand
                  wrote on last edited by
                  #19

                  @StudentScripter
                  Your are talking about two different objects, a graphic scene and a treeview and you seems to save their data to the same file, maybe saving them to two separate files may be a solution ?

                  S 1 Reply Last reply
                  0
                  • M mpergand

                    @StudentScripter
                    Your are talking about two different objects, a graphic scene and a treeview and you seems to save their data to the same file, maybe saving them to two separate files may be a solution ?

                    S Offline
                    S Offline
                    StudentScripter
                    wrote on last edited by
                    #20

                    @mpergand No it has to be the same file, because i want to able to load from one projectfile. I found that using a qint32 as marker works. First i wanted to use a string but somehow qdatastreams to be unable to find a qstring.

                    Here is what i've done: (This works)

                       
                    void ViewLayerList::saveTreeView(QString &filename)
                    {  
                    
                        qDebug() << "SaveAction TreeView";
                        QFile file(filename);
                        
                        if(!file.open(QIODevice::WriteOnly | QIODevice::Append))
                            return;
                        
                        QDataStream dataStream(&file);
                    
                    
                        dataStream <<  qint32(0xDEADBEEF);  // Write a separator or marker to indicate the end of the first data set
                    
                        
                        
                        
                        int rowCount = model->rowCount();
                    
                    
                        dataStream << rowCount;
                    
                     
                        for(int row = 0; row < rowCount; row++)
                        {
                            //dataStream << model->item(row, 1)->text();
                        
                     
                        }
                        
                    
                        file.close();
                    }
                    
                    
                    
                    
                    
                    void ViewLayerList::loadTreeView(QString &filename)
                    {
                        qDebug() << "LoadAction TreeView";
                        
                        // File laden und öffnen
                        QFile file(filename);
                        if (!file.open(QIODevice::ReadOnly))
                            return;
                    
                        QDataStream dataStream(&file);
                    
                    
                        
                        
                        while (!dataStream.atEnd()) {
                            qint32 test;
                            dataStream >> test;
                    
                              
                            if (test == qint32(0xDEADBEEF)) {
                                qDebug() << "Marker Found";
                                break;  // Exit the loop after finding the marker
                            }
                        }
                    
                        if (dataStream.atEnd()) {
                            qDebug() << "Error: Marker not found or end of file reached";
                            file.close();
                            return;
                        }
                    
                    
                            // 11. Data in dem File
                            int rowCount;
                            dataStream >> rowCount;
                    
                            for(int row = 0; row < rowCount; row++) {
                                QStandardItem *w_item = new QStandardItem();
                                model->setItem(row, 0, w_item);
                            }
                        
                    
                        file.close();
                    }
                    
                    
                    
                    
                    M 1 Reply Last reply
                    0
                    • S StudentScripter

                      @mpergand No it has to be the same file, because i want to able to load from one projectfile. I found that using a qint32 as marker works. First i wanted to use a string but somehow qdatastreams to be unable to find a qstring.

                      Here is what i've done: (This works)

                         
                      void ViewLayerList::saveTreeView(QString &filename)
                      {  
                      
                          qDebug() << "SaveAction TreeView";
                          QFile file(filename);
                          
                          if(!file.open(QIODevice::WriteOnly | QIODevice::Append))
                              return;
                          
                          QDataStream dataStream(&file);
                      
                      
                          dataStream <<  qint32(0xDEADBEEF);  // Write a separator or marker to indicate the end of the first data set
                      
                          
                          
                          
                          int rowCount = model->rowCount();
                      
                      
                          dataStream << rowCount;
                      
                       
                          for(int row = 0; row < rowCount; row++)
                          {
                              //dataStream << model->item(row, 1)->text();
                          
                       
                          }
                          
                      
                          file.close();
                      }
                      
                      
                      
                      
                      
                      void ViewLayerList::loadTreeView(QString &filename)
                      {
                          qDebug() << "LoadAction TreeView";
                          
                          // File laden und öffnen
                          QFile file(filename);
                          if (!file.open(QIODevice::ReadOnly))
                              return;
                      
                          QDataStream dataStream(&file);
                      
                      
                          
                          
                          while (!dataStream.atEnd()) {
                              qint32 test;
                              dataStream >> test;
                      
                                
                              if (test == qint32(0xDEADBEEF)) {
                                  qDebug() << "Marker Found";
                                  break;  // Exit the loop after finding the marker
                              }
                          }
                      
                          if (dataStream.atEnd()) {
                              qDebug() << "Error: Marker not found or end of file reached";
                              file.close();
                              return;
                          }
                      
                      
                              // 11. Data in dem File
                              int rowCount;
                              dataStream >> rowCount;
                      
                              for(int row = 0; row < rowCount; row++) {
                                  QStandardItem *w_item = new QStandardItem();
                                  model->setItem(row, 0, w_item);
                              }
                          
                      
                          file.close();
                      }
                      
                      
                      
                      
                      M Offline
                      M Offline
                      mpergand
                      wrote on last edited by mpergand
                      #21

                      @StudentScripter
                      You can use a QBuffer instead.
                      Save your data to two separate buffers, then save them to a file with at the start of the file, the offset of the second buffer where it is located in the file.

                      JonBJ 1 Reply Last reply
                      0
                      • M mpergand

                        @StudentScripter
                        You can use a QBuffer instead.
                        Save your data to two separate buffers, then save them to a file with at the start of the file, the offset of the second buffer where it is located in the file.

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

                        @mpergand
                        Just "yuck", and asking for trouble! I'm sure you know this.

                        @StudentScripter said in Save QTreeView/QStandardItemModel with DataStream to file?:

                        @JonB Well but if i have doesn't xml files i can't load/save a projectfile. I want a binary file with all data in it so it functions as a project file. Also i need to save: EditRole, CheckStateRole, DecorationRole, a few UserRoles

                        None of this is relevant. And I don't know how a "binary file" would function as a "project file". Anyway, best of luck.

                        M S 2 Replies Last reply
                        0
                        • JonBJ JonB

                          @mpergand
                          Just "yuck", and asking for trouble! I'm sure you know this.

                          @StudentScripter said in Save QTreeView/QStandardItemModel with DataStream to file?:

                          @JonB Well but if i have doesn't xml files i can't load/save a projectfile. I want a binary file with all data in it so it functions as a project file. Also i need to save: EditRole, CheckStateRole, DecorationRole, a few UserRoles

                          None of this is relevant. And I don't know how a "binary file" would function as a "project file". Anyway, best of luck.

                          M Offline
                          M Offline
                          mpergand
                          wrote on last edited by
                          #23

                          @JonB said in Save QTreeView/QStandardItemModel with DataStream to file?:

                          Just "yuck", and asking for trouble! I'm sure you know this.

                          One can think of some kind of zip file

                          JonBJ 1 Reply Last reply
                          0
                          • M mpergand

                            @JonB said in Save QTreeView/QStandardItemModel with DataStream to file?:

                            Just "yuck", and asking for trouble! I'm sure you know this.

                            One can think of some kind of zip file

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

                            @mpergand
                            One can, but I wouldn't recommend it for a newcomer. And it's just unnecessary here when the data format is the OP's own choice and XML/JSON sounds like it would be fine/more suitable. As well as happening to make the "include this data separately from that data" easier. But anyway I think the OP wants to do binary way, that's fine.

                            S 1 Reply Last reply
                            0
                            • JonBJ JonB

                              @mpergand
                              Just "yuck", and asking for trouble! I'm sure you know this.

                              @StudentScripter said in Save QTreeView/QStandardItemModel with DataStream to file?:

                              @JonB Well but if i have doesn't xml files i can't load/save a projectfile. I want a binary file with all data in it so it functions as a project file. Also i need to save: EditRole, CheckStateRole, DecorationRole, a few UserRoles

                              None of this is relevant. And I don't know how a "binary file" would function as a "project file". Anyway, best of luck.

                              S Offline
                              S Offline
                              StudentScripter
                              wrote on last edited by
                              #25

                              @JonB Correct me if im wrong but programms like photoshop, affinity photo ... all have one single projectfile like "Myfile.ps" that stores all data for the project. As far as i know that is a binary file and i want to build a system similar to that.

                              M JonBJ SGaistS 3 Replies Last reply
                              0
                              • S StudentScripter

                                @JonB Correct me if im wrong but programms like photoshop, affinity photo ... all have one single projectfile like "Myfile.ps" that stores all data for the project. As far as i know that is a binary file and i want to build a system similar to that.

                                M Offline
                                M Offline
                                mpergand
                                wrote on last edited by
                                #26

                                @StudentScripter
                                As an alternative, you can serialize your buffers as an array of QByteArray.

                                1 Reply Last reply
                                0
                                • S StudentScripter

                                  @JonB Correct me if im wrong but programms like photoshop, affinity photo ... all have one single projectfile like "Myfile.ps" that stores all data for the project. As far as i know that is a binary file and i want to build a system similar to that.

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

                                  @StudentScripter
                                  Each application may save its settings or whatever is whichever format it pleases. I would not know whether your particular apps store in one format or another. If it's your decision to save binary, that's fine.

                                  1 Reply Last reply
                                  0
                                  • S StudentScripter

                                    @JonB Correct me if im wrong but programms like photoshop, affinity photo ... all have one single projectfile like "Myfile.ps" that stores all data for the project. As far as i know that is a binary file and i want to build a system similar to that.

                                    SGaistS Offline
                                    SGaistS Offline
                                    SGaist
                                    Lifetime Qt Champion
                                    wrote on last edited by
                                    #28

                                    @StudentScripter from what you are writing, it seems that you want to be able to store stuff in a random order and then stream them back again from that random order.

                                    Currently there are several formats that are in fact compressed files containing several other files. Take the various office files format for example: one archive containing several files.

                                    That said, the simple way to do it is what I wrote: you always store and load your stuff in the same order.

                                    The more complex way is what my fellows proposed: one file per element. That way you can stream whatever you want independently.

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

                                    M 1 Reply Last reply
                                    0
                                    • SGaistS SGaist

                                      @StudentScripter from what you are writing, it seems that you want to be able to store stuff in a random order and then stream them back again from that random order.

                                      Currently there are several formats that are in fact compressed files containing several other files. Take the various office files format for example: one archive containing several files.

                                      That said, the simple way to do it is what I wrote: you always store and load your stuff in the same order.

                                      The more complex way is what my fellows proposed: one file per element. That way you can stream whatever you want independently.

                                      M Offline
                                      M Offline
                                      mpergand
                                      wrote on last edited by
                                      #29

                                      @SGaist said in Save QTreeView/QStandardItemModel with DataStream to file?:

                                      it seems that you want to be able to store stuff in a random order and then stream them back again from that random order.

                                      In this case one can use QMap to identify data by its name without any order.
                                      I talked about that HERE

                                      1 Reply Last reply
                                      0
                                      • JonBJ JonB

                                        @mpergand
                                        One can, but I wouldn't recommend it for a newcomer. And it's just unnecessary here when the data format is the OP's own choice and XML/JSON sounds like it would be fine/more suitable. As well as happening to make the "include this data separately from that data" easier. But anyway I think the OP wants to do binary way, that's fine.

                                        S Offline
                                        S Offline
                                        StudentScripter
                                        wrote on last edited by
                                        #30

                                        @JonB Well as i found out may your XML approach seems to be a better pratice as i found out that .docx for example is just a renamed .zip archive with xml files in it.
                                        In this case: do you know how to create such an archive containing xml files and how to read from that archive using Qt C++? Haven't found a topic on doing this in a zip like archive.

                                        M JonBJ 2 Replies Last reply
                                        0
                                        • S StudentScripter

                                          @JonB Well as i found out may your XML approach seems to be a better pratice as i found out that .docx for example is just a renamed .zip archive with xml files in it.
                                          In this case: do you know how to create such an archive containing xml files and how to read from that archive using Qt C++? Haven't found a topic on doing this in a zip like archive.

                                          M Offline
                                          M Offline
                                          mpergand
                                          wrote on last edited by
                                          #31

                                          @StudentScripter
                                          QuaZip
                                          KArchive
                                          https://forum.qt.io/topic/74306/how-to-manage-zip-file?_=1702397735451&lang=en-GB

                                          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