Модульный виджет редактирования синтезатора Qt4

Я собираюсь начать писать графический интерфейс для модульного приложения синтеза (например, Alsa Modular Synth, Pure Data, Ingen), которое будет использоваться для редактирования патчей (звуков).

Что мне нужно сделать, это что-то вроде этого:

Ingen
(источник: drobilla.net)

Pure Data

hallseymrk1?
(источник: mcgill.ca)

Так что, по сути, это область, где я могу нарисовать несколько прямоугольников (прямоугольников), представляющих модули синтезатора с входными и выходными портами, которые я могу соединить проводами.

Проблема в том, что я не могу понять, как два создают виджет для области редактирования: использование простого контекста 2D-рисования, когда я рисую блоки вручную, кажется единственным логичным способом сделать это, но при этом я теряю все отличное управление событиями, которое qt дает мне.

Мне интересно, есть ли возможность создать собственный макет, который просто берет координаты созданных «блоков» и помещает их на экран, чтобы я реализовал блоки как подклассы QWidget (и повторно использовал систему обработки событий qt), и я добавляю их к окну, как я обычно делаю.

Или, может быть, есть лучший способ?

Спасибо


person 3mpty    schedule 28.09.2009    source источник


Ответы (3)


Взгляните на QGraphicsScene и QGraphicsView. Таким образом, вы сможете создать сцену, наполненную предметами. Каждый элемент может получать события мыши, и вы можете рисовать его вручную.

person alexkr    schedule 28.09.2009

Вы можете создать собственный класс макета, который наследуется от QLayout, и перегрузить функцию add(QWidget* w) координатами.

Лично я использую QGraphicsView и QGraphicsScene. Вы можете обрабатывать некоторые события (например, событие мыши) и легко найти свой QGraphicsItem.

person Patrice Bernassola    schedule 28.09.2009

Посмотрите исходный код Gephex на http://www.gephex.org/download.php.

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

Чао

person Jaromil    schedule 22.06.2010