Как мне использовать QGraphicsScene с макетами и виджетами

Я создаю виджет для отображения графических данных в Qt4, и у меня возникло искушение использовать для него QGraphicsScene, создать QGraphicsItem для элементов данных и т. Д.

Однако я хотел добавить некоторый уровень элементов управления (например, полосы прокрутки, масштабирование + другие кнопки - я хочу сделать его в том же стиле, что и, например, Google Maps, то есть данные будут отображаться по всему виджету, а кнопки будут показаны поверх них) в виджет. Поэтому я подумал, что можно было бы добавить их в сцену (возможно, как дочерний элемент QGraphicsGroupItem, который будет отображаться поверх данных). Но я хочу, чтобы они двигались и меняли размер, когда я изменяю размер всего виджета, поэтому я должен использовать QGraphicsLayout для управления ими. Но на данный момент я обнаружил, что все довольно сложно.

Проблема в том, что при использовании QGraphicsLayout выполняются следующие ограничения:

  1. Только QGraphicsWidget может управляться макетом
  2. QGraphicsLayout можно использовать только для управления дочерними элементами QGraphicsWidget

Это означает, что мне придется создать свои элементы управления как QGraphicsWidgets, добавить QGraphicsWidget верхнего уровня к виджету данных и самому управлять размером этого виджета верхнего уровня.

Итак, я хочу спросить:

  1. Разве классический подход (т. Е. Использование простых старых виджетов для всех элементов управления и использование QGraphicsScene только для отображения данных) не был бы более разумным?

  2. Есть ли преимущество в использовании QGraphicsScene в этом случае (производительность или простота ...)?

  3. Как мне использовать QGraphicsScene, чтобы раскрыть его сильные стороны?


person jpalecek    schedule 24.06.2009    source источник


Ответы (2)


Начиная с Qt 4.4, вы можете встраивать классические виджеты в QGraphicsScene, используя QGraphicsProxyWidget:

QWidget *widget = new QWidget;
QGraphicsScene scene;
QGraphicsProxyWidget *proxy = scene.addWidget(widget);
person Luper Rouch    schedule 29.07.2009

Если вы думаете, что QGraphicsScene (или любой другой виджет, который у вас есть) подходит для большей части вашего дисплея, используйте это. То, что мы делали в прошлом для чего-то похожего, - это создать собственный виджет, который наследуется (так или иначе) от QWidget, и поместить управляющие виджеты в макет поверх этого виджета. Это означает, что весь виджет рисует все, что вы хотите нарисовать, а управляющие виджеты находятся поверх этого, изменяя размер по мере изменения размера всего виджета.

В качестве альтернативы, пару раз у нас были макеты, которые были слишком сложными для виджетов макета, чтобы с ними было легко справиться. Вместо того, чтобы создавать настраиваемый макет, мы просто разместили их без макета и переместили их в коде в событии изменения размера. Это работает так же хорошо.

person Caleb Huitt - cjhuitt    schedule 24.06.2009
comment
Самая большая проблема с QGraphicsScene заключается в том, что это НЕ виджет. Это что-то вроде набора элементов (например, прямоугольников, эллипсов ...), которые рисуются автоматически, их можно увеличивать и т. Д. То, что вы описываете, является классическим, простым старым способом виджетов, и я, вероятно, буду придерживаться его. Я хотел использовать блестящую и новую функциональность, но, если подумать, мне это не кажется таким уж блестящим, кроме тех случаев, когда кто-то доказывает, что я ошибаюсь :) - person jpalecek; 25.06.2009
comment
jpalecek: проверьте демонстрацию виджета часов @ qtsoftware.com/developer/pimp- my-widgets-developer-contest .. Ничего особенного в наличии виджета часов, но его реализация выполняется с помощью QGraphics (Scene | Widget | View | Item). - person rasjani; 25.06.2009
comment
@jpalecek: Я не думал, что QGraphicsScene - это виджет, поэтому я сказал так или иначе наследовать. Но у вас есть QGraphicsView (или что-то подобное), верно? Вы, вероятно, захотите поместить свои виджеты поверх этого, если только вы не хотите, чтобы они трансформировались вместе с вашей сценой. Я думаю, что в этом случае старый добрый способ виджетов проще и прямолинейнее. - person Caleb Huitt - cjhuitt; 25.06.2009