Сделайте QTimer общедоступным.(Qt, C ++) - PullRequest
0 голосов
/ 26 февраля 2012

У меня есть QMainWindow, который соединяет 2 кнопки с 2 функциями.Я хочу запустить QTimer с помощью функции StartBTNClick и остановить QTimer с помощью функции StopBTNClick.Моя проблема в том, что QTimer не определен в StopBTNClick, поэтому я хочу знать, как определить общедоступный QTimer.(кстати. Я новичок в 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");
}

1 Ответ

3 голосов
/ 26 февраля 2012

Сделайте 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 = new QTimer (this)) в конструкторе, а не по нажатию кнопки, и просто запускать таймер при нажатии кнопки.Если вы не сделаете это таким образом, вам придется остерегаться использования неинициализированного указателя в StopBTNClick () в случае нажатия этой кнопки перед кнопкой «Пуск».

...