Russian Qt Forum
Ноябрь 15, 2024, 08:32 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTimer что делаю не так?  (Прочитано 5002 раз)
Temi4
Гость
« : Июнь 14, 2010, 19:40 »

Привет проблема в том, что я запускаю таймер, но он не вызывает слот по timeout сигналу, подскажите что делаю не так?

Код:
#include "mainDialog.h"
#include <QLabel>
#include <QTimer>
#include <QHBoxLayout>
#include <QIcon>
#include <QSystemTrayIcon>

MainDialog::MainDialog(QDialog *parent) : QDialog(parent)
{
trayIcon = new QSystemTrayIcon(this);
QIcon icon = QIcon("icon.png");
    trayIcon->setIcon(icon);
setWindowIcon(icon);
trayIcon->show();

j=0;
label = new QLabel(this);
label->setText(tr("Start"));
timer = new QTimer(this);
timer->setSingleShot(true);
connect(timer, SIGNAL(timeout()), this, SLOT(updates()));

//В диалоговое окно добавили лейбел для отображения.
QHBoxLayout *labelLayout = new QHBoxLayout;
labelLayout->addWidget(label);
setLayout(labelLayout);
}

void MainDialog::updates()
{
j++;
label->setText(QString::number(j));
update();
}
void MainDialog::SetText(QString text)
{
label->setText(text);
}
void MainDialog::StartTimer(int timeout)
{
timer->start(timeout);
}
void MainDialog::StopTimer()
{
timer->stop();
}

В мейне создаю этот самый MainDialog и вызываю StartTimer(200); но он не вызвает updates - подскажите почему?
Записан
Makss
Гость
« Ответ #1 : Июнь 14, 2010, 20:01 »

timer->setSingleShot(true); в этой строке не так)) эта функция говорит о том что таймер будет однократным, ваш слот вызовится только один раз
Записан
Temi4
Гость
« Ответ #2 : Июнь 14, 2010, 20:20 »

убрал но он даже 1 раз не вызывается.
Записан
SimpleSunny
Гость
« Ответ #3 : Июнь 14, 2010, 20:56 »

А покажите код где создается MainDialog и візівается StartTimer(200).
Записан
Temi4
Гость
« Ответ #4 : Июнь 14, 2010, 22:15 »

Код:
MainDialog *myDialog;
DWORD func(LPVOID lpvoid)
{
myDialog->StartTimer(200);
}

int main(int argc, char *argv[])
{
HANDLE hReadThread = NULL;
DWORD dwThreadID;
QApplication a(argc, argv);

myDialog = new MainDialog();
myDialog->resize(240,50);
myDialog->show();

if (hReadThread = CreateThread (NULL, 0, func, 0, 0, &dwThreadID))
{
CloseHandle (hReadThread);
}

return a.exec();

}


В стартТаймер он заходит и все нормально стартует
Записан
SimpleSunny
Гость
« Ответ #5 : Июнь 14, 2010, 23:10 »

Напишите так
Код
C++ (Qt)
QApplication a(argc, argv);
QErrorMessage::qtHandler();
Разнообразные ошибки будут выводиться в виде GUI диалогов, возможно прочитаете что-то интересное.

Код
C++ (Qt)
if (hReadThread = CreateThread (NULL, 0, func, 0, 0, &dwThreadID))
{
CloseHandle (hReadThread);
}
А зачем нужен этот код? Чего вы хотели добиться?
Записан
Makss
Гость
« Ответ #6 : Июнь 14, 2010, 23:49 »

если я его правильно понял, он этим хотел это: запустить функцию func что выше по коду, в отдельном потоке)) а та в свою очередь таймер стартанула бы) только вот интересно почему она не упала, ведь обращается к GUI в другом потоке
Записан
ритт
Гость
« Ответ #7 : Июнь 15, 2010, 00:59 »

она и не должна была упасть
Записан
Temi4
Гость
« Ответ #8 : Июнь 16, 2010, 11:01 »

если я его правильно понял, он этим хотел это: запустить функцию func что выше по коду, в отдельном потоке))
да все верно
Напишите так
Код
C++ (Qt)
QApplication a(argc, argv);
QErrorMessage::qtHandler();
Разнообразные ошибки будут выводиться в виде GUI диалогов, возможно прочитаете что-то интересное.
хорошо сегодня попробую.

Я так понял что таймер из другого потока запустить не получится?
Записан
Dendy
Гость
« Ответ #9 : Июнь 16, 2010, 12:01 »

Я так понял что таймер из другого потока запустить не получится?

Код
C++ (Qt)
QMetaObject::invokeMethod( timer, "start", Qt::QueuedConnection );
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.169 секунд. Запросов: 20.