Qt QLCDNumber问题
Qt QLCDNumber issue
我正在使用 Qt Creator 制作 timer/stopwatch。但是,我的重置功能(点击重置按钮)无法正常工作。我希望它停止计时器并将显示 (QLCDNumber) 设置为 0。相反,计时器停止但显示数字保持不变,就像单击暂停按钮一样。除了当计时器再次启动(单击开始按钮)时,它会从原始时间重新启动(正如我希望的那样)。这是代码。
我只包括了问题的一部分。
void MainWindow::delay()
{
QTime dieTime = QTime::currentTime().addSecs(1);
while (QTime::currentTime() < dieTime && !spause && !sreset)
{
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
std::this_thread::sleep_for(std::chrono::milliseconds(1));
}
}
void MainWindow::on_tstart_clicked()
{
ttime = treset ? 0 : ttime;
tpause = treset = false;
ttime = ttime == 0 ? (ui->hr->value() * 3600 + ui->min->value() * 60 + ui->sec->value()) : ttime;
while (ttime >= 0 && !tpause && !treset)
{
const unsigned short sec = ttime % 3600 % 60, min = ttime % 3600 / 60, hr = ttime / 3600;
ui->tsec2->display(sec % 10);
ui->tsec1->display(sec / 10);
ui->tmin2->display(min % 10);
ui->tmin1->display(min / 10);
ui->thr2->display(hr % 10);
ui->thr1->display(hr / 10);
delay();
if (!tpause && !treset) --ttime;
}
}
void MainWindow::on_tpause_clicked()
{
tpause = true;
}
void MainWindow::on_treset_clicked()
{
treset = true;
ui->ssec2->display(0);
ui->ssec1->display(0);
ui->smin2->display(0);
ui->smin1->display(0);
ui->shr2->display(0);
ui->shr1->display(0);
}
您对按钮的点击仅在包含 processEvents()
的函数 delay() 中处理。当执行 delay()
时,它向应用程序发送消息,但是 在 下一个 while()
循环开始后执行 。使用QTimer
可以避免这种情况。
以下是如何在您的案例中使用 QTimer。
(mainwindow.h)
#include <QTimer>
...
QTimer timer;
(mainwindow.cpp)
MainWindow::MainWindow()
{
...
connect(&timer,SIGNAL(timeout()),this,SLOT(on_timer()));
}
void MainWindow::on_tstart_clicked()
{
timer.start(1000);
}
void MainWindow::on_timer()
{
if(timer.isActive()) return;
ttime--;
(display LCD values)
if(ttime<=0)
{
ttime=0;
(emit signal for alarm or whatever you want)
timer.stop();
}
}
void MainWindow::on_tpause_clicked()
{
timer.stop();
(display LCD values)
}
void MainWindow::on_treset_clicked()
{
timer.stop();
ttime=0;
(display zeroes)
}
(代表OP发表).
一切都解决了!我不小心重置了秒表显示。谢谢@Michael!
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
// ttimer was declared in "MainWindow" -> QTimer ttimer;
connect(&ttimer, SIGNAL(timeout()), this, SLOT(on_timer()));
}
void MainWindow::on_tstart_clicked()
{
ttime = ttime == 0 ? (ui->hr->value() * 3600 + ui->min->value() * 60 + ui->sec->value()) : ttime;
ttimer.start(1000);
}
void MainWindow::on_timer()
{
if (!ttimer.isActive()) return;
--ttime;
const unsigned short hr = ttime / 3600, min = ttime % 3600 / 60, sec = ttime % 60;
ui->tsec2->display(sec % 10);
ui->tsec1->display(sec / 10);
ui->tmin2->display(min % 10);
ui->tmin1->display(min / 10);
ui->thr2->display(hr % 10);
ui->thr1->display(hr / 10);
if (ttime <= 0)
{
// (emit signal for alarm or whatever you want)
ttimer.stop();
}
}
void MainWindow::on_tpause_clicked()
{
ttimer.stop();
// (display LCD values)
}
void MainWindow::on_treset_clicked()
{
ttimer.stop();
ttime = 0;
ui->tsec2->display(0);
ui->tsec1->display(0);
ui->tmin2->display(0);
ui->tmin1->display(0);
ui->thr2->display(0);
ui->thr1->display(0);
}
我在我的代码中实现了 QTimer,但是当我按下 "Start" 按钮 (on_tstart_clicked) 或任何其他按钮时,没有任何反应(显示没有变化)。
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
// ttimer was declared in "MainWindow" -> QTimer ttimer;
connect(&ttimer, SIGNAL(timeout()), this, SLOT(on_timer()));
}
void MainWindow::on_tstart_clicked()
{
ttime = ttime == 0 ? (ui->hr->value() * 3600 + ui->min->value() * 60 + ui->sec->value()) : ttime;
ttimer.start(1000);
}
void MainWindow::on_timer()
{
if (!ttimer.isActive()) return;
--ttime;
const unsigned short hr = ttime / 3600, min = ttime % 3600 / 60, sec = ttime % 60;
ui->tsec2->display(sec % 10);
ui->tsec1->display(sec / 10);
ui->tmin2->display(min % 10);
ui->tmin1->display(min / 10);
ui->thr2->display(hr % 10);
ui->thr1->display(hr / 10);
if (ttime <= 0)
{
// (emit signal for alarm or whatever you want)
ttimer.stop();
}
}
void MainWindow::on_tpause_clicked()
{
ttimer.stop();
// (display LCD values)
}
void MainWindow::on_treset_clicked()
{
ttimer.stop();
ttime = 0;
ui->ssec2>tsec2->display(0);
ui->ssec1>tsec1->display(0);
ui->smin2>tmin2->display(0);
ui->smin1>tmin1->display(0);
ui->shr2>thr2->display(0);
ui->shr1>thr1->display(0);
}
问题很简单,我一直在掩饰。我不得不将 ttimer.isActive() 更改为 !ttimer.isActive().
但是,现在重置 (on_treset_clicked) 不起作用。 QLCDNumber 未重置为 0。
我正在使用 Qt Creator 制作 timer/stopwatch。但是,我的重置功能(点击重置按钮)无法正常工作。我希望它停止计时器并将显示 (QLCDNumber) 设置为 0。相反,计时器停止但显示数字保持不变,就像单击暂停按钮一样。除了当计时器再次启动(单击开始按钮)时,它会从原始时间重新启动(正如我希望的那样)。这是代码。
我只包括了问题的一部分。
void MainWindow::delay()
{
QTime dieTime = QTime::currentTime().addSecs(1);
while (QTime::currentTime() < dieTime && !spause && !sreset)
{
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
std::this_thread::sleep_for(std::chrono::milliseconds(1));
}
}
void MainWindow::on_tstart_clicked()
{
ttime = treset ? 0 : ttime;
tpause = treset = false;
ttime = ttime == 0 ? (ui->hr->value() * 3600 + ui->min->value() * 60 + ui->sec->value()) : ttime;
while (ttime >= 0 && !tpause && !treset)
{
const unsigned short sec = ttime % 3600 % 60, min = ttime % 3600 / 60, hr = ttime / 3600;
ui->tsec2->display(sec % 10);
ui->tsec1->display(sec / 10);
ui->tmin2->display(min % 10);
ui->tmin1->display(min / 10);
ui->thr2->display(hr % 10);
ui->thr1->display(hr / 10);
delay();
if (!tpause && !treset) --ttime;
}
}
void MainWindow::on_tpause_clicked()
{
tpause = true;
}
void MainWindow::on_treset_clicked()
{
treset = true;
ui->ssec2->display(0);
ui->ssec1->display(0);
ui->smin2->display(0);
ui->smin1->display(0);
ui->shr2->display(0);
ui->shr1->display(0);
}
您对按钮的点击仅在包含 processEvents()
的函数 delay() 中处理。当执行 delay()
时,它向应用程序发送消息,但是 在 下一个 while()
循环开始后执行 。使用QTimer
可以避免这种情况。
以下是如何在您的案例中使用 QTimer。
(mainwindow.h)
#include <QTimer>
...
QTimer timer;
(mainwindow.cpp)
MainWindow::MainWindow()
{
...
connect(&timer,SIGNAL(timeout()),this,SLOT(on_timer()));
}
void MainWindow::on_tstart_clicked()
{
timer.start(1000);
}
void MainWindow::on_timer()
{
if(timer.isActive()) return;
ttime--;
(display LCD values)
if(ttime<=0)
{
ttime=0;
(emit signal for alarm or whatever you want)
timer.stop();
}
}
void MainWindow::on_tpause_clicked()
{
timer.stop();
(display LCD values)
}
void MainWindow::on_treset_clicked()
{
timer.stop();
ttime=0;
(display zeroes)
}
(代表OP发表).
一切都解决了!我不小心重置了秒表显示。谢谢@Michael!
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
// ttimer was declared in "MainWindow" -> QTimer ttimer;
connect(&ttimer, SIGNAL(timeout()), this, SLOT(on_timer()));
}
void MainWindow::on_tstart_clicked()
{
ttime = ttime == 0 ? (ui->hr->value() * 3600 + ui->min->value() * 60 + ui->sec->value()) : ttime;
ttimer.start(1000);
}
void MainWindow::on_timer()
{
if (!ttimer.isActive()) return;
--ttime;
const unsigned short hr = ttime / 3600, min = ttime % 3600 / 60, sec = ttime % 60;
ui->tsec2->display(sec % 10);
ui->tsec1->display(sec / 10);
ui->tmin2->display(min % 10);
ui->tmin1->display(min / 10);
ui->thr2->display(hr % 10);
ui->thr1->display(hr / 10);
if (ttime <= 0)
{
// (emit signal for alarm or whatever you want)
ttimer.stop();
}
}
void MainWindow::on_tpause_clicked()
{
ttimer.stop();
// (display LCD values)
}
void MainWindow::on_treset_clicked()
{
ttimer.stop();
ttime = 0;
ui->tsec2->display(0);
ui->tsec1->display(0);
ui->tmin2->display(0);
ui->tmin1->display(0);
ui->thr2->display(0);
ui->thr1->display(0);
}
我在我的代码中实现了 QTimer,但是当我按下 "Start" 按钮 (on_tstart_clicked) 或任何其他按钮时,没有任何反应(显示没有变化)。
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
// ttimer was declared in "MainWindow" -> QTimer ttimer;
connect(&ttimer, SIGNAL(timeout()), this, SLOT(on_timer()));
}
void MainWindow::on_tstart_clicked()
{
ttime = ttime == 0 ? (ui->hr->value() * 3600 + ui->min->value() * 60 + ui->sec->value()) : ttime;
ttimer.start(1000);
}
void MainWindow::on_timer()
{
if (!ttimer.isActive()) return;
--ttime;
const unsigned short hr = ttime / 3600, min = ttime % 3600 / 60, sec = ttime % 60;
ui->tsec2->display(sec % 10);
ui->tsec1->display(sec / 10);
ui->tmin2->display(min % 10);
ui->tmin1->display(min / 10);
ui->thr2->display(hr % 10);
ui->thr1->display(hr / 10);
if (ttime <= 0)
{
// (emit signal for alarm or whatever you want)
ttimer.stop();
}
}
void MainWindow::on_tpause_clicked()
{
ttimer.stop();
// (display LCD values)
}
void MainWindow::on_treset_clicked()
{
ttimer.stop();
ttime = 0;
ui->ssec2>tsec2->display(0);
ui->ssec1>tsec1->display(0);
ui->smin2>tmin2->display(0);
ui->smin1>tmin1->display(0);
ui->shr2>thr2->display(0);
ui->shr1>thr1->display(0);
}
问题很简单,我一直在掩饰。我不得不将 ttimer.isActive() 更改为 !ttimer.isActive().
但是,现在重置 (on_treset_clicked) 不起作用。 QLCDNumber 未重置为 0。