QHeaderView Как узнать ширину ВСЕЙ области заголовка ? |
Здравствуйте, гость ( Вход | Регистрация )
QHeaderView Как узнать ширину ВСЕЙ области заголовка ? |
flankerr |
17.9.2009, 18:32
Сообщение
#11
|
Активный участник Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: 0 |
SABROG, а можно более подробно ?
|
|
|
SABROG |
17.9.2009, 20:54
Сообщение
#12
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
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 |
18.9.2009, 10:49
Сообщение
#13
|
Активный участник Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: 0 |
Предположим пришло событие изменения размера - виджет запускает пересчёт параметров - когда пересчёт закончен то возращемся в цикл обрабоки сообщений - теперь все параметры инициазированы новыми значениями и их можно использовать.
Вот это вроде понятно. Но не совсем ясно что делает QMetaObject::invokeMethod() Если я правильно понял, то я вылавливаю событие изменения размера в нём делаю вызов QMetaObject::invokeMethod() в котором указываю какой надо вызвать метод при возврате в цикл обработки ??? Если так тогда QMetaObject::invokeMethod() аналогичен вызову emit MySignal; ведь сигнал обаботается как раз когда мы вернёмся в цикл обработки. Или я что-то не понял ??? |
|
|
Litkevich Yuriy |
18.9.2009, 11:02
Сообщение
#14
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
в котором указываю какой надо вызвать метод при возврате в цикл обработки ??? угуведь сигнал обаботается как раз когда мы вернёмся в цикл обработки. только в случае если ты его соеденил со слотом с параметром Qt::QueuedConnection. (сам сигнал не обрабатывается, обрабатывается слот, если он присоеденён к сигналу.)
|
|
|
flankerr |
18.9.2009, 11:57
Сообщение
#15
|
Активный участник Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: 0 |
Попробывал - работает.
Но всё таки в чём QMetaObject::invokeMethod(Qt::QueuedConnection) отличается от emit MySignal не совесм понял. Ну могу предположить что слот чеерз QMetaObject::invokeMethod будет вызван раньше чем слот вызванный через emit MySignal ??? |
|
|
Litkevich Yuriy |
18.9.2009, 12:31
Сообщение
#16
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Но всё таки в чём QMetaObject::invokeMethod(Qt::QueuedConnection) отличается от emit MySignal не совесм понял. соединение с сигналом может быть осуществленно не тобой, в общем случае, а другим програмистом. И он может упустить из виду, что необходимо использовать Qt::QueuedConnection - потенциальная проблема. invokeMethod ты вызываешь непосредственно в этом методе, тем самым скрывая тонкости реализации.
|
|
|
flankerr |
18.9.2009, 13:14
Сообщение
#17
|
Активный участник Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: 0 |
Litkevich Yuriy, но в сущности и emit MySignal и invokeMethod добавляют эвент в конец очереди сообщений так ?
|
|
|
Litkevich Yuriy |
18.9.2009, 13:42
Сообщение
#18
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
flankerr |
21.9.2009, 13:39
Сообщение
#19
|
Активный участник Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: 0 |
Litkevich Yuriy, Значит invokeMethod делает вызов слота перед тем как начнёться обрабатываться очередь ?
Не понял "вообще по большому счёту ничего не значит" что тут имелось ввиду ??? |
|
|
Litkevich Yuriy |
21.9.2009, 13:55
Сообщение
#20
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Значит invokeMethod делает вызов слота перед тем как начнёться обрабатываться очередь ? QMetaObject::invokeMethod(Qt::QueuedConnection) - поставит в очередьНе понял "вообще по большому счёту ничего не значит" что тут имелось ввиду ??? emit mySignal - по большому счёту ничего не значит, т.к. если где-то в программе этот сигнал не соединён со слотом, то ничего не произойдёт.
|
|
|
Текстовая версия | Сейчас: 18.12.2024, 19:51 |