不透明区域的QGraphicsItem选择

时间:2018-05-21 20:34:50

标签: qt qt5 qgraphicsitem

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

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

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

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

enter image description here

所需行为 - 钻石周围有虚线。

我该怎么做?

1 个答案:

答案 0 :(得分:1)

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

enter image description here

解决方案是覆盖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中找到。

enter image description here