Russian Qt Forum
Ноябрь 25, 2024, 02:57 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Помогите! Проблема с winId()  (Прочитано 8447 раз)
grigory
Гость
« : Июль 17, 2012, 18:37 »

Здравствуйте уважаемые форумчане. Я в Qt новичок, и уже довольно долго сражаюсь с одной проблемой:
Создаю QMainWindow, где расположены инструменты. Создают дочерний виджет, унаследованный от QWidget. Беру его winId(), и использую как окно, что бы рендерить в этот виджет графику из игрового движка.
Проблема состоит в том, что при левом клике по этому вьюпорту, с игровой графикой, я не просто теряю фокус с инструментов, расположенных отдельно, но и вообще не получаю никаких событий от этого вьюпорта. То есть я даже не могу правой кнопкой вызвать контекстное меню, если кликаю по области вьюпорта, в который выводится графика движка.
Что мне нужно делать? я не нашел подобных тем в интернете, и уже не знаю как быть. Подскажите дорогие!
Записан
Bepec
Гость
« Ответ #1 : Июль 17, 2012, 20:28 »

Непонятно, зачем вам QMainWindow для вывода графики. А по идее QMainWindow ловит все твои действия. И уже ты в своей программе должен куда-то чего-то кому-то указывать, чтобы вызвать контекстное меню.
Записан
grigory
Гость
« Ответ #2 : Июль 17, 2012, 21:58 »

QMainWindow я не использую для вывода графики, это главное окно, в котором расположены инструменты, и вьюпорт - QWidget, в который я уже вывожу графику. Никакие события от вьюпорта не приходят, и поэтому я никак не могу работать с ним через qt
Записан
Bepec
Гость
« Ответ #3 : Июль 17, 2012, 22:49 »

А события от QWidget'а ловить пробовал?

Записан
grigory
Гость
« Ответ #4 : Июль 17, 2012, 23:04 »

А можешь привести пример перегруженного функции, которая отловит событие? В рамках этого виджета контекстное меню не вызывается.
Записан
Bepec
Гость
« Ответ #5 : Июль 18, 2012, 00:00 »

Его там и не будет, если ты не поставишь ему контекстное меню Улыбающийся

Наследуйся от QWidget, переопредели http://qt-project.org/doc/qt-4.8/qwidget.html#contextMenuEvent  и будет тебе счастье.

PS можешь ещё про eventFilter почитать.
Записан
kostya2vntu
Гость
« Ответ #6 : Июль 18, 2012, 01:14 »

Исполльзуй winid() осторожно http://www.qtforum.org/article/18281/winid-and-find-wid.html?s=109f0cb8c873a71b776b75aa98264f3976f000ab#post70721
P.S. Просто ради информации.
Записан
Bepec
Гость
« Ответ #7 : Июль 18, 2012, 06:59 »

Константин, не могли бы вы прокомментировать приведённую вами ссылку?

А то я почитал, ничего кроме "возможно", "якобы" и "может быть" не увидел :/
Записан
grigory
Гость
« Ответ #8 : Июль 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());
   
}
Контекстное меню не вызывается в рамках виджета, только за его пределами! Хотя сначала и вызывается, пока левым кликом не кликнешь по виджету, потом уже не вызывается.
Записан
Bepec
Гость
« Ответ #9 : Июль 18, 2012, 13:39 »

Уважаемый, у вас меню умирает после прохождения этой процедуры.

Вы хотя бы знаете об "Области видимости переменных"Непонимающий
Записан
grigory
Гость
« Ответ #10 : Июль 18, 2012, 14:33 »

Уважаемый, у вас меню умирает после прохождения этой процедуры.
Вы хотя бы знаете об "Области видимости переменных"Непонимающий
Думаю вы ошиблись. Во-первых я знаю что такое область видимости, во-вторых в коде все правильно записано, за исключением того, что Action тоже должен создаваться как локальный объект. Меню умирает после того, как пользователь выбирает один из акшенов, или сбрасываете его кликом по области вне меню. Стоило бы знать это, работая с qt.
Записан
QtCoder
Гость
« Ответ #11 : Июль 18, 2012, 14:44 »

Уважаемый, у вас меню умирает после прохождения этой процедуры.
Вы хотя бы знаете об "Области видимости переменных"Непонимающий
Думаю вы ошиблись. Во-первых я знаю что такое область видимости, во-вторых в коде все правильно записано, за исключением того, что Action тоже должен создаваться как локальный объект. Меню умирает после того, как пользователь выбирает один из акшенов, или сбрасываете его кликом по области вне меню. Стоило бы знать это, работая с qt.


Нельзя стековому объекту назначать парента. Объект сдохнет выйдя из области видимости, а потом парент еще попытается его удалить. Будет кирдык.
Меню умирает после выполнения блокирующего вызова exec() - там работает свой цикл обработки сообщений.
Записан
grigory
Гость
« Ответ #12 : Июль 18, 2012, 15:24 »


Меню умирает после выполнения блокирующего вызова exec() - там работает свой цикл обработки сообщений.
[/quote]
Я не понимаю, какой из этого вывод? подскажите плиз
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #13 : Июль 18, 2012, 16:19 »

простое решение – показывать меню с помощью статического метода QMenu::exec()

а вывод из вышеприведенной цитаты такой, что при вызове exec() метод останавливает своё выполнение и ждёт пока будет выбран пункт меню или отказ от выбора, а только потом метод завершается и уничтожает объект QMenu. но потом, при закрытии виджета-родителя этого меню, программа упадёт, т.к. попытается удалить несуществующий объект.
« Последнее редактирование: Июль 18, 2012, 16:21 от kambala » Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Bepec
Гость
« Ответ #14 : Июль 18, 2012, 16:21 »

Иль ещё более простое решение - меню как поле класса.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.062 секунд. Запросов: 23.