Russian Qt Forum
Ноябрь 22, 2024, 23:11
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Пользовательский интерфейс (GUI)
>
Прием пользовательских сообщений
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Прием пользовательских сообщений (Прочитано 8227 раз)
skaz54
Новичок
Offline
Сообщений: 14
Прием пользовательских сообщений
«
:
Апрель 17, 2011, 13:30 »
Здравствуйте.
Программа на С++ с использованием QT 4.7. Пока работает под Windows.
В программе я вызываю библиотечную функцию, в которую в качестве параметра передаю дескриптор окна.
При работе библиотечная функция посылает этому окну пользовательское сообщение.
Каким образом я могу принять это сообщение в окне и обработать его?
Использование Event и customEvent в окне, которое должно принять сообщение, успеха не принесло.
Спасибо.
Записан
blood_shadow
Гость
Re: Прием пользовательских сообщений
«
Ответ #1 :
Апрель 17, 2011, 14:16 »
Цитата: skaz54 от Апрель 17, 2011, 13:30
Здравствуйте.
Программа на С++ с использованием QT 4.7. Пока работает под Windows.
В программе я вызываю библиотечную функцию, в которую в качестве параметра передаю дескриптор окна.
При работе библиотечная функция посылает этому окну пользовательское сообщение.
Каким образом я могу принять это сообщение в окне и обработать его?
Использование Event и customEvent в окне, которое должно принять сообщение, успеха не принесло.
Спасибо.
installEventFilter() для окна пробовал?
Записан
skaz54
Новичок
Offline
Сообщений: 14
Re: Прием пользовательских сообщений
«
Ответ #2 :
Апрель 17, 2011, 17:18 »
Сейчас попробовал.
Эффекта нет.
Записан
blood_shadow
Гость
Re: Прием пользовательских сообщений
«
Ответ #3 :
Апрель 17, 2011, 17:19 »
Цитата: skaz54 от Апрель 17, 2011, 17:18
Сейчас попробовал.
Эффекта нет.
тогда код в студию
Записан
skaz54
Новичок
Offline
Сообщений: 14
Re: Прием пользовательских сообщений
«
Ответ #4 :
Апрель 17, 2011, 18:49 »
Вот код:
Сначала заголовочный файл:
..............................................................
class hwnMessage : public QObject
{
Q_OBJECT
protected:
bool eventFilter(QObject *obj, QEvent *event);
};
class dlg_AtlasCre : public QDialog
{
Q_OBJECT
public:
explicit dlg_AtlasCre(QWidget *parent = 0);
~dlg_AtlasCre();
bool event(QEvent * event);
void customevent(QEvent * event);
public slots:
void close();
void CreateClick();
void HelpClick();
void UpdateBtns();
private:
xmlMapsDB * MapsDB;
QLabel * Label1;
QTableWidget * Regions;
QLabel * Label2;
QTableWidget * WorkArea;
QPushButton * CreateBtn;
QPushButton * HelpBtn;
QPushButton * CloseBtn;
QLineEdit * LE;
QProgressBar * PB;
QFileInfoList listSxf;
void closeEvent(QCloseEvent *event);
};
#endif // DLG_ATLASCRE_H
Теперь реализация в части касающейся:
dlg_AtlasCre::dlg_AtlasCre(QWidget *parent) : QDialog(parent)
{
.......................................................
//Это регистрация пользовательского сообщения 0х585
int n1413 = QEvent::registerEventType(1413);
qDebug() << "13=" <<n1413;
//установка фильтра
hwnMessage * hw = new hwnMessage();
this->installEventFilter(hw);
........................................................................
}
//фильтр сообщений
bool hwnMessage::eventFilter(QObject *obj, QEvent *event)
{
qDebug() << "hwnMessage::eventFilter" << event->type();
return QObject::eventFilter(obj, event);
}
//прием своих сообщений
bool dlg_AtlasCre::event(QEvent * event)
{
qDebug() << "event=" << event->type();
QDialog::event(event);
}
//прием своих сообщений
void dlg_AtlasCre::customevent(QEvent * event)
{
qDebug() << "customevent=" << event->type();
dlg_AtlasCre::customevent(event);
}
void dlg_AtlasCre::CreateClick()
{
............................................
//вызов функции из библиотеки, в качестве одного из параметров передаю дескриптор этого окна
//в процессе работы функции она шлет сообщения с идентификатором 0х585 в окно с переданным дескриптором
qDebug() << "winId =" << this->winId();
long int res = LoadDirToMap(str1.constData(), str2.constData(), (long int)this->winId());// (MSGHANDLER)MessageHandler_LoadDir);
.........................................................
}
в customEvent сообщения вообще не приходят
в event и в фильтр сообщения приходят, но не то которое нужно
Далее - отладочная информация на консоли
winId = 0x53039c - идентификатор окна
hwnMessage::eventFilter 68
event= 68
hwnMessage::eventFilter 71
event= 71
hwnMessage::eventFilter 71
event= 71
hwnMessage::eventFilter 71
event= 71
hwnMessage::eventFilter 71
event= 71
hwnMessage::eventFilter 67
event= 67
hwnMessage::eventFilter 77
event= 77
hwnMessage::eventFilter 12
event= 12
hwnMessage::eventFilter 173
event= 173
hwnMessage::eventFilter 10
event= 10
hwnMessage::eventFilter 77
event= 77
hwnMessage::eventFilter 12
event= 12
hwnMessage::eventFilter 11
event= 11
hwnMessage::eventFilter 173
event= 173
hwnMessage::eventFilter 77
event= 77
hwnMessage::eventFilter 12
event= 12
hwnMessage::eventFilter 25
event= 25
hwnMessage::eventFilter 99
event= 99
hwnMessage::eventFilter 77
event= 77
hwnMessage::eventFilter 12
event= 12
hwnMessage::eventFilter 12
event= 12
Отправку сообщений и идентификатор окна проверил с помощью SpyXX - все соответсвует
Записан
blood_shadow
Гость
Re: Прием пользовательских сообщений
«
Ответ #5 :
Апрель 17, 2011, 19:50 »
а не проще иммитировать сигнал с заданным сообщением в LoadDirToMap
и его подключить к слоту окна в котором осуществлять обработку этого сообщения?
Записан
skaz54
Новичок
Offline
Сообщений: 14
Re: Прием пользовательских сообщений
«
Ответ #6 :
Апрель 17, 2011, 21:29 »
Нет.
Эта функция из библиотеки стороннего разработчика.
Поэтому ее функционал надо принимать так как есть.
Вообще-то, как мне думается, это должен быть стандартным вопросом для Windows.
В Windows все основано на передаче и приеме сообщений от мыши, клавиатуры, другого окна и т.д.
Qt при работе в Windows должна принимать и передавать эти сообщения сообщения.
Как мне кажется, для отправки сообщения можно использовать функции sendEvent и postEvent.
А где они принимаются?
Я в Qt новичок., поэтому этот вопрос.
Записан
blood_shadow
Гость
Re: Прием пользовательских сообщений
«
Ответ #7 :
Апрель 17, 2011, 21:51 »
честно говоря сам такого ниразу не делал, нарыл в ассистанте ф-ции:
bool QCoreApplication::sendEvent ( QObject * receiver, QEvent * event ) и
void QCoreApplication::postEvent ( QObject * receiver, QEvent * event )
посмотри их может это то что тебе нужно
Записан
Drafter
Гость
Re: Прием пользовательских сообщений
«
Ответ #8 :
Апрель 18, 2011, 11:03 »
Все правильно, следует использовать postEvent или sendEvent (желательно сделать свой класс сообщения, унаследовавшись от QEvent).
А принимать сообщения логичней всего в виртуальном методе окна-получателя: customEvent(QEvent *event).
P.S. Обратите внимание, в коде, который Вы привели, customevent - написано маленькими буквами, т.е. Вы создали свой метод, вместо того, чтобы перегрузить виртуальный customEvent. Видимо, поэтому туда ничего и не приходит (кстати, у Вас в этой функции - бесконечная рекурсия запускается ко всему прочему
).
P.P.S. Вообще же, учитывая специфику Вашей задачи, лучше всего смотреть в сторону:
bool QWidget::winEvent (MSG* message, long* result); [virtual]
bool QCoreApplication::winEventFilter ( MSG* msg, long* result); [virtual]
Правда, работать они будут - исключительно под Windows.
«
Последнее редактирование: Апрель 18, 2011, 12:00 от Drafter
»
Записан
skaz54
Новичок
Offline
Сообщений: 14
Re: Прием пользовательских сообщений
«
Ответ #9 :
Апрель 18, 2011, 12:59 »
Большое спасибо Drafter.
Именно то, что мне и надо.
Использую функцию
bool QWidget::winEvent ( MSG * message, long * result ) [virtual protected]
Все замечания по тексту так же оказались правильные.
Еще раз спасибо.
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...