LINUX.ORG.RU

Пропуск QMouseEvent и QKeyPressEvent через QMdiArea

 , ,


0

1

Для моего проекта мне нужна возможность создавать меньшие окна внутри основного окна. После прочтения документации, я нашел нативную их имплементацию - QMdiSubWindow.

Однако, у меня возникли проблемы с QMdiArea. Для начала, она по умолчанию непрозрачна, однако я легко смог решить это через прозрачную кисть:

subwindowArea->setBackground(QBrush(QColor(0, 0, 0, 0)));

Трудности начались дальше - QMdiArea не пропускает QEvent-ы на нижние виджеты, что в принципе ожидаемо.

Сначала я пробовал задать QMdiArea как центральный виджет с остальным интерфейсом в качестве детей. Не сработало, т.к. вторичные окна стали загружаться под виджетом камеры, блокируясь таким образом из вида.

Затем я ввел QMdiArea атрибут на прозрачность для мыши, однако после этого я уже не смог взаимодействовать (перемещать, закрывать) с тестовым вторичным окном.

subwindowArea->setAttribute( Qt::WA_TransparentForMouseEvents );

Ситуация осложняется еще и тем, что QMdiSubWindow - неполный класс и я не могу создавать его экземпляры или кастовать в него напрямую.

Я хочу узнать, есть ли способ сделать QMdiArea прозрачной для QEvent - ов за исключением того, когда одно из окон в фокусе (кроме того, что при каждом mouseevent-e проверять курсор на расположении в каждом из окон, хотя тут тоже придется извернуться кастуя их к QWidget-у), или какой-либо другой способ создания окон внутри окон в рамках фреймворка Qt.



Последнее исправление: le_poisson (всего исправлений: 2)

Вам что нужно то ? Зачем нужна прозрачность MdiArea ? Чем не хвататет создания mdiarea и перегрузок класса QMdiSubWindow ? Вы что вообще хотите получить ?

QMdiArea не пропускает QEvent-ы на нижние виджеты, что в принципе ожидаемо

Почему ожидаемо ? Если вы создаёте перегруженные подокна, то по идее вы можете в них перехватывать нужные QEvent’ы, а пропускаться они будут только если вы не перегружаете функции обработки событий, обрабатываете не все сценарии или явно игнорируете события из тех функций

AKonia ★★
()
Последнее исправление: AKonia (всего исправлений: 3)
Ответ на: комментарий от AKonia

Мне нужна возможность создавать вторичные окна внутри основного окна поверх других виджетов, чтобы я мог взаимодействовать как с окнами, так и с остальными виджетами (как если бы не было MdiArea, а окна были такими же виджетами как остальные).

le_poisson
() автор топика
Ответ на: комментарий от AKonia

У меня проблема в том, что QEventы не пропускаются даже вне окон и при их отсутствии как таковом, или перегрузка решает проблему даже при отсутствии перегруженных окон в MdiArea?

le_poisson
() автор топика
Ответ на: комментарий от le_poisson

Вы как себе это представляете ? кнопочка без окна в mdiarea а над ним свободно летающее подокно ? Зачем ? Почему не вынести свободные виджеты либо в подокна, либо в главное окно ? Зачем вам вообще mdiarea - вы ведь понимаете, что у него именно задача локализовать внутри приложения работу с окнами независимо от системы ? И это по сути все его задачи. Если вы хотите окна над виджетами, то с ходу приходит две мысли - это заморочиться с QGraphicsScene - которая даёт оочень широкие возможности играть с вещами самого разного характера, в т.ч. что вы предлагаете, но более адекватный путь - создайте честно другие окна - перегрузите QWidget/QDialog и делайте с этими окнами что угодно. Есть конечно третий путь - поиграть с поведением QMdiSubWindow - например создать окно с виджетами подавить(перегрузив ф-ии) его реакции на события и либо переопределив стиль(setStyleSheet()) или аж перегрузив paintEvent(QPaintEvent*)

AKonia ★★
()
Ответ на: комментарий от AKonia

Вы как себе это представляете ? кнопочка без окна в mdiarea а над ним свободно летающее подокно ?

Пока что я представляю это так: есть центральный виджет окна, у него есть множество виджетов детей, начиная от наследника QGraphicsView в самом «низу», потом различные кнопки и прочий интерфейс, а «сверху» MdiArea с подокнами

le_poisson
() автор топика
Ответ на: комментарий от le_poisson

У вас с речью проблемы, я не понимаю, что вы имеете ввиду. QMdiArea - это виджет-вместилище для виджетов-потомков QMdiSubWindow, кому QMdiArea должен перенаправлять события ? Пусть у вас простейшая иерархия:

QMainWindow
{
   QMdiArea $MA
   {
       QMdiSubWindow $MSW1, // MSW* находятся внутри MA
       QMdiSubWindow $MSW2,
       QMdiSubWindow $MSW3,
   }
}

И соответсвенно если вы хотите чтобы кто-то в глубине иерархии(например MSW1) не обрабатывал событие, то вы перегружаете его соответствующий обработчик событий делая event->ignore() внутри обработчика, тогда это событие будет пытаться обрабатывать его родитель, если и он не может, то его родитель и т.д. вплоть до корня и возможного полного пропуска-игнора события.

AKonia ★★
()
Ответ на: комментарий от AKonia

создайте честно другие окна - перегрузите QWidget/QDialog и делайте с этими окнами что угодно.

Ну, если не получится через Mdi, то вероятно придется через show(), да.

заморочиться с QGraphicsScene

Разве там все не отрисовывается на уровне сцены?

le_poisson
() автор топика
Ответ на: комментарий от le_poisson

Вы плохо структурируете мысль - опишите в стиле иерархии наподобии той, что я привёл в прошлом комменте или нарисуйте и приложите картинку. Что значит «сверху» ? Это всмысле геометрически по высоте ? Или вы имеете ввиду «над», потому как если имеете в виду геометрию, то мягко говоря странно начинать снизу окна вверх, т.к. обычно логика сверху-вниз, слева-направо.

AKonia ★★
()
Ответ на: комментарий от le_poisson

Ну, если не получится через Mdi, то вероятно придется через show(), да.

Повторюсь - mdiarea - нужен именно для задач локализации окон в рамках виджета и приложения, давая возможность например структурировать и настраивать их так, как не позволит сделать с обычными окнами система, больше ничего внутри mdiarea делать не предполагается.

Кастательно сцены - если вы хотели подокна, то рисовать их(в сцене) будете сами, можно конечно некоторые вещи автоматом нарисовать, но всё равно возни будет достаточно. Касательно цвета - может не правильно понимаю, но вы думаете, что на вопрос обработки событий влияет цвет ? Или мне показалось ? Потому что обработчикам без различно какой цвет под курсором - они руководствуются реакциями виджетов в рамках предоставленной им геометрии в рамках родителя и вопрос обработки утыкается в то - будет ли перегруженная функция обработки события на него(событие) реагировать или проигнорирует его, перенаправив таким образом его родителю.

AKonia ★★
()
Последнее исправление: AKonia (всего исправлений: 5)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.