Как я могу использовать 2 QTimer? Один для подсчета, а другой для отображения

Я хочу использовать таймер с С++, используя Qt. У меня в коде есть один таймер, но время на экране отображается медленно. думаю, что timer -> start(500) должен обновляться каждые 20 секунд.

Я хочу использовать 2 таймера для этого. Один предназначен для обновления и подсчета времени, другой таймер будет отображаться на экране. Как я могу это сделать, я был бы очень рад, если вы можете помочь

Вот мой код:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTimer>
#include <QPushButton>


QTimer *timer = new QTimer();
QTimer *timer2 = new QTimer();

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    connect(timer,
            SIGNAL(timeout()),
            this,
            SLOT(functionstart())
            );    
}


void MainWindow::functionStart()
{    
    int count;   
    count = ui->lcdNumber->value();
    count++;
    ui->lcdNumber->display(count);
}

MainWindow::~MainWindow()
{
   delete ui;    
}

void MainWindow::on_pushButton_clicked()
{    
    if(timer->isActive()){
        timer->stop();
        ui->pushButton->setText("Start");
    }
    else {
        timer->start(500); 
        ui->pushButton->setText("Stop");
    }
}

person süslü coder    schedule 30.12.2020    source источник
comment
Создайте два таймера, подключитесь к их соответствующим сигналам timeout() и делайте все, что хотите, в вызываемых слотах.   -  person chehrlic    schedule 30.12.2020
comment
Спасибо за Ваш ответ   -  person süslü coder    schedule 30.12.2020


Ответы (2)


Когда вы запускаете такой таймер, как этот timer -› start(500), он будет отключаться каждые 500 мс (0,5 секунды), поэтому, если вам нужен таймер с 20-секундным временем ожидания, вы можете запустить его с помощью timer -› старт(20000). Теперь, если вам нужен другой таймер для обновления дисплея, вы можете запустить свой timer2 с периодом, который вам нравится, и подключить его к другому слоту для обновления пользовательского интерфейса следующим образом:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTimer>
#include <QPushButton>

QTimer *timer = new QTimer();
QTimer *timer2 = new QTimer();

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(functionStart()));
    connect(timer2, SIGNAL(timeout()), this, SLOT(updateDisplay()));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::functionStart()
{
    count += 1;
}

void MainWindow::updateDisplay()
{
    ui->lcdNumber->display(count);
}

void MainWindow::on_pushButton_clicked()
{

    if(timer->isActive() & timer2->isActive())
    {
       timer->stop();
       timer2->stop();
       ui->pushButton->setText("Start");
    }
    else
    {
       timer->start(1000);
       timer2->start(20000);
       ui->pushButton->setText("Stop");
    }
}

Я переместил определение счетчика в заголовочный файл MainWindow, чтобы сохранить его значение.

person Farshid616    schedule 30.12.2020
comment
Спасибо за ваш ответ. Когда я запускаю код, который вы предлагаете, счетчик не обновляется. Где я могу ошибаться - person süslü coder; 30.12.2020
comment
Он будет обновляться каждые 20 секунд, измените значение на то, что вы хотите, на on_pushButton_clicked() - person Farshid616; 30.12.2020
comment
Я понимаю, я изменился, но он не меняется. Значение на ЖК-дисплее всегда равно 0 - person süslü coder; 30.12.2020
comment
Каков желаемый период для обновления? и как долго вы хотите обновить счет? каждую секунду? - person Farshid616; 30.12.2020
comment
число на дисплее должно обновляться 20 раз в секунду. - person süslü coder; 30.12.2020
comment
поэтому измените значение timer2 на 50. как насчет счета? вы переместили его в заголовочный файл? - person Farshid616; 30.12.2020
comment
Он может быть синхронным с timer2. Для этого нет правила. После всех этих изменений, что мне делать, если на дисплее нет никаких изменений? - person süslü coder; 30.12.2020
comment
приватные слоты: void on_pushButton_clicked(); частный: Ui::MainWindow *ui; инт количество; - person süslü coder; 30.12.2020
comment
проверьте функцию подключения и поместите некоторые отладочные материалы. если у вас есть какие-либо ошибки, укажите это здесь - person Farshid616; 30.12.2020
comment
В заголовочном файле, где я должен разместить счет? - person süslü coder; 30.12.2020
comment
В приватных членах определите его строчными буквами. - person Farshid616; 30.12.2020
comment
все сделал правильно но все равно не работает :( - person süslü coder; 30.12.2020
comment
выдает ошибку в main.cpp с QApplication a(argc, argv); - person süslü coder; 30.12.2020
comment
Поместите сюда текст ошибки. - person Farshid616; 30.12.2020
comment
я добавляю комментарий - person süslü coder; 30.12.2020

Я добавил для него раздел qDebug. Когда я это делаю, я вижу на консоли, что он обновляется 20 раз в секунду. Но на дисплее по-прежнему нет никаких изменений. Вот мой код

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTimer>
#include <QPushButton>
#include <QDebug>

 QTimer *timer = new QTimer();

 QTimer *timer2 = new QTimer();





MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);


    connect(timer, SIGNAL(timeout()), this, SLOT(functionStart()));
    connect(timer2, SIGNAL(timeout()), this, SLOT(updateDisplay()));


}

MainWindow::~MainWindow()
{
delete ui;
}



void MainWindow::functionStart()
{

count += 1;

}

void MainWindow::updateDisplay()

 {


 ui->lcdNumber->display(count);

qDebug() << "asadsf";

 }


void MainWindow::on_pushButton_clicked()
{


    if(timer->isActive() & timer2->isActive())
        {
           timer->stop();
           timer2->stop();
           ui->pushButton->setText("Start");
        }
        else
        {
           timer->start(40);
           timer2->start(50);
           ui->pushButton->setText("Stop");
        }



}
person süslü coder    schedule 30.12.2020
comment
Распечатайте значение счетчика с помощью qDebug и проверьте его. - person Farshid616; 30.12.2020
comment
Он начинает считать с 25984769. На дисплее по-прежнему нет никаких изменений. Показывает только 0. Кстати, почему не начинается отсчет с 0 - person süslü coder; 30.12.2020
comment
Потому что вы не установили начальное значение для подсчета. Используйте int count = 0; - person Farshid616; 30.12.2020
comment
ЭТО РАБОТАЕТ!!!!!! СПАСИБО БОЛЬШОЕ Я ТАК РАДА - person süslü coder; 30.12.2020