2013-09-23 5 views
3

У меня есть какая-то гистограмма, нарисованная с помощью QGraphicsRectItem; некоторые из этих прямоугольников длинны, некоторые короткие. Хотя нет необходимости выбирать длинный прямоугольник, у него могут возникнуть трудности с короткими.Есть ли способ указать область выделения для QGraphicsItem?

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

Помимо прямоугольников, я также рисую текст на той же линии. Было бы полезно сгруппировать их как-то и написать mousePressEvent для группы?

Спасибо!

+0

Что делать, если вы реализуете пользовательскую тестовую логику для mouseReleaseEvents в своей сцене? Например, обработайте событие мыши и найдите графический объект ** под ** или ** рядом с ** координатами события. – vahancho

ответ

3

Было бы полезно увидеть пример изображения того, что вы просите, но я думаю, что знаю, что это значит.

Лично я просто создал свой собственный класс, унаследованный от QGraphicsItem (или QGraphicsObject, если вам нужны сигналы и слоты). Этот класс может затем предоставить boundingRect() всей области, которую вы хотите отобразить область, которая будет выбрана, но функция paint() отображает только видимую часть панели. Что-то вроде этого: -

class Bar: public QGraphicsItem 
{ 
    Q_OBJECT 

    public: 
     Bar(int x, int y, int width, int height, int visibleBarHeight); 

     // returns the area of the object 
     QRectF boundingRect() const; 

     void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = 0); 
}; 

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

Что касается текста, вы можете либо добавить его в качестве ребенка к этому объекту, либо передать его родительскому элементу, когда он будет выбран, либо расширить ограничивающий класс этого класса и отобразить его в функции рисования.

Обратите внимание, что boundingRect - это область, представленная объектом, в локальных координатах. Если у вас есть объект, который не определен прямоугольником, вам также нужно реализовать функцию shape(). По умолчанию shape() вызывает boundingRect().

+0

Спасибо! Это то, что я искал! – msgmaxim

+0

Ну, на самом деле, это не решает проблему. С boundingRect я могу сделать выделенную область меньшей, но не наоборот. Явно его не может быть больше фактического размера предмета. Думаю, я попытаюсь уйти с невидимыми прямоугольниками ... – msgmaxim

+0

Это звучит не так; boundingRect определяет область объекта, поэтому независимо от того, что это такое, это объект, если вы также не реализуете функцию shape(). Вы должны убедиться, что вы не выходите за пределы boundingRect, иначе вы начнете видеть графические проблемы и проблемы с выбором объектов. Вы можете, однако, нарисовать где-нибудь внутри boundingRect и не заполнять его. – TheDarkKnight

Смежные вопросы