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();
}