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. How to create some Timers at run time and handle them?
QtWS25 Last Chance

How to create some Timers at run time and handle them?

Scheduled Pinned Locked Moved Solved General and Desktop
qtimer
19 Posts 6 Posters 3.5k Views
  • 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 Offline
    J Offline
    Jamshid
    wrote on 28 Nov 2019, 12:54 last edited by Jamshid
    #1

    Hi,
    In my application I want to create some timers at run time and handle their events separately and also reset them when needed.
    I tried but couldn't find a way to do this.
    when I use startTimer() function to creates some timers, I can't find how to reset specific timer!
    when use QTimer in the event handler slot can't determine which timer time outed!
    Thank you in advance.

    A 1 Reply Last reply 28 Nov 2019, 13:14
    0
    • J Jamshid
      29 Nov 2019, 11:05

      @J-Hilk I test this code, It only passes the last timer ID.

      if (!List.contains(str))
      {
      // Start timer
      timer = new QTimer(this);
      timer->setInterval(200);
      timer->start();
      connect(timer, &QTimer::timeout, this, [=]()->void{integrityTimersEvent(timer->timerId());});
      
      //
      timersList.append(timer);
      timersIDList.append(timer->timerId());
      }
      

      void FrameProcessor::integrityTimersEvent(int timerID)
      {
          qDebug() << "integrityTimersEvent => Timer ID:" << timerID;
      }
      

      Am I doing it right way?

      J Offline
      J Offline
      J.Hilk
      Moderators
      wrote on 29 Nov 2019, 11:16 last edited by
      #17

      @Jamshid
      actually this

      timer = new QTimer(this);
      timer->setInterval(200);
      timer->start();
      connect(timer, &QTimer::timeout, this, [=]()->void{integrityTimersEvent(timer->timerId());});
      

      is referencing the member variable

      try the following:

      QTimer *t = new QTimer(this);
      t->setInterval(200);
      t->start();
      connect(t, &QTimer::timeout, this, [=]()->void{integrityTimersEvent(t->timerId());});
      timer = t;
      

      Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


      Q: What's that?
      A: It's blue light.
      Q: What does it do?
      A: It turns blue.

      J 1 Reply Last reply 29 Nov 2019, 12:01
      6
      • M Offline
        M Offline
        mrjj
        Lifetime Qt Champion
        wrote on 28 Nov 2019, 13:01 last edited by mrjj
        #2

        Hi
        What about using lambdas and capture the timer?
        Then you don't need to keep track of anything.

        QObject::connect(timer, &QTimer::timeout, [timer](){
        
            timer->stop();
        
        });
        
        QObject::connect(timerOther, &QTimer::timeout, [timerOther](){
        
            timerOther->stop();
        
        });
        
        
        
        J 1 Reply Last reply 28 Nov 2019, 13:45
        1
        • J Jamshid
          28 Nov 2019, 12:54

          Hi,
          In my application I want to create some timers at run time and handle their events separately and also reset them when needed.
          I tried but couldn't find a way to do this.
          when I use startTimer() function to creates some timers, I can't find how to reset specific timer!
          when use QTimer in the event handler slot can't determine which timer time outed!
          Thank you in advance.

          A Offline
          A Offline
          artwaw
          wrote on 28 Nov 2019, 13:14 last edited by
          #3

          @Jamshid Apart form QTimer (you can use it as a member variable, as you know) QObject - and every class derived from - has built in one. How to use:
          When you run startTimer() method returns an int value that is the id of given timer. If you override timerEvent() method you'll see that a parameter is of QTimerEvent type. In that event you have a method called timerID which in turn is the ID of the timer that expired.
          So, start as many timers as you need, store the IDs, then in timerEvent() simply check against the table to find out which one called the event.

          Other solution is have a farm of QTimer variables and connect their timeout() signals to specific slots.

          Hope this helps.

          For more information please re-read.

          Kind Regards,
          Artur

          J 1 Reply Last reply 28 Nov 2019, 13:22
          1
          • A artwaw
            28 Nov 2019, 13:14

            @Jamshid Apart form QTimer (you can use it as a member variable, as you know) QObject - and every class derived from - has built in one. How to use:
            When you run startTimer() method returns an int value that is the id of given timer. If you override timerEvent() method you'll see that a parameter is of QTimerEvent type. In that event you have a method called timerID which in turn is the ID of the timer that expired.
            So, start as many timers as you need, store the IDs, then in timerEvent() simply check against the table to find out which one called the event.

            Other solution is have a farm of QTimer variables and connect their timeout() signals to specific slots.

            Hope this helps.

            J Offline
            J Offline
            Jamshid
            wrote on 28 Nov 2019, 13:22 last edited by
            #4

            @artwaw thanks,
            startTimer() does not have reset function and when I create some timers with this method can't have access to them later for restarting. They just provide their ID and I did timerEvent() override.
            In my application It's not determined how many timers needed, maybe 2 or maybe 100.
            So using QTimer with specific slots won't work.

            A 1 Reply Last reply 28 Nov 2019, 13:30
            0
            • J Jamshid
              28 Nov 2019, 13:22

              @artwaw thanks,
              startTimer() does not have reset function and when I create some timers with this method can't have access to them later for restarting. They just provide their ID and I did timerEvent() override.
              In my application It's not determined how many timers needed, maybe 2 or maybe 100.
              So using QTimer with specific slots won't work.

              A Offline
              A Offline
              artwaw
              wrote on 28 Nov 2019, 13:30 last edited by artwaw
              #5

              @Jamshid Unless someone more experienced have other way I'd go somewhere along that way:

              • derive from QTimer and include just one field: id, lets assume it is qint32 or something and name teh class here QTimer2;
              • create QHash<int,QTimer2*>

              And store the pointers and position that is equal to field id in QTimer2. This way you'll be able to examine which instance called and connect signals/slots.

              Mind you, I don't find this solution very elegant. This is only rough idea and there might be better one.

              For more information please re-read.

              Kind Regards,
              Artur

              J 1 Reply Last reply 28 Nov 2019, 14:01
              0
              • M mrjj
                28 Nov 2019, 13:01

                Hi
                What about using lambdas and capture the timer?
                Then you don't need to keep track of anything.

                QObject::connect(timer, &QTimer::timeout, [timer](){
                
                    timer->stop();
                
                });
                
                QObject::connect(timerOther, &QTimer::timeout, [timerOther](){
                
                    timerOther->stop();
                
                });
                
                
                
                J Offline
                J Offline
                Jamshid
                wrote on 28 Nov 2019, 13:45 last edited by Jamshid
                #6

                @mrjj I don't know how many timers should I need in program, they are created with respect to input data.

                1 Reply Last reply
                0
                • Christian EhrlicherC Offline
                  Christian EhrlicherC Offline
                  Christian Ehrlicher
                  Lifetime Qt Champion
                  wrote on 28 Nov 2019, 13:48 last edited by
                  #7

                  @Jamshid said in How to create some Timers at run time and handle them?:

                  So using QTimer with specific slots won't work.

                  There is always QObject::sender() where you can see where the signal is coming from. Apart from this why not storing all created timers in a QVector/QHash/whatever so you can access them later on?

                  Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                  Visit the Qt Academy at https://academy.qt.io/catalog

                  J 1 Reply Last reply 28 Nov 2019, 14:12
                  2
                  • A artwaw
                    28 Nov 2019, 13:30

                    @Jamshid Unless someone more experienced have other way I'd go somewhere along that way:

                    • derive from QTimer and include just one field: id, lets assume it is qint32 or something and name teh class here QTimer2;
                    • create QHash<int,QTimer2*>

                    And store the pointers and position that is equal to field id in QTimer2. This way you'll be able to examine which instance called and connect signals/slots.

                    Mind you, I don't find this solution very elegant. This is only rough idea and there might be better one.

                    J Offline
                    J Offline
                    Jamshid
                    wrote on 28 Nov 2019, 14:01 last edited by
                    #8

                    @artwaw I'm new to Qt but I'll try it. Thanks.

                    1 Reply Last reply
                    1
                    • Christian EhrlicherC Christian Ehrlicher
                      28 Nov 2019, 13:48

                      @Jamshid said in How to create some Timers at run time and handle them?:

                      So using QTimer with specific slots won't work.

                      There is always QObject::sender() where you can see where the signal is coming from. Apart from this why not storing all created timers in a QVector/QHash/whatever so you can access them later on?

                      J Offline
                      J Offline
                      Jamshid
                      wrote on 28 Nov 2019, 14:12 last edited by
                      #9

                      @Christian-Ehrlicher I'm trying sender(), I can store created timers in a vector and connect all created timers' timeout signal to one slot, my problem is this how to determine in that slot which timer timed out. I think QObject::sender() will help. let me try it.

                      J JonBJ 2 Replies Last reply 28 Nov 2019, 14:16
                      0
                      • J Jamshid
                        28 Nov 2019, 14:12

                        @Christian-Ehrlicher I'm trying sender(), I can store created timers in a vector and connect all created timers' timeout signal to one slot, my problem is this how to determine in that slot which timer timed out. I think QObject::sender() will help. let me try it.

                        J Offline
                        J Offline
                        J.Hilk
                        Moderators
                        wrote on 28 Nov 2019, 14:16 last edited by J.Hilk
                        #10

                        @Jamshid I would actually suggest to use a lambda over the sender() approach

                        for(int i(0); i <10; i++){
                                QTimer *t = new QTimer(this);
                                connect(t, &QTimer::timeout, this, [=]()->void{timerSlot(i);});
                                m_timers.append(t);
                           }
                        
                        ...
                        public slots:
                            void timerSlot(int timeId);
                        

                        Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


                        Q: What's that?
                        A: It's blue light.
                        Q: What does it do?
                        A: It turns blue.

                        J 1 Reply Last reply 29 Nov 2019, 11:05
                        0
                        • J Jamshid
                          28 Nov 2019, 14:12

                          @Christian-Ehrlicher I'm trying sender(), I can store created timers in a vector and connect all created timers' timeout signal to one slot, my problem is this how to determine in that slot which timer timed out. I think QObject::sender() will help. let me try it.

                          JonBJ Offline
                          JonBJ Offline
                          JonB
                          wrote on 28 Nov 2019, 16:11 last edited by
                          #11

                          @Jamshid
                          For a slot function sender should give you which timer. My understanding (untested!) is that if you use a lambda you do not get a sender. But then @J-Hilk is, I think, offering a lambda which passes the timerId as a parameter for you. Both sound like they would work.

                          J 1 Reply Last reply 29 Nov 2019, 06:01
                          0
                          • JonBJ JonB
                            28 Nov 2019, 16:11

                            @Jamshid
                            For a slot function sender should give you which timer. My understanding (untested!) is that if you use a lambda you do not get a sender. But then @J-Hilk is, I think, offering a lambda which passes the timerId as a parameter for you. Both sound like they would work.

                            J Offline
                            J Offline
                            J.Hilk
                            Moderators
                            wrote on 29 Nov 2019, 06:01 last edited by
                            #12

                            @JonB well, yes, we originally talked about identifying the timer that called the slot, what better way than an int ? đŸ˜‰

                            Well, If one is more interested in the Timer Object....

                            for(int i(0); i <10; i++){
                                    QTimer *t = new QTimer(this);
                                    connect(t, &QTimer::timeout, this, [=]()->void{timerSlot(t);});
                                    m_timers.append(t);
                               }
                            
                            ...
                            public slots:
                                void timerSlot(QTimer *timer);
                            

                            Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


                            Q: What's that?
                            A: It's blue light.
                            Q: What does it do?
                            A: It turns blue.

                            1 Reply Last reply
                            4
                            • J J.Hilk
                              28 Nov 2019, 14:16

                              @Jamshid I would actually suggest to use a lambda over the sender() approach

                              for(int i(0); i <10; i++){
                                      QTimer *t = new QTimer(this);
                                      connect(t, &QTimer::timeout, this, [=]()->void{timerSlot(i);});
                                      m_timers.append(t);
                                 }
                              
                              ...
                              public slots:
                                  void timerSlot(int timeId);
                              
                              J Offline
                              J Offline
                              Jamshid
                              wrote on 29 Nov 2019, 11:05 last edited by Jamshid
                              #13

                              @J-Hilk I test this code, It only passes the last timer ID.

                              if (!List.contains(str))
                              {
                              // Start timer
                              timer = new QTimer(this);
                              timer->setInterval(200);
                              timer->start();
                              connect(timer, &QTimer::timeout, this, [=]()->void{integrityTimersEvent(timer->timerId());});
                              
                              //
                              timersList.append(timer);
                              timersIDList.append(timer->timerId());
                              }
                              

                              void FrameProcessor::integrityTimersEvent(int timerID)
                              {
                                  qDebug() << "integrityTimersEvent => Timer ID:" << timerID;
                              }
                              

                              Am I doing it right way?

                              JonBJ J Christian EhrlicherC 4 Replies Last reply 29 Nov 2019, 11:08
                              0
                              • J Jamshid
                                29 Nov 2019, 11:05

                                @J-Hilk I test this code, It only passes the last timer ID.

                                if (!List.contains(str))
                                {
                                // Start timer
                                timer = new QTimer(this);
                                timer->setInterval(200);
                                timer->start();
                                connect(timer, &QTimer::timeout, this, [=]()->void{integrityTimersEvent(timer->timerId());});
                                
                                //
                                timersList.append(timer);
                                timersIDList.append(timer->timerId());
                                }
                                

                                void FrameProcessor::integrityTimersEvent(int timerID)
                                {
                                    qDebug() << "integrityTimersEvent => Timer ID:" << timerID;
                                }
                                

                                Am I doing it right way?

                                JonBJ Offline
                                JonBJ Offline
                                JonB
                                wrote on 29 Nov 2019, 11:08 last edited by JonB
                                #14

                                @Jamshid , @J-Hilk

                                It only passes the last timer ID.

                                This is just the kind of behaviour I found when playing with lambdas (which is why I don't much like them, let's not go there)! To get it right, I believe, you must pass the timer->timerID(), or the whole timer, as a parameter to the lambda. Not sure of the C++ (I'm Python) syntax, but I think it must go inside the () you have...

                                EDIT Oh well, since @J-Hilk shows it works below, I must be mistaken, sorry.... I had this kind of problem with Python lambdas, they must not directly access a changing value in the caller in their body code, instead the caller must pass that as a parameter....

                                1 Reply Last reply
                                0
                                • J Jamshid
                                  29 Nov 2019, 11:05

                                  @J-Hilk I test this code, It only passes the last timer ID.

                                  if (!List.contains(str))
                                  {
                                  // Start timer
                                  timer = new QTimer(this);
                                  timer->setInterval(200);
                                  timer->start();
                                  connect(timer, &QTimer::timeout, this, [=]()->void{integrityTimersEvent(timer->timerId());});
                                  
                                  //
                                  timersList.append(timer);
                                  timersIDList.append(timer->timerId());
                                  }
                                  

                                  void FrameProcessor::integrityTimersEvent(int timerID)
                                  {
                                      qDebug() << "integrityTimersEvent => Timer ID:" << timerID;
                                  }
                                  

                                  Am I doing it right way?

                                  J Offline
                                  J Offline
                                  J.Hilk
                                  Moderators
                                  wrote on 29 Nov 2019, 11:12 last edited by J.Hilk
                                  #15

                                  @Jamshid
                                  should work fine,

                                  take a look at the example I made:

                                  int MainWindow::count = 0;
                                  MainWindow::MainWindow(QWidget *parent) :
                                      QMainWindow(parent),
                                      ui(new Ui::MainWindow)
                                  {
                                      for(int i(0); i <10; i++){
                                          QTimer *t = new QTimer(this);
                                          connect(t, &QTimer::timeout, this, [=]()->void{timerSlot(t->timerId());});
                                          m_timers.append(t);
                                          t->start(100);
                                     }
                                  }
                                  
                                  void MainWindow::timerSlot(int timerId)
                                  {
                                      qDebug() << timerId;
                                      qDebug() << Q_FUNC_INFO << count++;
                                  }
                                  

                                  which results in the correct call of:

                                  1
                                  void MainWindow::timerSlot(int) 0
                                  2
                                  void MainWindow::timerSlot(int) 1
                                  3
                                  void MainWindow::timerSlot(int) 2
                                  4
                                  void MainWindow::timerSlot(int) 3
                                  5
                                  void MainWindow::timerSlot(int) 4
                                  6
                                  void MainWindow::timerSlot(int) 5
                                  7
                                  void MainWindow::timerSlot(int) 6
                                  8
                                  void MainWindow::timerSlot(int) 7
                                  9
                                  void MainWindow::timerSlot(int) 8
                                  10
                                  void MainWindow::timerSlot(int) 9
                                  1
                                  void MainWindow::timerSlot(int) 10
                                  2
                                  void MainWindow::timerSlot(int) 11
                                  3
                                  void MainWindow::timerSlot(int) 12
                                  4
                                  void MainWindow::timerSlot(int) 13
                                  5
                                  void MainWindow::timerSlot(int) 14
                                  6
                                  void MainWindow::timerSlot(int) 15
                                  7
                                  void MainWindow::timerSlot(int) 16
                                  8
                                  void MainWindow::timerSlot(int) 17
                                  9
                                  void MainWindow::timerSlot(int) 18
                                  10
                                  void MainWindow::timerSlot(int) 19
                                  1
                                  void MainWindow::timerSlot(int) 20
                                  2
                                  void MainWindow::timerSlot(int) 21
                                  3
                                  void MainWindow::timerSlot(int) 22
                                  4
                                  void MainWindow::timerSlot(int) 23
                                  5
                                  void MainWindow::timerSlot(int) 24
                                  6
                                  void MainWindow::timerSlot(int) 25
                                  7
                                  void MainWindow::timerSlot(int) 26
                                  8
                                  void MainWindow::timerSlot(int) 27
                                  9
                                  void MainWindow::timerSlot(int) 28
                                  10
                                  void MainWindow::timerSlot(int) 29
                                  1
                                  void MainWindow::timerSlot(int) 30
                                  2
                                  void MainWindow::timerSlot(int) 31
                                  3
                                  void MainWindow::timerSlot(int) 32
                                  4
                                  void MainWindow::timerSlot(int) 33
                                  5
                                  void MainWindow::timerSlot(int) 34
                                  6
                                  void MainWindow::timerSlot(int) 35
                                  7
                                  void MainWindow::timerSlot(int) 36
                                  8
                                  void MainWindow::timerSlot(int) 37
                                  9
                                  void MainWindow::timerSlot(int) 38
                                  10
                                  void MainWindow::timerSlot(int) 39
                                  1
                                  void MainWindow::timerSlot(int) 40
                                  2
                                  void MainWindow::timerSlot(int) 41
                                  3
                                  void MainWindow::timerSlot(int) 42
                                  4
                                  void MainWindow::timerSlot(int) 43
                                  5
                                  void MainWindow::timerSlot(int) 44
                                  6
                                  void MainWindow::timerSlot(int) 45
                                  7
                                  void MainWindow::timerSlot(int) 46
                                  8
                                  void MainWindow::timerSlot(int) 47
                                  9
                                  void MainWindow::timerSlot(int) 48
                                  10
                                  void MainWindow::timerSlot(int) 49
                                  1
                                  void MainWindow::timerSlot(int) 50
                                  

                                  edit: @JonB
                                  the [=] is a "capture everything by copy" indicator. So no explicit capture of the id should be required


                                  Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


                                  Q: What's that?
                                  A: It's blue light.
                                  Q: What does it do?
                                  A: It turns blue.

                                  1 Reply Last reply
                                  2
                                  • J Jamshid
                                    29 Nov 2019, 11:05

                                    @J-Hilk I test this code, It only passes the last timer ID.

                                    if (!List.contains(str))
                                    {
                                    // Start timer
                                    timer = new QTimer(this);
                                    timer->setInterval(200);
                                    timer->start();
                                    connect(timer, &QTimer::timeout, this, [=]()->void{integrityTimersEvent(timer->timerId());});
                                    
                                    //
                                    timersList.append(timer);
                                    timersIDList.append(timer->timerId());
                                    }
                                    

                                    void FrameProcessor::integrityTimersEvent(int timerID)
                                    {
                                        qDebug() << "integrityTimersEvent => Timer ID:" << timerID;
                                    }
                                    

                                    Am I doing it right way?

                                    Christian EhrlicherC Offline
                                    Christian EhrlicherC Offline
                                    Christian Ehrlicher
                                    Lifetime Qt Champion
                                    wrote on 29 Nov 2019, 11:13 last edited by
                                    #16

                                    @Jamshid said in How to create some Timers at run time and handle them?:

                                    Am I doing it right way?

                                    I would guess timer is a member variable, then yes you're doing it wrong. You copy the whole context ( [=]) and therefore the access inside the lambda is 'this->timer'

                                    Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                                    Visit the Qt Academy at https://academy.qt.io/catalog

                                    1 Reply Last reply
                                    3
                                    • J Jamshid
                                      29 Nov 2019, 11:05

                                      @J-Hilk I test this code, It only passes the last timer ID.

                                      if (!List.contains(str))
                                      {
                                      // Start timer
                                      timer = new QTimer(this);
                                      timer->setInterval(200);
                                      timer->start();
                                      connect(timer, &QTimer::timeout, this, [=]()->void{integrityTimersEvent(timer->timerId());});
                                      
                                      //
                                      timersList.append(timer);
                                      timersIDList.append(timer->timerId());
                                      }
                                      

                                      void FrameProcessor::integrityTimersEvent(int timerID)
                                      {
                                          qDebug() << "integrityTimersEvent => Timer ID:" << timerID;
                                      }
                                      

                                      Am I doing it right way?

                                      J Offline
                                      J Offline
                                      J.Hilk
                                      Moderators
                                      wrote on 29 Nov 2019, 11:16 last edited by
                                      #17

                                      @Jamshid
                                      actually this

                                      timer = new QTimer(this);
                                      timer->setInterval(200);
                                      timer->start();
                                      connect(timer, &QTimer::timeout, this, [=]()->void{integrityTimersEvent(timer->timerId());});
                                      

                                      is referencing the member variable

                                      try the following:

                                      QTimer *t = new QTimer(this);
                                      t->setInterval(200);
                                      t->start();
                                      connect(t, &QTimer::timeout, this, [=]()->void{integrityTimersEvent(t->timerId());});
                                      timer = t;
                                      

                                      Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


                                      Q: What's that?
                                      A: It's blue light.
                                      Q: What does it do?
                                      A: It turns blue.

                                      J 1 Reply Last reply 29 Nov 2019, 12:01
                                      6
                                      • J J.Hilk
                                        29 Nov 2019, 11:16

                                        @Jamshid
                                        actually this

                                        timer = new QTimer(this);
                                        timer->setInterval(200);
                                        timer->start();
                                        connect(timer, &QTimer::timeout, this, [=]()->void{integrityTimersEvent(timer->timerId());});
                                        

                                        is referencing the member variable

                                        try the following:

                                        QTimer *t = new QTimer(this);
                                        t->setInterval(200);
                                        t->start();
                                        connect(t, &QTimer::timeout, this, [=]()->void{integrityTimersEvent(t->timerId());});
                                        timer = t;
                                        
                                        J Offline
                                        J Offline
                                        Jamshid
                                        wrote on 29 Nov 2019, 12:01 last edited by
                                        #18

                                        @J-Hilk Thanks a lot, now it works, I'm new to Qt and this topic I think was a little bit advanced for me :)

                                        1 Reply Last reply
                                        2
                                        • J Offline
                                          J Offline
                                          Jamshid
                                          wrote on 29 Nov 2019, 12:05 last edited by Jamshid
                                          #19

                                          Thank you all dear friends, that’s really kind of you.
                                          Your help is so appreciated.

                                          1 Reply Last reply
                                          2

                                          1/19

                                          28 Nov 2019, 12:54

                                          • Login

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