繁体   English   中英

在QTimer重置时触发其他事件

[英]Trigger different event on QTimer reset

我正在构建一个使用QTimer显示交通信号灯图像的小程序。 所以我设置了计时器,一切正常。 但是我不知道每次到达计时器间隔时如何使机器人灯进入-> show()和-> hide()。 我可能会出错,我仍在学习,所以请提出建议。

mainwindow.h

 #ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include<QTimer>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    void timer();
    QTimer *mytimer;



private:
    Ui::MainWindow *ui;
    int timerValue;

private slots:
    void showGreen();
    void showYellow();
    void showRed();
    void on_startButton_clicked();

};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
   ui->green->setVisible(false);
    ui->yellow->setVisible(false);
     ui->red->setVisible(false);
}

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

void MainWindow::timer(){
    ui->green->setVisible(true);
    mytimer = new QTimer(this);
    connect(mytimer,SIGNAL(timeout()),this,SLOT(showYellow()));
    mytimer->start(timerValue = (ui->spinBox->value())*1000);

}

void MainWindow::showYellow(){
    ui->yellow->setVisible(true);
    mytimer = new QTimer(this);
    connect(mytimer,SIGNAL(timeout()),this,SLOT(showRed()));
    mytimer->start(timerValue);
}

void MainWindow::showRed(){
   ui->red->setVisible(true);
    mytimer = new QTimer(this);
    connect(mytimer,SIGNAL(timeout()),this,SLOT(showGreen));
    mytimer->start(timerValue);
}
void MainWindow::showGreen(){
    ui->green->setVisible(true);
    mytimer = new QTimer(this);
    connect(mytimer,SIGNAL(timeout()),this,SLOT(showYellow()));
    mytimer->start(timerValue);
}
void MainWindow::on_startButton_clicked()
{
    timer();
    ui->startButton->setEnabled(false);
}

我也单击了“开始”按钮后将其禁用,因此计时器无法运行两次。

因此,在主Window UI上,我基本上有一个Spinbox来接受用户的输入,这是我将其传递给Qtimer的时间,然后我得到了3个带有红色,绿色和黄色的图像,必须在间隔中显示和隐藏。 因此,我几乎创建了类似于手动循环的内容。 Qtimer启动并显示绿色,然后进入ShowYellow插槽,然后进入showRed插槽,因此现在,它应该先进入Green插槽,然后变为黄色,但不会再次进入Green。

有人可以告诉我为什么。

阅读评论:

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) {
    ...
    mytimer = new QTimer(this); // create QTimer once
}

void MainWindow::timer() {
    timerValue = ui->spinBox->value() * 1000;

    showGreen(); // reuse showGreen()
}

void MainWindow::showYellow() {
    // this is how toggling can be done
    ui->yellow->setVisible(!ui->yellow->isVisible());

    mytimer->disconnect(); // disconnect before making a new connection
    connect(mytimer ,SIGNAL(timeout()), this, SLOT(showRed()));
    mytimer->start(timerValue);
}

void MainWindow::showRed() {
    ui->red->setVisible(!ui->red->isVisible());

    mytimer->disconnect();
    connect(mytimer ,SIGNAL(timeout()), this, SLOT(showGreen()));
    mytimer->start(timerValue);
}

void MainWindow::showGreen() {
    ui->green->setVisible(!ui->green->isVisible());

    mytimer->disconnect();
    connect(mytimer ,SIGNAL(timeout()), this, SLOT(showYellow()));
    mytimer->start(timerValue);
}

也许最简单:

void MainWindow::showHide(){
    ui->green->setVisible(!ui->green->isVisible());
}

QWidgetshow()hide()成员函数分别等效于setVisible(true)setVisible(false)

如果您不止一次按下启动按钮,可能会在以后遇到一个问题,就是您每次都会产生一个新的间隔计时器,导致每次按下该按钮都会更快地闪烁。 如果这不是您想要的事情,则必须控制新计时器的生成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM