Russian Qt Forum
Мая 05, 2025, 07:30
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Вопросы новичков
>
Помогите! Проблема с winId()
Страниц: [
1
]
2
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Помогите! Проблема с winId() (Прочитано 8745 раз)
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 сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...