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