我在QGraphicsPixmapItem上设置了这些标志:
setFlag(QGraphicsItem::ItemIsMovable, true)
setFlag(QGraphicsItem::ItemIsSelectable, true);
当我单击并移动项目时,我希望选择虚线仅突出显示项目的不透明区域,而不包括透明背景。
当前行为 - 点击 - 虚线围绕项目的矩形:
所需行为 - 钻石周围有虚线。
我该怎么做?
答案 0 :(得分:1)
以下方法仅在图像具有透明外部部件时才有效,如以下部分所示:
解决方案是覆盖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中找到。