2015-03-14 4 views
0

Я создаю небольшую программу, которая показывает светофорные изображения с использованием QTimer. Поэтому я настраиваю свой таймер, и все работает хорошо. Но я не могу понять, как я могу заставить Робот-огни -> show() и -> hide() каждый раз, когда достигается интервал таймера. Я могу все это ошибаться, я все еще учился, поэтому, пожалуйста, советую.Trigger different event on QTimer reset

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); 
} 

Я также отключить кнопку Start при нажатии поэтому таймер не может работать в два раза.

Таким образом, в главном окне пользовательского интерфейса я использую Spinbox, который принимает вход пользователя, который является передачей времени Qtimer, а затем у меня есть 3 изображения с огнями красного зеленого желтого цвета, которые должны отображаться и скрыть в интервалах. Поэтому я создал почти что-то вроде ручного цикла. Qtimer запускает и показывает «Зеленый», затем переходит в «ShowYellow Slot», а затем «showRed», поэтому теперь он должен перейти в «Зеленый» слот, а затем на желтый, но он снова не переходит в «Зеленый».

Может кто-нибудь сказать мне, почему бы и нет.

ответ

1

Читать комментарии:

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); 
} 
+0

Im не на самом деле после того, что ваше высказывания. Будет ли это решить мою проблему показа и скрыть изображения? или это просто лучшая практика моей программы? – Vaaljan

+0

Наличие нескольких таймеров, вызывающих один и тот же слот, - это не просто плохая практика, это проблема. @Wintermute показывает, как вы можете переключать видимость изображения. – svlasov

+0

Я исправил эту проблему, отключив кнопку, когда пользователь на нее нажимает. в соответствии с назначением, таймер не должен останавливаться, если он не закрыт, так что теперь это нормально. У меня все еще есть проблема, не могли бы вы оставить комментарий к новому редактированию, которое я сделал для вопроса/кода. – Vaaljan

0

Возможно, проще всего:

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

В show() и hide() функции-члены QWidget эквивалентны setVisible(true) и setVisible(false), соответственно.

Проблема, с которой вы можете столкнуться позже, если вы нажмете кнопку запуска более одного раза, заключается в том, что вы каждый раз запускаете новый таймер интервала, что приводит к более быстрому миганию при каждом нажатии кнопки. Если это не то, что вы хотите, вам нужно будет управлять генерацией новых таймеров.