Было бы полезно увидеть пример изображения того, что вы просите, но я думаю, что знаю, что это значит.
Лично я просто создал свой собственный класс, унаследованный от 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().
Что делать, если вы реализуете пользовательскую тестовую логику для mouseReleaseEvents в своей сцене? Например, обработайте событие мыши и найдите графический объект ** под ** или ** рядом с ** координатами события. – vahancho