powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как в фильтр событий передать свой тип события?
23 сообщений из 23, страница 1 из 1
Как в фильтр событий передать свой тип события?
    #39426977
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Написал класс фильтра событий. Одна загвоздка: метод перехвата в фильтре событий требует, чтобы тип второго параметра был QEvent, иначе он просто не перехватывает событие. А в типе QEvent нет возможности передать сопроводительную информацию.

Я попробовал создать производный класс, наследника от QEvent, (с дополнительными членами) и передавать объекты этого класса. но тогда в обработчике фильтра события нет возможности обратиться к нужным членам (иначе ругается компилятор).

Как выкрутиться?
...
Рейтинг: 0 / 0
Как в фильтр событий передать свой тип события?
    #39426982
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLКак выкрутиться?dynamic_cast спасёт ОРД =))
...
Рейтинг: 0 / 0
Как в фильтр событий передать свой тип события?
    #39426999
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
egorychdynamic_cast спасёт ОРД =))

Можно чуть- чуть подробнее? Что вы имеете в виду?
...
Рейтинг: 0 / 0
Как в фильтр событий передать свой тип события?
    #39427011
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
egorychdynamic_cast спасёт ОРД =))

Спасибо, динамическое приведение типов помогло!
...
Рейтинг: 0 / 0
Как в фильтр событий передать свой тип события?
    #39427203
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLegorychdynamic_cast спасёт ОРД =))

Спасибо, динамическое приведение типов помогло!Убери немедленно!
Если ты работаешь с Qt, то надо использовать qobject_cast. Оно "роднее", не требует RTTI, переносимее, и как ни странно - быстрее чем dynamic_cast.
...
Рейтинг: 0 / 0
Как в фильтр событий передать свой тип события?
    #39427284
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot White Owl]AlekseySQLпропущено...Если ты работаешь с Qt, то надо использовать qobject_cast.есть только одна проблема, QEvent - не наследник от QObject :)
...
Рейтинг: 0 / 0
Как в фильтр событий передать свой тип события?
    #39427286
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorych, сорри, накосячил с квотированием
...
Рейтинг: 0 / 0
Как в фильтр событий передать свой тип события?
    #39427287
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
egorychegorych, сорри, накосячил с квотированием

Пардон, а можно узнать что такое квотирование и как вы с ним накосячили?
...
Рейтинг: 0 / 0
Как в фильтр событий передать свой тип события?
    #39427288
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White OwlУбери немедленно!
Если ты работаешь с Qt, то надо использовать qobject_cast. Оно "роднее", не требует RTTI, переносимее, и как ни странно - быстрее чем dynamic_cast.

Спасибо, изучу вопрос.
...
Рейтинг: 0 / 0
Как в фильтр событий передать свой тип события?
    #39427293
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLПардон, а можно узнать что такое квотирование и как вы с ним накосячили?цитаты нарезал криво из сообщения White Owl 20333260
...
Рейтинг: 0 / 0
Как в фильтр событий передать свой тип события?
    #39427351
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dynamic_cast - вроде-как ключевое слово языка. Должно быть предпочтительнее in general.
...
Рейтинг: 0 / 0
Как в фильтр событий передать свой тип события?
    #39427974
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychесть только одна проблема, QEvent - не наследник от QObject :)Упс... Действительно.

Впрочем, никто не мешает сделать собственное событие унаследованным от QEvent и QObject одновременно.
Код: plaintext
1.
2.
3.
4.
5.
class MyCoolEvent: public QObject, QEvent {
   Q_OBJECT
public:
   ....
};

И получишь всю мощь Кьют-стайл РТТИ :)

Хотя, я вообще сомневаюсь что исходную задачу надо решать. Как-то не могу придумать зачем в фильтре делать собственный класс событий. AlekseySQL, тебе мало QEvent::type = QEvent::UserType+X ?
...
Рейтинг: 0 / 0
Как в фильтр событий передать свой тип события?
    #39427976
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytondynamic_cast - вроде-как ключевое слово языка. Должно быть предпочтительнее in general.Дело то в том, что С++ изначально не имеет RTTI, поэтому при реализации приходится извращаться. Как запихнуть в класс информацию о типе если класс это изначально структура без информации о типе?
Поэтому для стандартного dynamic_cast, компилятору с линкером приходится городить большой и страшный .... даже не знаю как это цензурно назвать... Оно работает, но...

А объектные фреймворки (типа Qt, GTK+, etc) поступают просто, они сразу заявляют: "У нашего языка нету RTTI, поэтому если хотите чтобы ваш класс все-же имел информацию о себе в рантайме - добавьте в свой класс наш макрос." И все собственные RTTI функции фреймворка читают именно информацию сохраненную в кучке полей добавленных макросом. И не требуют извращений от линкера как в случае с dynamic_cast.
...
Рейтинг: 0 / 0
Как в фильтр событий передать свой тип события?
    #39427981
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlА объектные фреймворки (типа Qt, GTK+, etc) поступают просто, они сразу заявляют: "У нашего языка нету RTTI, поэтому если хотите чтобы ваш класс все-же имел информацию о себе в рантайме - добавьте в свой класс наш макрос." И все собственные RTTI функции фреймворка читают именно информацию сохраненную в кучке полей добавленных макросом. И не требуют извращений от линкера как в случае с dynamic_cast.
Можно ссылку где это поподробнее расписано? Не имел дел с объектными фреймворками. Как раз изобретаю свой подобный велосипед. Не помешает познакомиться с реальными решениями. Как тип задать макросом вообще ничего не придумывается.
...
Рейтинг: 0 / 0
Как в фильтр событий передать свой тип события?
    #39427992
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TWhite OwlА объектные фреймворки (типа Qt, GTK+, etc) поступают просто, они сразу заявляют: "У нашего языка нету RTTI, поэтому если хотите чтобы ваш класс все-же имел информацию о себе в рантайме - добавьте в свой класс наш макрос." И все собственные RTTI функции фреймворка читают именно информацию сохраненную в кучке полей добавленных макросом. И не требуют извращений от линкера как в случае с dynamic_cast.
Можно ссылку где это поподробнее расписано? Не имел дел с объектными фреймворками. Как раз изобретаю свой подобный велосипед. Не помешает познакомиться с реальными решениями. Как тип задать макросом вообще ничего не придумывается.Ну пожалуй проще всего будет начать с GTK+, там это все очень даже наглядно происходит когда делаешь свой виджет.
https://www.gtk.org/tutorial1.2/gtk_tut-22.html
И обрати внимание на _get_type() главу.

В Qt реализация для прикладника выглядит намного проще (просто добавь Q_OBJECT), но по сути, там происходит все тоже-самое, хоть и намного более многословно.
...
Рейтинг: 0 / 0
Как в фильтр событий передать свой тип события?
    #39428103
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlВпрочем, никто не мешает сделать собственное событие унаследованным от QEvent и QObject одновременно.
Код: plaintext
1.
2.
3.
4.
5.
class MyCoolEvent: public QObject, QEvent {
   Q_OBJECT
public:
   ....
};

И получишь всю мощь Кьют-стайл РТТИ :)красиво :) жаль, что топикстартеру это не поможет )))
у него QEvent *, он не залезет в qobject_cast, что с наследниками не делай

White OwlХотя, я вообще сомневаюсь что исходную задачу надо решать. Как-то не могу придумать зачем в фильтре делать собственный класс событий. AlekseySQL, тебе мало QEvent::type = QEvent::UserType+X ?вот с этим я согласен. Предполагаю даже, что и события ему не нужны, сигналов со слотами, вероятно, будет достаточно
...
Рейтинг: 0 / 0
Как в фильтр событий передать свой тип события?
    #39428111
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
egorychWhite OwlХотя, я вообще сомневаюсь что исходную задачу надо решать. Как-то не могу придумать зачем в фильтре делать собственный класс событий. AlekseySQL, тебе мало QEvent::type = QEvent::UserType+X ?вот с этим я согласен. Предполагаю даже, что и события ему не нужны, сигналов со слотами, вероятно, будет достаточно

Мне не хватит стандартного QEvent с пользовательскими типами, потому что я передаю информацию из дочерних потоков основному (чтобы юзер радовался тому, как работает обработка). Насколько я понял стандартные события только сообщают, что они произошли: нажата такая-то кнопка, произошел таймаут... Поэтому для наличия дополнительных членов я создал наследника QEvent.

Сигналы и слоты при межпоточном взаимодействии транслируются в события (с созданием лишних объектов через new/delete, что при многопоточной работе очень плохо). Поэтому мое решение более масштабируемо.
...
Рейтинг: 0 / 0
Как в фильтр событий передать свой тип события?
    #39428114
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLСигналы и слоты при межпоточном взаимодействии транслируются в событияоткуда дровишки?
...
Рейтинг: 0 / 0
Как в фильтр событий передать свой тип события?
    #39428160
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Про повышение масштабируемости я конечно загнул. Все- таки изменение масштабируемости подразумевает качественные изменения, а в моем случае изменения всего навсего количественные. К тому же не факт, что при трансформации сигнала в событие будет использовано два и более объекта.

egorychоткуда дровишки?

Шлее М. "Qt 5.3. Профессиональное программирование на C++", примечание на стр 546.
...
Рейтинг: 0 / 0
Как в фильтр событий передать свой тип события?
    #39428331
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLПро повышение масштабируемости я конечно загнул. Все- таки изменение масштабируемости подразумевает качественные изменения, а в моем случае изменения всего навсего количественные. К тому же не факт, что при трансформации сигнала в событие будет использовано два и более объекта.просто ты вместо стандартного для фреймворка механизма изобрёл свой велосипед. Такой же, но с квадратными колёсами )))

AlekseySQLШлее М. "Qt 5.3. Профессиональное программирование на C++", примечание на стр 546.понято, спасибо)
...
Рейтинг: 0 / 0
Как в фильтр событий передать свой тип события?
    #39428640
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLМне не хватит стандартного QEvent с пользовательскими типами, потому что я передаю информацию из дочерних потоков основному (чтобы юзер радовался тому, как работает обработка).И почему вдруг стандартного QEvent не хватает?
Что именно ты передаешь в ГУИ-поток? Процент выполнения задачи дочерним? Или текст что мол дочерний находится на таком-то этапе? Или что-то более сложное?
Первые две задачи решаются элементарно: дочерний поток кидает главному событие которое имеет смысл: "у меня есть обновление". Главный читает shared переменную принадлежащую этой дочке и показывает значение этой переменной юзеру. Все.

AlekseySQLСигналы и слоты при межпоточном взаимодействии транслируются в события (с созданием лишних объектов через new/delete, что при многопоточной работе очень плохо). Поэтому мое решение более масштабируемо.А сколько у тебя этих событий происходит? В секунду? В минуту? Ты уверен что то, что ты отмел как "очень плохо", на самом деле является всего-лишь "не абсолютно идеально"? Не забывай что человек не в состоянии прочитать текст появляющийся на экране на миллисекунду. На практике, даже прогресс-бар надо обновлять не чаще чем три раза в секунду, а тексты желательно не чаще чем раз в две-три секунды. Иначе ты просто зря потратишь ресурсы.
...
Рейтинг: 0 / 0
Как в фильтр событий передать свой тип события?
    #39428684
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White OwlИ почему вдруг стандартного QEvent не хватает?
Что именно ты передаешь в ГУИ-поток? Процент выполнения задачи дочерним? Или текст что мол дочерний находится на таком-то этапе? Или что-то более сложное?
Первые две задачи решаются элементарно: дочерний поток кидает главному событие которое имеет смысл: "у меня есть обновление". Главный читает shared переменную принадлежащую этой дочке и показывает значение этой переменной юзеру. Все.

Дочерних потоков много, поэтому при вашей реализации необходимо создать различные события для каждого потока (нужен какой-то менеджер QEvent ID). Также необходим потокобезопасный вектор с данными QString, в котором будет храниться информация из дочерних потоков.

Не проще ли все трудности многопоточности переложить на потокобезопасный postEvent() от ребят из Qt? В этом случае параллельно посылаемые события уже будут выстроены последовательно в основном потоке, останется их только обрабатывать.

[quot White OwlА сколько у тебя этих событий происходит? В секунду? В минуту? Ты уверен что то, что ты отмел как "очень плохо", на самом деле является всего-лишь "не абсолютно идеально"? Не забывай что человек не в состоянии прочитать текст появляющийся на экране на миллисекунду. На практике, даже прогресс-бар надо обновлять не чаще чем три раза в секунду, а тексты желательно не чаще чем раз в две-три секунды. Иначе ты просто зря потратишь ресурсы.[/quot]

Согласен, код интерактивного взаимодействия с пользователем оптимизировать не нужно. Передача информации юзеру тоже работа с пользователем. А сигналами/слотами можно передать дополнительную информацию? Что-то я такого не встречал (хотя и глубоко этот вопрос не изучал).
...
Рейтинг: 0 / 0
Как в фильтр событий передать свой тип события?
    #39429189
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLА сигналами/слотами можно передать дополнительную информацию? Что-то я такого не встречал (хотя и глубоко этот вопрос не изучал).конечно, ведь слот - это просто функция, в неё можно передавать всё, что тебе угодно ))
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как в фильтр событий передать свой тип события?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]