不透明区域上的 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.
中找到
我在 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.
中找到