首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Qt ::QGraphicsPixmapItem :重写paint()方法?

Qt ::QGraphicsPixmapItem :重写paint()方法?
EN

Stack Overflow用户
提问于 2014-02-18 03:36:10
回答 1查看 2.1K关注 0票数 0

我想要覆盖可以显示图像并可以在同一项目上使用QPainter绘图的QGraphicsPixmapItem。

我重写了类和鼠标事件并绘制methods.When,每当我单击按钮时,它成功地调用鼠标和绘制事件,但它不在图像像素图上绘制。

我使用setPixmap函数将图像加载到此item对象,即

代码语言:javascript
运行
复制
QGraphicsSelectionPixmapItem selectionitem;
selectionitem->setPixmap(imagePixmap); 

这是我的重写类:

头文件:qraphicsselectionPixmapitem.h

代码语言:javascript
运行
复制
#ifndef QGRAPHICSSELECTIONPIXMAPITEM_H
#define QGRAPHICSSELECTIONPIXMAPITEM_H
#include <QGraphicsPixmapItem>
#include <QDebug>
#include <QGraphicsSceneMouseEvent>
#include <QList>
#include <QVector>
#include <QPainter>
#include <QPixmap>

class QGraphicsSelectionPixmapItem : public QGraphicsPixmapItem
{
public:
    QGraphicsSelectionPixmapItem(QGraphicsItem *parent = NULL);
    void mouseMoveEvent(QGraphicsSceneMouseEvent *e);
    void mousePressEvent(QGraphicsSceneMouseEvent *e);
    void mouseReleaseEvent(QGraphicsSceneMouseEvent *e);
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
    QList<QPointF> points;
    QVector<QPointF> polyPoints;
    bool mClickflag;
};

#endif // QGRAPHICSSELECTIONPIXMAPITEM_H

cpp文件: qgraphicsselectionpixmapitem.cpp

代码语言:javascript
运行
复制
#include "qgraphicsselectionpixmapitem.h"
QGraphicsSelectionPixmapItem::QGraphicsSelectionPixmapItem(QGraphicsItem *parent): QGraphicsPixmapItem(parent)
{
}

void QGraphicsSelectionPixmapItem::mousePressEvent(QGraphicsSceneMouseEvent *e)
{
    mClickflag = true;
    qDebug()<<e->pos();
    if(e->lastPos()!=e->pos()){
        points.append(e->pos());
        polyPoints<<e->pos();
        update();
    }
}

void QGraphicsSelectionPixmapItem::mouseMoveEvent(QGraphicsSceneMouseEvent *e)
{
}

void QGraphicsSelectionPixmapItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *e)
{
     mClickflag = false;
}

void QGraphicsSelectionPixmapItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    qDebug()<<"in Paint ";
    if(!polyPoints.empty())
    {
        painter->setPen(QPen(QColor(255,0,0),3));
        painter->drawPolyline(polyPoints);
    }
    QGraphicsPixmapItem::paint(painter,option,widget);
}
EN

回答 1

Stack Overflow用户

发布于 2014-02-19 23:27:39

我找到了这个解决方案:使用QPainterPath在QGraphicsItem上存储和绘制任何内容。

在头文件中添加:

代码语言:javascript
运行
复制
QPainterPath m_path;
bool firstClick;

在cpp文件中修改mousePressEvent和paint函数:

代码语言:javascript
运行
复制
QGraphicsSelectionPixmapItem::QGraphicsSelectionPixmapItem(QGraphicsItem *parent): QGraphicsPixmapItem(parent)
{
    firstClick=true;
}

void QGraphicsSelectionPixmapItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    m_path.setFillRule(Qt::WindingFill);
    if(firstClick)
    {
        m_path.moveTo(event->pos());
        firstClick=false;
    }
    else
        m_path.lineTo(event->pos());
    update();
}

void QGraphicsSelectionPixmapItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
    update();
}

void QGraphicsSelectionPixmapItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{

}

void QGraphicsSelectionPixmapItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    QGraphicsPixmapItem::paint(painter,option,widget);
    if(m_path.isEmpty())
        return;

    QPen pen(QColor(255,0,0));
    pen.setWidth(1);
    painter->setPen(pen);
    painter->setRenderHint(QPainter::Antialiasing);
    painter->setBrush(QColor(255,0,0,100));
    painter->drawPath(m_path);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21837818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档