qt利用绘图事件绘制一条直线后,如何创建一个按钮,使点击按钮后直线可以改变颜色?

qt利用绘图事件绘制一条直线后,如何创建一个按钮,使点击按钮后直线可以改变颜色?

测试OK,

UI界面

main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

myline.h

/****************************************************************************
** @brief       line类
** @author      xiaodongLi
** @date        create:2018-09-28
** @example
****************************************************************************/

#ifndef MYLINE_H
#define MYLINE_H


#include <QObject>
#include <QPainter>
#include <QStyleOptionGraphicsItem>
#include <QGraphicsItem>

class MyLine :  public QObject,public QGraphicsItem
{
    Q_OBJECT
public:

    /**
     * @brief       构造函数
     * @param       对line的一些属性进行设置
     * @param       p1 p2 起点和终点 bEdit控制该line是否是可编辑的(起点终点可更改),penWidth penColor画笔的属性
     */
    explicit MyLine(QGraphicsItem *parent = Q_NULLPTR);

    /**
     * @brief       设置线的起点和终点
     * @param       p1 p2 起点和终点
     */
    void setLine(QPointF p1,QPointF p2);

    /**
     * @brief       设置画笔宽度
     */
    void setPenWidth(qreal penWidth);

    /**
     * @brief       设置画笔颜色
     */
    void setPenColor(QColor color);

protected:
    QRectF boundingRect() const;
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);

private:
    qreal m_x=0;qreal m_y;qreal m_width=0;qreal m_height=0;
    QPointF m_pointF1 = QPointF(0,0);
    QPointF m_pointF2 = QPointF(0,0);
    qreal m_penWidth = 1;
    QColor m_penColor = QColor(0,0,0);

    int m_iIndex = -1;


    qreal m_angle = 0;  //角度
    QPointF m_lastPointF;

    QColor m_borderColor;
    QColor m_brushColor;
    QColor m_selectedColor;

    void updateRect(QPointF p1, QPointF p2);
};

#endif // MYLINE_H

myline.cpp

#include "myline.h"
#include <QDebug>
#include <QCursor>
#include <QtMath>
#include <QMatrix>
#include <QPixmap>
#include <QPainterPath>

#define pi 3.1415926


MyLine::MyLine(QGraphicsItem *parent) : QGraphicsItem(parent)
{

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

void MyLine::setLine(QPointF p1, QPointF p2)
{
    m_pointF1 = p1;
    m_pointF2 = p2;
    updateRect(p1,p2);
}

void MyLine::setPenWidth(qreal penWidth)
{
    m_penWidth = penWidth;
}

void MyLine::setPenColor(QColor color)
{
    m_penColor = color;
}

QRectF MyLine::boundingRect() const
{
    return QRectF(m_x,m_y,m_width,m_height);

}

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

    painter->setRenderHint(QPainter::Antialiasing, true);

    painter->setPen(m_penColor);
    painter->drawLine(m_pointF1,m_pointF2);
}

void MyLine::updateRect(QPointF p1, QPointF p2)
{
    if(p1.x() < p2.x()){
        m_x = p1.x();
    }else{
        m_x = p2.x();
    }

    if(p1.y() < p2.y()){
        m_y = p1.y();
    }else{
        m_y = p2.y();
    }
    m_width = fabs(p1.x()-p2.x());
    m_height = fabs(p1.y()-p2.y());
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

#include <QGraphicsScene>
#include <QGraphicsView>
#include "myline.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_pushButton_Red_clicked();

    void on_pushButton_Green_clicked();

    void on_pushButton_Blue_clicked();

private:
    Ui::MainWindow *ui;

    QGraphicsScene *scene = nullptr;
    QGraphicsView *view = nullptr;
    MyLine *line = nullptr;
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"



MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    scene = new QGraphicsScene(this);

    view = new  QGraphicsView();
    view->setScene(scene);
    view->show();

    line = new MyLine();
    line->setLine(QPointF(10,10),QPointF(50,50));
    scene->addItem(line);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_Red_clicked()
{
    line->setPenColor(QColor(255,0,0));
    scene->update();
}

void MainWindow::on_pushButton_Green_clicked()
{
    line->setPenColor(QColor(0,255,0));
    scene->update();
}

void MainWindow::on_pushButton_Blue_clicked()
{
    line->setPenColor(QColor(0,0,255));
    scene->update();
}

 

https://blog.csdn.net/xi__q/article/details/84636698?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161708584916780266250403%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=161708584916780266250403&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v2~rank_v29-1-84636698.pc_v2_rank_blog_default&utm_term=%E7%9B%B4%E7%BA%BF