-
Qt и очередь сообщений
Дата: Апрель 24th, 2010 Neill Комментариев нет
[lang_ru]По привычке работы с WinApi возникает необходимость найти заменитель SendMessage, PostMessage, чтобы часть операций менее значимых и более ресурсоемких отложить на период обработки сообщений, а не во время выполнения обработчика прерывания или какого-либо тригера.[/lang_ru]
[lang_en]Out of habit, with WinApi you need to find a substitute for SendMessage, PostMessage in Qt, so that some operations less meaningful and more demanding to defer for a period of message processing, but not during the execution of the interrupt handler, or any triggers.
[/lang_en]
[lang_ru]В Qt свои пользовательские виды события описываются отдельным классом, порожденным от QEvent
1
2
3
4
5
6
7
8
9
10
11class MyEvent
: public QEvent
{
public:
MyEvent()
: QEvent( (QEvent::Type)(QEvent::User + 1) )
{}
private:</div>
// --
};Обработка сообщений осуществляется переопределением метода event в виджете
bool event(QEvent *event);
И пример кода
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21#define MY_EVENT_TYPE (QEvent::User + 1)
bool myWidget::event(QEvent *event)
{
if (event->type() == MY_EVENT_TYPE) {
MyEvent *myEvent = static_cast<MyEvent *>(event);
// custom event handling here
// do something...
return true;
}
return QWidget::event(event);
}Отправка подобных сообщений осуществляется через класс приложения по методу post или send в зависимости от вашей ситуации
1mApp->postEvent( this, new MyEvent() );где mApp – указатель на класс приложения Qt
При этом после обработки память события будет автоматически освобождена.
[/lang_ru]
[lang_en]
In Qt your custom types are described by a separate event class that is based on QEvent
1
2
3
4
5
6
7
8
9
10
11class MyEvent
: public QEvent
{
public:
MyEvent()
: QEvent( (QEvent::Type)(QEvent::User + 1) )
{}
private:</div>
// --
};Processing of messages by overriding the «event» method in the widget
bool event(QEvent *event);
Here is a sample code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21#define MY_EVENT_TYPE (QEvent::User + 1)
bool myWidget::event(QEvent *event)
{
if (event->type() == MY_EVENT_TYPE) {
MyEvent *myEvent = static_cast<MyEvent *>(event);
// custom event handling here
// do something...
return true;
}
return QWidget::event(event);
}Sending these messages via the method of application class by post or send method depending on your situation
1mApp->postEvent( this, new MyEvent() );where mApp – pointer to the application class
In this case, after processing the memory of events will be automatically released.
[/lang_en]
Программирование C++, QtДобавить комментарий


Свежие комментарии