Название: Помогите! Проблема с winId() Отправлено: grigory от Июль 17, 2012, 18:37 Здравствуйте уважаемые форумчане. Я в Qt новичок, и уже довольно долго сражаюсь с одной проблемой:
Создаю QMainWindow, где расположены инструменты. Создают дочерний виджет, унаследованный от QWidget. Беру его winId(), и использую как окно, что бы рендерить в этот виджет графику из игрового движка. Проблема состоит в том, что при левом клике по этому вьюпорту, с игровой графикой, я не просто теряю фокус с инструментов, расположенных отдельно, но и вообще не получаю никаких событий от этого вьюпорта. То есть я даже не могу правой кнопкой вызвать контекстное меню, если кликаю по области вьюпорта, в который выводится графика движка. Что мне нужно делать? я не нашел подобных тем в интернете, и уже не знаю как быть. Подскажите дорогие! Название: Re: Помогите! Проблема с winId() Отправлено: Bepec от Июль 17, 2012, 20:28 Непонятно, зачем вам QMainWindow для вывода графики. А по идее QMainWindow ловит все твои действия. И уже ты в своей программе должен куда-то чего-то кому-то указывать, чтобы вызвать контекстное меню.
Название: Re: Помогите! Проблема с winId() Отправлено: grigory от Июль 17, 2012, 21:58 QMainWindow я не использую для вывода графики, это главное окно, в котором расположены инструменты, и вьюпорт - QWidget, в который я уже вывожу графику. Никакие события от вьюпорта не приходят, и поэтому я никак не могу работать с ним через qt
Название: Re: Помогите! Проблема с winId() Отправлено: Bepec от Июль 17, 2012, 22:49 А события от QWidget'а ловить пробовал?
Название: Re: Помогите! Проблема с winId() Отправлено: grigory от Июль 17, 2012, 23:04 А можешь привести пример перегруженного функции, которая отловит событие? В рамках этого виджета контекстное меню не вызывается.
Название: Re: Помогите! Проблема с winId() Отправлено: Bepec от Июль 18, 2012, 00:00 Его там и не будет, если ты не поставишь ему контекстное меню :)
Наследуйся от QWidget, переопредели http://qt-project.org/doc/qt-4.8/qwidget.html#contextMenuEvent и будет тебе счастье. PS можешь ещё про eventFilter почитать. Название: Re: Помогите! Проблема с winId() Отправлено: kostya2vntu от Июль 18, 2012, 01:14 Исполльзуй winid() осторожно http://www.qtforum.org/article/18281/winid-and-find-wid.html?s=109f0cb8c873a71b776b75aa98264f3976f000ab#post70721
P.S. Просто ради информации. Название: Re: Помогите! Проблема с winId() Отправлено: Bepec от Июль 18, 2012, 06:59 Константин, не могли бы вы прокомментировать приведённую вами ссылку?
А то я почитал, ничего кроме "возможно", "якобы" и "может быть" не увидел :/ Название: Re: Помогите! Проблема с winId() Отправлено: grigory от Июль 18, 2012, 12:19 Его там и не будет, если ты не поставишь ему контекстное меню :) У меня это событие уже было переопределено:Наследуйся от QWidget, переопредели http://qt-project.org/doc/qt-4.8/qwidget.html#contextMenuEvent и будет тебе счастье. PS можешь ещё про eventFilter почитать. void contextMenuEvent(QContextMenuEvent *event) { QMenu menuRight(this); actionNew = new QAction(tr("Do Something New"), this); menuRight.addAction(actionNew); menuRight.exec(event->globalPos()); } Контекстное меню не вызывается в рамках виджета, только за его пределами! Хотя сначала и вызывается, пока левым кликом не кликнешь по виджету, потом уже не вызывается. Название: Re: Помогите! Проблема с winId() Отправлено: Bepec от Июль 18, 2012, 13:39 Уважаемый, у вас меню умирает после прохождения этой процедуры.
Вы хотя бы знаете об "Области видимости переменных"??? Название: Re: Помогите! Проблема с winId() Отправлено: grigory от Июль 18, 2012, 14:33 Уважаемый, у вас меню умирает после прохождения этой процедуры. Думаю вы ошиблись. Во-первых я знаю что такое область видимости, во-вторых в коде все правильно записано, за исключением того, что Action тоже должен создаваться как локальный объект. Меню умирает после того, как пользователь выбирает один из акшенов, или сбрасываете его кликом по области вне меню. Стоило бы знать это, работая с qt. Вы хотя бы знаете об "Области видимости переменных"??? Название: Re: Помогите! Проблема с winId() Отправлено: QtCoder от Июль 18, 2012, 14:44 Уважаемый, у вас меню умирает после прохождения этой процедуры. Думаю вы ошиблись. Во-первых я знаю что такое область видимости, во-вторых в коде все правильно записано, за исключением того, что Action тоже должен создаваться как локальный объект. Меню умирает после того, как пользователь выбирает один из акшенов, или сбрасываете его кликом по области вне меню. Стоило бы знать это, работая с qt. Вы хотя бы знаете об "Области видимости переменных"??? Нельзя стековому объекту назначать парента. Объект сдохнет выйдя из области видимости, а потом парент еще попытается его удалить. Будет кирдык. Меню умирает после выполнения блокирующего вызова exec() - там работает свой цикл обработки сообщений. Название: Re: Помогите! Проблема с winId() Отправлено: grigory от Июль 18, 2012, 15:24 Меню умирает после выполнения блокирующего вызова exec() - там работает свой цикл обработки сообщений. [/quote] Я не понимаю, какой из этого вывод? подскажите плиз Название: Re: Помогите! Проблема с winId() Отправлено: kambala от Июль 18, 2012, 16:19 простое решение – показывать меню с помощью статического метода QMenu::exec()
а вывод из вышеприведенной цитаты такой, что при вызове exec() метод останавливает своё выполнение и ждёт пока будет выбран пункт меню или отказ от выбора, а только потом метод завершается и уничтожает объект QMenu. но потом, при закрытии виджета-родителя этого меню, программа упадёт, т.к. попытается удалить несуществующий объект. Название: Re: Помогите! Проблема с winId() Отправлено: Bepec от Июль 18, 2012, 16:21 Иль ещё более простое решение - меню как поле класса.
Название: Re: Помогите! Проблема с winId() Отправлено: grigory от Июль 18, 2012, 16:28 kambala спасибо, но мне это не помогает никак в решении основной проблемы: у меня контекстное меню не вызывается в рамках виджета, потому что все события оттуда/туда не доходят. Использование меню как поля класса, или вызов статической функции как вы указали - с этим никак не связано. Контекстное меню вызывается вне пределов виджета, но при фокусе на виджете левым кликом мыши, контекстное меню уже не вызывается на виджете.
Название: Re: Помогите! Проблема с winId() Отправлено: Bepec от Июль 18, 2012, 16:40 Походу ты что-то не то вообще творишь :)
За пределами виджета меню вызываться не должно, ибо contextMenuEvent вызывается только при вызове меню в области виджета. Если оно вызывается за пределами виджета - видимо ты переопределил хзчто хзгде и творишь хзчто. PS Напомнило - я всё правильно делаю! А что ты делаешь? Незнаю, но ПРАВИЛЬНО! :D Название: Re: Помогите! Проблема с winId() Отправлено: grigory от Июль 18, 2012, 17:13 Извиняюсь, за пределами виджета вызывается другое контекстное меню. А вот в рамках виджета, переопределенное контекстное меню вызывается только при условии, если виджет не взят в фокусе. Я вообще не знаю за какой край браться, что бы решить эту проблему. Думаю все дело в том, что в этот виджет выводится графика движка.
|