C++ qt-graphicscene-line子类

C++ qt-graphicscene-line子类,c++,qt,qt5,qgraphicsview,qgraphicsscene,C++,Qt,Qt5,Qgraphicsview,Qgraphicsscene,我从Graphicscene类中添加了一个Line子类来绘制一条线。在MainWindow中,我调用了该类中的line函数,没有错误,但没有画线。我知道这一定是我的C++技能不足。但在这件事上搜索对我没有帮助。我想要的是为绘制不同的形状创建不同的类,而不是用所有这些代码污染Graphicscene,以保持事物的结构化。但我做错了什么?我在github github.com/JackBerkhout/QT_Draw001上发布了我的代码 第h行 #ifndef LINE_H #define LIN

我从Graphicscene类中添加了一个Line子类来绘制一条线。在MainWindow中,我调用了该类中的line函数,没有错误,但没有画线。我知道这一定是我的C++技能不足。但在这件事上搜索对我没有帮助。我想要的是为绘制不同的形状创建不同的类,而不是用所有这些代码污染Graphicscene,以保持事物的结构化。但我做错了什么?我在github github.com/JackBerkhout/QT_Draw001上发布了我的代码

第h行

#ifndef LINE_H
#define LINE_H

#include <QMainWindow>
#include <QObject>
#include <QDebug>
#include "graphicsscene.h"

class Line: public GraphicsScene
{
public:
    Line();
    void drawLine(int x1, int y1, int x2, int y2);
};

#endif // LINE_H
#如果没有行#
#定义行
#包括
#包括
#包括
#包括“graphicscene.h”
类行:公共Graphicscene
{
公众:
第()行;
虚线(int-x1、int-y1、int-x2、int-y2);
};
#endif//LINE_H
line.cpp

#include "line.h"

Line::Line():
    GraphicsScene()
{
}

void Line::drawLine(int x1, int y1, int x2, int y2)
{
    // Just draw something by clicking a button

    qDebug() << "line";                 // This debug message is shown

    QColor color;
    color.setRgb(128, 0, 255);
    QPen pen;
    pen.setColor(color);
    pen.setWidth(20);
    pen.setCapStyle(Qt::RoundCap);

    this->addLine(x1, y1, x2, y2, pen); // Didn't draw the line on the scene
}
#包括“line.h”
Line::Line():
Graphicscene()
{
}
虚线::绘制线(整数x1、整数y1、整数x2、整数y2)
{
//只要点击一个按钮就可以画一些东西
qDebug()添加线(x1,y1,x2,y2,pen);//未在场景中绘制线
}
graphicscene.cpp

#ifndef GRAPHICSSCENE_H
#define GRAPHICSSCENE_H

#include <QGraphicsScene>
#include <QGraphicsSceneMouseEvent>
#include <QPointF>
#include <QList>

class GraphicsScene : public QGraphicsScene
{
    Q_OBJECT
public:
    explicit GraphicsScene(QObject *parent = 0);
    virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent * mouseEvent);
    virtual void mouseMoveEvent(QGraphicsSceneMouseEvent * mouseEvent);
    virtual void mousePressEvent(QGraphicsSceneMouseEvent * mouseEvent);
    virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent * mouseEvent);

    QPointF getMousePoint(void);
    int getMouseX(void);
    int getMouseY(void);
    int getNumber(void);
    void setNumber(int num);

    QPointF mousePoint;
    int MouseX, MouseY;
    int myNumber;

signals:
    void changedMousePosition(QPointF mousePoint);
    void changedNumber(int myNumber);

public slots:

private:
    QList <QPointF> mousePoints;

//    int Number;

};

#endif // GRAPHICSSCENE_H
#include "mainwindow.h"
#include "graphicsscene.h"
#include <QDebug>

GraphicsScene::GraphicsScene(QObject *parent) :
    QGraphicsScene(parent)
{
    this->setBackgroundBrush(Qt::black);
    myNumber = 0;
//    this-> ->setMouseTracking(true);
}

void GraphicsScene::mouseDoubleClickEvent(QGraphicsSceneMouseEvent * mouseEvent)
{
//    mousePoint = mouseEvent->scenePos();
//    MouseX = mousePoint.x();
//    MouseY = mousePoint.y();
    qDebug() << Q_FUNC_INFO << mouseEvent->scenePos();
    QGraphicsScene::mouseDoubleClickEvent(mouseEvent);
}

void GraphicsScene::mouseMoveEvent(QGraphicsSceneMouseEvent * mouseEvent)
{
    mousePoint = mouseEvent->scenePos();
    MouseX = mouseEvent->scenePos().x();
    MouseY = mouseEvent->scenePos().y();

    emit changedMousePosition(mousePoint);

    QGraphicsScene::mouseMoveEvent(mouseEvent);
}

void GraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent * mouseEvent)
{
    mousePoint = mouseEvent->scenePos();
    MouseX = mouseEvent->scenePos().x();
    MouseY = mouseEvent->scenePos().y();
    mousePoints.append(mouseEvent->scenePos());

    MainWindow *mainWindow = new MainWindow();
    mainWindow->Count++;

    if(mousePoints.size() == 2)
    {
        myNumber++;

        emit changedNumber(myNumber);

        QColor color;
        color.setRgb(128, 0, 255);
        QPen pen;
        pen.setColor(color);
        pen.setWidth(20);
        pen.setCapStyle(Qt::RoundCap);
        this->addLine(mousePoints.at(0).x(), mousePoints.at(0).y(), mousePoints.at(1).x(), mousePoints.at(1).y(), pen);

        mousePoints.clear();
    }

    QGraphicsScene::mousePressEvent(mouseEvent);
}

void GraphicsScene::mouseReleaseEvent(QGraphicsSceneMouseEvent * mouseEvent)
{
    mousePoint = mouseEvent->scenePos();
    MouseX = mouseEvent->scenePos().x();
    MouseY = mouseEvent->scenePos().y();
    QGraphicsScene::mouseReleaseEvent(mouseEvent);
}

QPointF GraphicsScene::getMousePoint(void)
{
    return mousePoint;
}

int GraphicsScene::getMouseX(void)
{
    MouseX = mousePoint.x();
    return mousePoint.x();
}

int GraphicsScene::getMouseY(void)
{
    MouseY = mousePoint.y();
    return mousePoint.y();
}

void GraphicsScene::setNumber(int num)
{
    myNumber = num;
}

int GraphicsScene::getNumber(void)
{
    return myNumber;
}
\ifndef graphicscene\u H
#定义图形SCene_H
#包括
#包括
#包括
#包括
Graphicscene类:公共QGraphicscene
{
Q_对象
公众:
显式Graphicscene(QObject*parent=0);
虚拟void mouseDoubleClickEvent(QGraphicsSceneMouseEvent*mouseEvent);
虚空mouseMoveEvent(qgraphicscscenemouseevent*mouseEvent);
虚空mousePressEvent(QGraphicsSceneMouseEvent*mouseEvent);
虚拟无效mouseReleaseEvent(QGraphicsSceneMouseEvent*mouseEvent);
QPointF getMousePoint(无效);
int getMouseX(无效);
int getMouseY(无效);
int getNumber(无效);
无效集合编号(int num);
QPointF鼠标点;
int MouseX,MouseY;
int myNumber;
信号:
无效更改鼠标位置(QPointF鼠标点);
无效更改编号(整数myNumber);
公众时段:
私人:
QList鼠标点;
//整数;
};
#endif//graphicscene_H
graphicscene.cpp

#ifndef GRAPHICSSCENE_H
#define GRAPHICSSCENE_H

#include <QGraphicsScene>
#include <QGraphicsSceneMouseEvent>
#include <QPointF>
#include <QList>

class GraphicsScene : public QGraphicsScene
{
    Q_OBJECT
public:
    explicit GraphicsScene(QObject *parent = 0);
    virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent * mouseEvent);
    virtual void mouseMoveEvent(QGraphicsSceneMouseEvent * mouseEvent);
    virtual void mousePressEvent(QGraphicsSceneMouseEvent * mouseEvent);
    virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent * mouseEvent);

    QPointF getMousePoint(void);
    int getMouseX(void);
    int getMouseY(void);
    int getNumber(void);
    void setNumber(int num);

    QPointF mousePoint;
    int MouseX, MouseY;
    int myNumber;

signals:
    void changedMousePosition(QPointF mousePoint);
    void changedNumber(int myNumber);

public slots:

private:
    QList <QPointF> mousePoints;

//    int Number;

};

#endif // GRAPHICSSCENE_H
#include "mainwindow.h"
#include "graphicsscene.h"
#include <QDebug>

GraphicsScene::GraphicsScene(QObject *parent) :
    QGraphicsScene(parent)
{
    this->setBackgroundBrush(Qt::black);
    myNumber = 0;
//    this-> ->setMouseTracking(true);
}

void GraphicsScene::mouseDoubleClickEvent(QGraphicsSceneMouseEvent * mouseEvent)
{
//    mousePoint = mouseEvent->scenePos();
//    MouseX = mousePoint.x();
//    MouseY = mousePoint.y();
    qDebug() << Q_FUNC_INFO << mouseEvent->scenePos();
    QGraphicsScene::mouseDoubleClickEvent(mouseEvent);
}

void GraphicsScene::mouseMoveEvent(QGraphicsSceneMouseEvent * mouseEvent)
{
    mousePoint = mouseEvent->scenePos();
    MouseX = mouseEvent->scenePos().x();
    MouseY = mouseEvent->scenePos().y();

    emit changedMousePosition(mousePoint);

    QGraphicsScene::mouseMoveEvent(mouseEvent);
}

void GraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent * mouseEvent)
{
    mousePoint = mouseEvent->scenePos();
    MouseX = mouseEvent->scenePos().x();
    MouseY = mouseEvent->scenePos().y();
    mousePoints.append(mouseEvent->scenePos());

    MainWindow *mainWindow = new MainWindow();
    mainWindow->Count++;

    if(mousePoints.size() == 2)
    {
        myNumber++;

        emit changedNumber(myNumber);

        QColor color;
        color.setRgb(128, 0, 255);
        QPen pen;
        pen.setColor(color);
        pen.setWidth(20);
        pen.setCapStyle(Qt::RoundCap);
        this->addLine(mousePoints.at(0).x(), mousePoints.at(0).y(), mousePoints.at(1).x(), mousePoints.at(1).y(), pen);

        mousePoints.clear();
    }

    QGraphicsScene::mousePressEvent(mouseEvent);
}

void GraphicsScene::mouseReleaseEvent(QGraphicsSceneMouseEvent * mouseEvent)
{
    mousePoint = mouseEvent->scenePos();
    MouseX = mouseEvent->scenePos().x();
    MouseY = mouseEvent->scenePos().y();
    QGraphicsScene::mouseReleaseEvent(mouseEvent);
}

QPointF GraphicsScene::getMousePoint(void)
{
    return mousePoint;
}

int GraphicsScene::getMouseX(void)
{
    MouseX = mousePoint.x();
    return mousePoint.x();
}

int GraphicsScene::getMouseY(void)
{
    MouseY = mousePoint.y();
    return mousePoint.y();
}

void GraphicsScene::setNumber(int num)
{
    myNumber = num;
}

int GraphicsScene::getNumber(void)
{
    return myNumber;
}
#包括“mainwindow.h”
#包括“graphicscene.h”
#包括
Graphicscene::Graphicscene(QObject*父对象):
QsScene(父级)
{
此->立根毛刷(Qt::黑色);
myNumber=0;
//此->->setMouseTracking(true);
}
void graphicscene::mouseDoubleClickEvent(qgraphicscenemouseevent*mouseEvent)
{
//mousePoint=mouseEvent->scenePos();
//MouseX=mousePoint.x();
//MouseY=mousePoint.y();
qDebug()scenePos();
MouseX=mouseEvent->scenePos().x();
MouseY=mouseEvent->scenePos().y();
发出changedMousePosition(鼠标点);
qgraphicscene::mouseMoveEvent(mouseEvent);
}
void graphicscene::mousePressEvent(qgraphicscenemouseevent*mouseEvent)
{
mousePoint=mouseEvent->scenePos();
MouseX=mouseEvent->scenePos().x();
MouseY=mouseEvent->scenePos().y();
append(mouseEvent->scenePos());
MainWindow*MainWindow=新的MainWindow();
主窗口->计数++;
if(mousePoints.size()==2)
{
myNumber++;
发出更改编号(myNumber);
四色;
setRgb(128,0255);
QPen笔;
笔。设置颜色(颜色);
笔设置宽度(20);
pen.setCapStyle(Qt::RoundCap);
这->添加行(mousePoints.at(0.x()、mousePoints.at(0.y()、mousePoints.at(1.x()、mousePoints.at(1.y()、pen));
鼠标点。清除();
}
qgraphicscene::mousePressEvent(mouseEvent);
}
void graphicscene::mouseReleaseEvent(qgraphicscenemouseevent*mouseEvent)
{
mousePoint=mouseEvent->scenePos();
MouseX=mouseEvent->scenePos().x();
MouseY=mouseEvent->scenePos().y();
QGraphicscene::mouseReleaseEvent(mouseEvent);
}
QPointF Graphicscene::getMousePoint(无效)
{
返回鼠标点;
}
int graphicscene::getMouseX(void)
{
MouseX=mousePoint.x();
返回mousePoint.x();
}
int graphicscene::getMouseY(void)
{
MouseY=mousePoint.y();
返回mousePoint.y();
}
void graphicscene::setNumber(int num)
{
myNumber=num;
}
int graphicscene::getNumber(void)
{
返回我的号码;
}

您太复杂了,除此之外,我认为您不了解继承的目的,您只需在
graphicscene
中创建一个名为
drawLine
的函数,并在需要时使用它

graphicscene.h

public:

    void drawLine(int x1, int y1, int x2, int y2);
graphicscene.cpp

void GraphicsScene::drawLine(int x1, int y1, int x2, int y2)
{
    QColor color;
    color.setRgb(128, 0, 255);
    QPen pen;
    pen.setColor(color);
    pen.setWidth(20);
    pen.setCapStyle(Qt::RoundCap);

    addLine(x1, y1, x2, y2, pen);
}
然后在主窗口中调用:

void MainWindow::on_toolButtonDraw_clicked()
{
    scene->drawLine(300, 100, 500, 300);
}

当你创建一个线条对象时,你正在创建一个新的场景,它将在该场景中绘制,因此你将看不到它。

当我考虑它时,它可能没有意义将不同的形状子类化。这让事情变得复杂。如果我想画一条橡皮筋线,我想我需要使用XOR,我找不到方法,我想Graphicscene不使用QPaint。有办法做到这一点吗?或者我可以制作一个单独的透明场景层来绘制和擦除,而不破坏显示的内容吗?我尝试将QPaint与Graphicscene结合使用,但无法编译它。错误:调用“QPainter::QPainter(graphicscene*)”QPainter painter painter(this)时没有匹配的函数;^void graphicscene::myLine(intx1,inty1,intx2,inty2){QPoint point1,point2;point1.setY(x1);point1.setY(y1);point2.setX(x2);point2.setY(y2);qpaint painter painter(this);painter.setCompositionMode(QPainter::RasterOp_sourcexordination);painter.drawLine(point1,point2)什么是橡皮筋线?我更新了我的github链接,现在包含了它。当我开始绘制直线时,会从原点到鼠标位置绘制一条细虚线,并在单击第二个点之前随鼠标移动。它会擦除已经绘制的线条,就像我用黑色绘制它们一样。一些层或XOR操作在这里会派上用场,但我还不知道怎么做。在line.cpp,setLineP2(intx,inty)中,我将开始一个新的问题