Russian Qt Forum
Ноябрь 25, 2024, 02:28
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Вопросы новичков
>
Помогите! Проблема с winId()
Страниц: [
1
]
2
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Помогите! Проблема с winId() (Прочитано 8431 раз)
grigory
Гость
Помогите! Проблема с winId()
«
:
Июль 17, 2012, 18:37 »
Здравствуйте уважаемые форумчане. Я в Qt новичок, и уже довольно долго сражаюсь с одной проблемой:
Создаю QMainWindow, где расположены инструменты. Создают дочерний виджет, унаследованный от QWidget. Беру его winId(), и использую как окно, что бы рендерить в этот виджет графику из игрового движка.
Проблема состоит в том, что при левом клике по этому вьюпорту, с игровой графикой, я не просто теряю фокус с инструментов, расположенных отдельно, но и вообще не получаю никаких событий от этого вьюпорта. То есть я даже не могу правой кнопкой вызвать контекстное меню, если кликаю по области вьюпорта, в который выводится графика движка.
Что мне нужно делать? я не нашел подобных тем в интернете, и уже не знаю как быть. Подскажите дорогие!
Записан
Bepec
Гость
Re: Помогите! Проблема с winId()
«
Ответ #1 :
Июль 17, 2012, 20:28 »
Непонятно, зачем вам QMainWindow для вывода графики. А по идее QMainWindow ловит все твои действия. И уже ты в своей программе должен куда-то чего-то кому-то указывать, чтобы вызвать контекстное меню.
Записан
grigory
Гость
Re: Помогите! Проблема с winId()
«
Ответ #2 :
Июль 17, 2012, 21:58 »
QMainWindow я не использую для вывода графики, это главное окно, в котором расположены инструменты, и вьюпорт - QWidget, в который я уже вывожу графику. Никакие события от вьюпорта не приходят, и поэтому я никак не могу работать с ним через qt
Записан
Bepec
Гость
Re: Помогите! Проблема с winId()
«
Ответ #3 :
Июль 17, 2012, 22:49 »
А события от QWidget'а ловить пробовал?
Записан
grigory
Гость
Re: Помогите! Проблема с winId()
«
Ответ #4 :
Июль 17, 2012, 23:04 »
А можешь привести пример перегруженного функции, которая отловит событие? В рамках этого виджета контекстное меню не вызывается.
Записан
Bepec
Гость
Re: Помогите! Проблема с winId()
«
Ответ #5 :
Июль 18, 2012, 00:00 »
Его там и не будет, если ты не поставишь ему контекстное меню
Наследуйся от QWidget, переопредели
http://qt-project.org/doc/qt-4.8/qwidget.html#contextMenuEvent
и будет тебе счастье.
PS можешь ещё про eventFilter почитать.
Записан
kostya2vntu
Гость
Re: Помогите! Проблема с winId()
«
Ответ #6 :
Июль 18, 2012, 01:14 »
Исполльзуй winid() осторожно
http://www.qtforum.org/article/18281/winid-and-find-wid.html?s=109f0cb8c873a71b776b75aa98264f3976f000ab#post70721
P.S. Просто ради информации.
Записан
Bepec
Гость
Re: Помогите! Проблема с winId()
«
Ответ #7 :
Июль 18, 2012, 06:59 »
Константин, не могли бы вы прокомментировать приведённую вами ссылку?
А то я почитал, ничего кроме "возможно", "якобы" и "может быть" не увидел :/
Записан
grigory
Гость
Re: Помогите! Проблема с winId()
«
Ответ #8 :
Июль 18, 2012, 12:19 »
Цитата: Bepec от Июль 18, 2012, 00:00
Его там и не будет, если ты не поставишь ему контекстное меню
Наследуйся от 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
Гость
Re: Помогите! Проблема с winId()
«
Ответ #9 :
Июль 18, 2012, 13:39 »
Уважаемый, у вас меню умирает после прохождения этой процедуры.
Вы хотя бы знаете об "Области видимости переменных"
Записан
grigory
Гость
Re: Помогите! Проблема с winId()
«
Ответ #10 :
Июль 18, 2012, 14:33 »
Цитата: Bepec от Июль 18, 2012, 13:39
Уважаемый, у вас меню умирает после прохождения этой процедуры.
Вы хотя бы знаете об "Области видимости переменных"
Думаю вы ошиблись. Во-первых я знаю что такое область видимости, во-вторых в коде все правильно записано, за исключением того, что Action тоже должен создаваться как локальный объект. Меню умирает после того, как пользователь выбирает один из акшенов, или сбрасываете его кликом по области вне меню. Стоило бы знать это, работая с qt.
Записан
QtCoder
Гость
Re: Помогите! Проблема с winId()
«
Ответ #11 :
Июль 18, 2012, 14:44 »
Цитата: grigory от Июль 18, 2012, 14:33
Цитата: Bepec от Июль 18, 2012, 13:39
Уважаемый, у вас меню умирает после прохождения этой процедуры.
Вы хотя бы знаете об "Области видимости переменных"
Думаю вы ошиблись. Во-первых я знаю что такое область видимости, во-вторых в коде все правильно записано, за исключением того, что Action тоже должен создаваться как локальный объект. Меню умирает после того, как пользователь выбирает один из акшенов, или сбрасываете его кликом по области вне меню. Стоило бы знать это, работая с qt.
Нельзя стековому объекту назначать парента. Объект сдохнет выйдя из области видимости, а потом парент еще попытается его удалить. Будет кирдык.
Меню умирает после выполнения блокирующего вызова exec() - там работает свой цикл обработки сообщений.
Записан
grigory
Гость
Re: Помогите! Проблема с winId()
«
Ответ #12 :
Июль 18, 2012, 15:24 »
Меню умирает после выполнения блокирующего вызова exec() - там работает свой цикл обработки сообщений.
[/quote]
Я не понимаю, какой из этого вывод? подскажите плиз
Записан
kambala
Джедай : наставник для всех
Offline
Сообщений: 4747
Re: Помогите! Проблема с winId()
«
Ответ #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
Гость
Re: Помогите! Проблема с winId()
«
Ответ #14 :
Июль 18, 2012, 16:21 »
Иль ещё более простое решение - меню как поле класса.
Записан
Страниц: [
1
]
2
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...