c++ - 覆盖 QGraphicsItem 的 paint() 和 mouseEvents()

标签 c++ qt

在 Qt 中,我试图在单击某个项目时突出显示该项目,然后从其末端到当前光标位置画一条线。我可以突出显示它或画线,但不能两者兼而有之。这是我的类(class):

// ucPin.h 
#pragma once
#include "stdafx.h"

class ucPin : public QGraphicsLineItem{
    qreal x1, y1, x2, y2;
    bool isClicked;
    QGraphicsLineItem * li;
public : 

    ucPin (qreal x1, qreal y1, qreal x2, qreal y2, QGraphicsItem *parent = 0);

    void paint ( QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget );
    void mousePressEvent    (QGraphicsSceneMouseEvent * event);
    void mouseReleaseEvent  (QGraphicsSceneMouseEvent *event);
    void mouseMoveEvent     (QGraphicsSceneMouseEvent *event);

};

// ucPin.cpp
    #include "ucPin.h"

ucPin::ucPin (qreal x1, qreal y1, qreal x2, qreal y2, QGraphicsItem *parent) : 
        QGraphicsLineItem(x1, y1, x2, y2, parent){
        this->x1 = x1; this->y1 = y1; this->x2 = x2; this->y2 = y2;
        this->setFlags(QGraphicsItem::ItemIsFocusable
                | QGraphicsItem::ItemIsSelectable);

        isClicked = false;
        li = NULL;
    }

void ucPin::paint ( QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget )
{  

    QStyleOptionGraphicsItem newOption  (*option);
    newOption.state =QStyle::State_None;
    QGraphicsLineItem::paint(painter, &newOption, widget);

    //painter-> setRenderHint(QPainter::Antialiasing);


    if (option->state & QStyle::State_Selected) {
        QPen outline;
        outline.setColor(Qt::green);
        outline.setWidth(6);
        setPen(outline);
    }
    else{
        QPen outline; outline.setWidth(3);
        setPen(outline);
    }
}

void ucPin::mousePressEvent(QGraphicsSceneMouseEvent* event) {
    /*QPointF pos = event->pos();

    QGraphicsLineItem * li = new QGraphicsLineItem(0,0, pos.x(), pos.y(), this);*/
    isClicked = true;
}

void ucPin::mouseReleaseEvent(QGraphicsSceneMouseEvent* event) {
    isClicked = false;
}

void ucPin::mouseMoveEvent(QGraphicsSceneMouseEvent* event) {
    if(NULL != li)  { delete li; li = NULL;}

    li = new QGraphicsLineItem(0,0, event->pos().x(), event->pos().y(), this);

}

我想在实现 mouseEvent 覆盖时,不会调用选定状态的绘制事件?如何解决这个问题?

最佳答案

为了请求重新绘制您的QGraphicsItem,您需要在外观发生变化时调用update()setSelected 在 QGraphicsItem::mousePressEvent 中被调用,因此您需要将它传播到基类调用 QGraphicsLineItem::mousePressEvent(event) 在您的覆盖 mousePressEventmouseReleaseEvent 也是如此。或者您可以自己处理选择状态,但除非有充分的理由,否则您不应该这样做。另外,我认为在调用 QGraphicsLineItem::paint(...) 之前设置笔可能是有意义的。

此外,每次鼠标移动时都分配一个新的 li 是低效的 - 只需分配一次并使用 setLine 设置新坐标。

关于c++ - 覆盖 QGraphicsItem 的 paint() 和 mouseEvents(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33127558/

相关文章:

c++ - 哪个类可以在 c++ 中用于替换 java 中的 streamtokenizer?

c++ - sprintf - 字符串前有 4 个无用的 ascii 字符

c++ - 使用 Qt 的两个按钮和一个标签之间的基本交互

qt - Clion 不会索引自动生成的 ui 头文件

c++ - 为什么在构造函数中发出信号不起作用?

qt - Qml QtQuickControls2,在运行时更改样式属性

c++ - 比较 vector 中 vector 的大小以获得最大的

c++ - QT 线程问题...有些东西正在拖延 GUI 响应

c++ - 在 Linux 中执行 C++ makefile 时遇到问题(在 mac 上工作正常)

c++ - 关于数组类型的问题