Как мне использовать QGraphicsScene с макетами и виджетами - PullRequest
8 голосов
/ 24 июня 2009

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

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

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

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

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

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

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

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

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

Ответы [ 2 ]

6 голосов
/ 29 июля 2009

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

QWidget *widget = new QWidget;
QGraphicsScene scene;
QGraphicsProxyWidget *proxy = scene.addWidget(widget);
1 голос
/ 24 июня 2009

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

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

...