2012-02-25 3 views
0

У меня есть QMainWindow, который соединяет 2 кнопки с 2 функциями. Я хочу запустить QTimer с помощью функции StartBTNClick и остановить QTimer с помощью функции StopBTNClick. Моя проблема в том, что QTimer не определен в StopBTNClick, поэтому я хочу знать, как определить открытый QTimer. (. Кстати, я новичок в C++, пожалуйста, медведь со мной)Сделать QTimer общедоступным. (Qt, C++)

Это мой код до сих пор:

MyClass::MainWindow(QWidget *parent, Qt::WFlags flags) 
    : QMainWindow(parent, flags) 
{ 
    ui.setupUi(this); 
    statusBar()->showMessage("Status: Idle."); 
    connect(ui.StartBTN, SIGNAL(clicked()), this, SLOT(StartBTNClick())); 
    connect(ui.StopBTN, SIGNAL(clicked()), this, SLOT(StopBTNClick())); 
} 

void MyClass::StartBTNClick() 
{ 
    QTimer *RunTimer = new QTimer(this); 
    connect(RunTimer, SIGNAL(timeout()), this, SLOT(TimerHandler())); 
    RunTimer->start(5000); 
    statusBar()->showMessage("Status: Running."); 
} 

void MyClass::StopBTNClick() 
{ 
    RunTimer->stop(); // Not working. Says it's not defined. 
    disconnect(RunTimer, SIGNAL(timeout()), this, SLOT(TimerHandler())); 
    statusBar()->showMessage("Status: Idle."); 
} 

void MyClass::TimerHandler() 
{ 
    // I set QMessageBox to test if it's working. 
    QMessageBox::information(this, "lala", "nomnom"); 
} 

ответ

3

Сделать QTimer переменного члена вашего класса, и он будет доступен в оба функции.

class MyClass 
{ 
... //other variables and method definitions 

QTimer* runTimer; 
}; 

Используйте указатель члена класса, а не локально определяется один:

void MyClass::StartBTNClick() 
{ 
    runTimer = new QTimer(this);//this would work, but it may be better to 
            //initialize the timer in the constructor 
    connect(runTimer, SIGNAL(timeout()), this, SLOT(TimerHandler())); 
    runTimer->start(5000); 
    statusBar()->showMessage("Status: Running."); 
} 

void MyClass::StopBTNClick() 
{ 
    runTimer->stop(); // this will work now; if it hasn't been initialized, though, 
         // you will cause a crash. 
    disconnect(RunTimer, SIGNAL(timeout()), this, SLOT(TimerHandler())); 
    statusBar()->showMessage("Status: Idle."); 
} 

Это, вероятно, будет лучше инициализировать время (runTimer = новый QTimer (это)) в конструкторе, а чем при нажатии кнопки, и просто запускайте таймер при нажатии кнопки. Если вы этого не сделаете, вам придется защититься от использования неинициализированного указателя в StopBTNClick() в случае, если кнопка нажата до кнопки «Пуск».

+0

Работает как очарование сейчас, спасибо. :) Я сделал новый bool и команду if на 'StopBTNClick', чтобы проверить, запущен ли QTimer. ^^ – HitomiTenshi

+2

1. Вам не нужно bool, вместо этого вы можете использовать runTimer-> isActive(). 2. Вам не нужно отключать соединение sig/slot каждый раз. Вы должны в своем классе создать свой таймер и подключить его. 3. Вы можете отключить кнопку запуска после запуска и включить кнопку останова и наоборот на остановке –

+0

Камиль прав, это был бы лучший способ пойти. То, как вы это делаете, может работать и может понадобиться в особых случаях, но, вероятно, не в вашем случае. – tmpearce

Смежные вопросы