![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
flankerr |
![]()
Сообщение
#11
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: ![]() ![]() ![]() |
SABROG, а можно более подробно ?
|
|
|
SABROG |
![]()
Сообщение
#12
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
SABROG, а можно более подробно ? Предыстория такова. Обычно для инициализации некоторых данных используется конструктор виджета, в то время как сам виджет еще не показывается на экране, он еще не создан, у него нет каких-то валидных размеров, валидных координат, еще не сработали компановщики, которые меняют как положение виджета, так и его размер. Поэтому нам необходимо выполнить некоторый метод уже после того, как виджет выполнит все действия по инициализации и будет готов к работе с пользователем. Обычно возвращение в цикл событий или запуск цикла событий говорит о том, что всё готово к работе и можно всё потрогать. Поэтому у нас только один вариант - дождаться цикла событий и выполнить нужный нам метод. Сделать это можно - поставив в очередь выполнение слота. Варианта 2: QTimer::singleShot() или QMetaObject::invokeMethod() с параметром Qt::QueuedConnection. Не знаю почему, но тролли предпочитают именно QMetaObject::invokeMethod() в таких приложениях как: /examples/dbus/pingpong /examples/dbus/remotecontrolledcar /examples/network/torrent /examples/xmlpatterns /demos/browser /demos/sqlbrowser /tools/assistant /tools/designer |
|
|
flankerr |
![]() ![]()
Сообщение
#13
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: ![]() ![]() ![]() |
Предположим пришло событие изменения размера - виджет запускает пересчёт параметров - когда пересчёт закончен то возращемся в цикл обрабоки сообщений - теперь все параметры инициазированы новыми значениями и их можно использовать.
Вот это вроде понятно. Но не совсем ясно что делает QMetaObject::invokeMethod() Если я правильно понял, то я вылавливаю событие изменения размера в нём делаю вызов QMetaObject::invokeMethod() в котором указываю какой надо вызвать метод при возврате в цикл обработки ??? Если так тогда QMetaObject::invokeMethod() аналогичен вызову emit MySignal; ведь сигнал обаботается как раз когда мы вернёмся в цикл обработки. Или я что-то не понял ??? |
|
|
Litkevich Yuriy |
![]()
Сообщение
#14
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
в котором указываю какой надо вызвать метод при возврате в цикл обработки ??? угуведь сигнал обаботается как раз когда мы вернёмся в цикл обработки. только в случае если ты его соеденил со слотом с параметром Qt::QueuedConnection. (сам сигнал не обрабатывается, обрабатывается слот, если он присоеденён к сигналу.)
|
|
|
flankerr |
![]() ![]()
Сообщение
#15
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: ![]() ![]() ![]() |
Попробывал - работает.
Но всё таки в чём QMetaObject::invokeMethod(Qt::QueuedConnection) отличается от emit MySignal не совесм понял. Ну могу предположить что слот чеерз QMetaObject::invokeMethod будет вызван раньше чем слот вызванный через emit MySignal ??? |
|
|
Litkevich Yuriy |
![]()
Сообщение
#16
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Но всё таки в чём QMetaObject::invokeMethod(Qt::QueuedConnection) отличается от emit MySignal не совесм понял. соединение с сигналом может быть осуществленно не тобой, в общем случае, а другим програмистом. И он может упустить из виду, что необходимо использовать Qt::QueuedConnection - потенциальная проблема. invokeMethod ты вызываешь непосредственно в этом методе, тем самым скрывая тонкости реализации.
|
|
|
flankerr |
![]()
Сообщение
#17
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: ![]() ![]() ![]() |
Litkevich Yuriy, но в сущности и emit MySignal и invokeMethod добавляют эвент в конец очереди сообщений так ?
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#18
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
flankerr |
![]()
Сообщение
#19
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: ![]() ![]() ![]() |
Litkevich Yuriy, Значит invokeMethod делает вызов слота перед тем как начнёться обрабатываться очередь ?
Не понял "вообще по большому счёту ничего не значит" что тут имелось ввиду ??? |
|
|
Litkevich Yuriy |
![]()
Сообщение
#20
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Значит invokeMethod делает вызов слота перед тем как начнёться обрабатываться очередь ? QMetaObject::invokeMethod(Qt::QueuedConnection) - поставит в очередьНе понял "вообще по большому счёту ничего не значит" что тут имелось ввиду ??? emit mySignal - по большому счёту ничего не значит, т.к. если где-то в программе этот сигнал не соединён со слотом, то ничего не произойдёт.
|
|
|
![]() ![]() ![]() |
![]() |
Текстовая версия | Сейчас: 11.3.2025, 8:47 |