Russian Qt Forum

Qt => Вопросы новичков => Тема начата: demaker от Май 22, 2012, 14:13



Название: QEvent
Отправлено: demaker от Май 22, 2012, 14:13
Не могли бы объяснить в чем ошибка?

Есть форма TForm. На форме есть кнопка Start.
При нажатии на кнопку создается форма, на которой  есть progressBar и объект потока TThread, а в нем таймер и по timeout() progressBar увеличивается.

Хочу по нажатию кнопки остановить один из потоков.


void TForm::stopThread(QKeyEvent* event)
{
   if( event->key() == Qt::Key_F1)
   {
      m_threadform[0]->thread->quit();
      m_threadform[0]->thread->wait();
      event->accept();
   }
}

но ничего не выходит. Даже на мнажатие не реагирует.
Не могли бы подсказать почему???  ??? Спасибо!


Название: Re: QEvent
Отправлено: mutineer от Май 22, 2012, 14:21
что за метод stopThread и почему в него QKeyEvent должны приходить?


Название: Re: QEvent
Отправлено: demaker от Май 22, 2012, 14:30
Это обработчик события

сlass TForm : public QWidget
{
    Q_OBJECT

public:
 
    QList<ThreadForm*> m_threadform;
 
public:
    TForm(QWidget *parent = 0);
    ~TForm();

protected:
   void closeEvent(QCloseEvent* event);
   void stopThread(QKeyEvent* event);

private:
    Ui::TFormClass ui;
 ...

};


Название: Re: QEvent
Отправлено: demaker от Май 22, 2012, 14:32
А QKeyEvent Так как мы обрабатываем событие по нажатию кнопки. :)


Название: Re: QEvent
Отправлено: mutineer от Май 22, 2012, 14:34
Я догадался что это обработчик события... Он зарегистрирован как обработчик? Почему система должна вызвать именно этот метод?


Название: Re: QEvent
Отправлено: DmitryM от Май 22, 2012, 14:39
Вот эти переопределяемые методы для чего присутствуют?
Код:
virtual bool	event ( QEvent * event )
virtual void keyPressEvent ( QKeyEvent * event )
virtual void keyReleaseEvent ( QKeyEvent * event )


Название: Re: QEvent
Отправлено: Bepec от Май 22, 2012, 14:40
Сейчас у вас есть просто метод класса StopThread, который у вас в программе не вызывается. Угум?


Название: Re: QEvent
Отправлено: demaker от Май 22, 2012, 14:41
А что значит зарегистрирован ???

Обработчик события это же - метод, которому в качестве параметра передается указатель на объет описывающий событие.


Название: Re: QEvent
Отправлено: mutineer от Май 22, 2012, 14:42
А что значит зарегистрирован ???

Обработчик события это же - метод, которому в качестве параметра передается указатель на объет описывающий событие.

Но система ведь должна как-то узнать что нужно вызывать именно этот метод, а не какой-нить другой. Тебе привели три метода, переопределяешь нужный и он будет вызываться


Название: Re: QEvent
Отправлено: demaker от Май 22, 2012, 14:42
Сейчас у вас есть просто метод класса StopThread, который у вас в программе не вызывается. Угум?

Да


Название: Re: QEvent
Отправлено: demaker от Май 22, 2012, 14:44
А что значит зарегистрирован ???

Обработчик события это же - метод, которому в качестве параметра передается указатель на объет описывающий событие.

Но система ведь должна как-то узнать что нужно вызывать именно этот метод, а не какой-нить другой. Тебе привели три метода, переопределяешь нужный и он будет вызываться

Понял. А так никак нельзя оставить?


Название: Re: QEvent
Отправлено: mutineer от Май 22, 2012, 14:45
Понял. А так никак нельзя оставить?

Так - это не менять код? можно, но работать не будет


Название: Re: QEvent
Отправлено: demaker от Май 22, 2012, 14:47
Ум ???
Я поменял

void TForm::keyPressEvent(QKeyEvent* event)
{
   if( event->key() == Qt::Key_F1)
   {
      m_threadform[0]->thread->quit();
      m_threadform[0]->thread->wait();
      event->accept();

   }   
}

но, что-то тоже не работает


Название: Re: QEvent
Отправлено: demaker от Май 22, 2012, 14:50
Извините :)

Все заработало :)

Спасибо за разъяснения!!!


Название: Re: QEvent
Отправлено: Bepec от Май 22, 2012, 14:51
А счас у вас уже переопределённый метод по поимке злостных клавиш(?).

PS в названии темы припишите [РЕШЕНО]



Название: Re: QEvent
Отправлено: demaker от Май 22, 2012, 15:17
Ок понял.

Еще  вопросик :)

Допустим, я в обработчики событий сделал так

void ThreadForm::keyPressEvent(QKeyEvent* event)
{
   if( event->key() == Qt::Key_Alt)
   {
      thread->quit();
      thread->wait();
      event->accept();
   }
}

и хочу по ресайзу вновь запустить нитку.

Мне надо заново создавать нитку или просто сделать thread->start(); ?

Спасибо!!!


Название: Re: QEvent
Отправлено: Alex_C от Май 22, 2012, 19:59
Нет не верно удалена нить .См. тут:
http://www.prog.org.ru/topic_21982_0.html