不透明区域上的 QGraphicsItem 选择

QGraphicsItem selection on opaque area

我在 QGraphicsPixmapItem 上设置了这些标志:

setFlag(QGraphicsItem::ItemIsMovable, true)
setFlag(QGraphicsItem::ItemIsSelectable, true);

当我单击并移动项目时,我希望选择虚线仅突出显示项目的不透明区域,而不包括透明背景。

当前行为 - 单击时 - 虚线围绕矩形中的项目:

期望的行为 - 菱形周围有虚线。

我该怎么做?

以下方法仅在图像具有透明外部部分时有效,如以下部分所示:

解决方法是覆盖paint()方法,绘制shape().

#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsPixmapItem>
#include <QStyleOptionGraphicsItem>

class GraphicsPixmapItem: public QGraphicsPixmapItem{
public:
    GraphicsPixmapItem(const QPixmap & pixmap, QGraphicsItem * parent = 0): QGraphicsPixmapItem(pixmap, parent){
        setFlag(QGraphicsItem::ItemIsMovable, true);
        setFlag(QGraphicsItem::ItemIsSelectable, true);
    }
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *){
        painter->setRenderHint(QPainter::SmoothPixmapTransform, (transformationMode() == Qt::SmoothTransformation));
        painter->drawPixmap(offset(), pixmap());
        if (option->state & QStyle::State_Selected){
            painter->setPen(QPen(option->palette.windowText(), 0, Qt::DashLine));
            painter->setBrush(Qt::NoBrush);
            painter->drawPath(shape());
        }
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QGraphicsView w;
    QGraphicsScene scene;
    GraphicsPixmapItem *item = new GraphicsPixmapItem(QPixmap(":/image.png"));
    scene.addItem(item);
    w.setScene(&scene);
    w.show();

    return a.exec();
}

完整的例子可以在下面link.

中找到