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. [Solved] How to control QTimer and lineEdit

[Solved] How to control QTimer and lineEdit

Scheduled Pinned Locked Moved General and Desktop
14 Posts 4 Posters 5.3k 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.
  • A Offline
    A Offline
    andre
    wrote on last edited by
    #4

    Create a single timer instance once, and re-use that. Your constructor would be a good candidate for a location to do that.

    1 Reply Last reply
    0
    • S Offline
      S Offline
      Swinetha
      wrote on last edited by
      #5

      I am implemented the code as said by Andre,
      even though it is not displayed the data

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

        or is there any other concept like creating new timer every time and close that timer? is it correct or not

        1 Reply Last reply
        0
        • JeroentjehomeJ Offline
          JeroentjehomeJ Offline
          Jeroentjehome
          wrote on last edited by
          #7

          Hi,
          In your constructor HMI1 allocate the QProcess and the QTimer, don't start them!! but only connect the signals you need if wanted. Then in the Av_start simple start the QProcess and the QTimer.
          Both the QProcess and the QTimer variables should be private members of your HMI1 class! That will fix a lot of issues here.
          So, quick code example:
          @
          void HMI1::HMI1(QObject * parent)
          : QObject(parent)
          {
          m_Timer = new QTimer(1000);
          connect(timer, SIGNAL(timeout()), this, SLOT(updateText()));

          m_Process = new QProcess();
          process->setReadChannel(QProcess::StandardOutput);
          process->start(program,arguments);
          connect(process,SIGNAL(readyReadStandardOutput()),this,SLOT(read_AV()));
          }
          and:
          void HMI1::read_AV()
          {
          if (m_Timer != NULL)
          m_Timer.start();
          ... // do the rest here
          }
          @

          Greetz, Jeroen

          1 Reply Last reply
          0
          • raven-worxR Offline
            raven-worxR Offline
            raven-worx
            Moderators
            wrote on last edited by
            #8

            it is still unclear what you actually want to achieve.
            I guess you want to display every line your QProcess' std. And each line you display has to be visible for at least 1 sec.
            Am i correct?

            --- SUPPORT REQUESTS VIA CHAT WILL BE IGNORED ---
            If you have a question please use the forum so others can benefit from the solution in the future

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

              to raven-worx,

              ya I want to display the data for every sec and also if I click stop button QProcess and timer both should stop thier process as well as timer

              1 Reply Last reply
              0
              • raven-worxR Offline
                raven-worxR Offline
                raven-worx
                Moderators
                wrote on last edited by
                #10

                When the readyReadStandardOutput() signal is triggered it' may be that there are more/less than 1 new line available. Thus you probably wont display all the data. And it's definitely triggered more than every 1 sec.

                Why don't you use a QTextEdit and append the text there?

                If you have to stick to the QLineEdit (can just display single lines) you should write the stdout to a buffer, and read new lines when the timer (single instance) triggers.
                (Actually the QProcess itself is already a buffer though)

                --- SUPPORT REQUESTS VIA CHAT WILL BE IGNORED ---
                If you have a question please use the forum so others can benefit from the solution in the future

                1 Reply Last reply
                0
                • S Offline
                  S Offline
                  Swinetha
                  wrote on last edited by
                  #11

                  To Jeroentje@ho..
                  I tried as you said even though timer will not connect to that SLOT()

                  1 Reply Last reply
                  0
                  • S Offline
                    S Offline
                    Swinetha
                    wrote on last edited by
                    #12

                    acording to my application I should use only lineEdit to display the data

                    and I did nt understand

                    bq. If you have to stick to the QLineEdit (can just display single lines) you should write the stdout to a buffer, and read new lines when the timer (single instance) triggers.

                    can you explain me

                    1 Reply Last reply
                    0
                    • raven-worxR Offline
                      raven-worxR Offline
                      raven-worx
                      Moderators
                      wrote on last edited by
                      #13

                      here you go:
                      @
                      void Hmi1::on_start_AV_clicked()
                      {
                      QString program;
                      QStringList arguments;
                      program = "/home/IFSS/programs/VME/test";
                      process =new QProcess();
                      process->setReadChannel(QProcess::StandardOutput);
                      process->start(program,arguments);

                          timer = new QTimer(this);
                          timer->setInterval (1000);
                          timer->setSingleShot (false);
                          connect(timer, SIGNAL(timeout()), this, SLOT(read_AV()));
                          timer->start();
                      }
                      

                      void Hmi1::read_AV()
                      {
                      char buf[1024];
                      qint64 lineLength = process->readLine(buf, sizeof(buf));
                      if (lineLength > 0)
                      {
                      //set buf to your lineedit
                      }
                      }
                      @

                      As i said, with your QLineEdit you can only display a single line of data. Unless you remove all linebreaks and display the whole data in one line.
                      Q(Plain)TextEdit would be more appropriate for this.

                      --- SUPPORT REQUESTS VIA CHAT WILL BE IGNORED ---
                      If you have a question please use the forum so others can benefit from the solution in the future

                      1 Reply Last reply
                      0
                      • S Offline
                        S Offline
                        Swinetha
                        wrote on last edited by
                        #14

                        thanks for your reply,,

                        I got one solution for this but once you check this one and said me is correct method or not?

                        code is as shown below

                        @
                        Hmi1::Hmi1(QWidget *parent) :
                        QWidget(parent),
                        ui4(new Ui::Hmi1)
                        {
                        ui4->setupUi(this);

                        timer=new QTimer();
                        

                        }@

                        start_button clicked
                        @
                        void Hmi1::on_start_AV_clicked()
                        {
                        QString program;
                        QStringList arguments;
                        process =new QProcess();
                        process->setReadChannel(QProcess::StandardOutput);
                        program = "/home/IFSS/programs/VME/test";
                        arguments<<"1";
                        process->start(program,arguments);
                        connect(process,SIGNAL(readyReadStandardOutput()),this,SLOT(read_AV()));
                        }
                        @
                        read_AV() slot
                        @
                        void Hmi1::read_AV()
                        {
                        QByteArray b1;
                        QStringList strLines;

                        b1= process->readAllStandardOutput();
                        b1_size=b1_size+b1.length();
                        qDebug()<<QString::number(q++)<<" "<<QString::number(b1_size);
                        strLines = QString(b1).split("\n");
                        foreach (line_array1[a++], strLines)   {; }
                        

                        if(timer!=NULL)
                        {
                        emit out(line_array1);
                        timer->start(1000);

                              connect(this,SIGNAL(out(QString *)),this,SLOT(disp(QString *)));
                            }
                        

                        }
                        @
                        disp() slot
                        @
                        void Hmi1::disp(QString *line_array1)
                        {
                        ui4->lineEdit_AIV1->setText(line_array1[k++]);
                        ui4->lineEdit_AIV11->setText(line_array1[k++]);

                            ui4->lineEdit_AIV2->setText(line_array1[k++]);
                            ui4->lineEdit_AIV22->setText(line_array1[k++]);
                        
                            ui4->lineEdit_AIV3->setText(line_array1[k++]);
                            ui4->lineEdit_AIV33->setText(line_array1[k++]);
                        
                            ui4->lineEdit_AIV4->setText(line_array1[k++]);
                            ui4->lineEdit_AIV44->setText(line_array1[k++]);
                        

                        }
                        @
                        & STOP button
                        @
                        void Hmi1::on_stop_AV_clicked()
                        {
                        if(timer->isActive())
                        {
                        connect(timer, SIGNAL(timeout()), this, SLOT(updateText()));
                        }
                        int n=process->pid();
                        QStringList arg;
                        arg<<QString::number(n);
                        QProcess *sh1=new QProcess();
                        sh1->start("kill",arg);

                        process->closeReadChannel(QProcess::StandardOutput);
                        process->close();
                        

                        }
                        @

                        @
                        void Hmi1::updateText()
                        {
                        timer->stop();
                        }
                        @

                        by using this I am able to control the timer and Process

                        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