我正在使用图形视图在其中绘制graphicsitem。早些时候,当我点击按钮时,相应的项目仅被绘制一次,再次绘制相同的实体,我再次刷新按钮。为了克服这个问题,我构造了信号以允许多次添加实体,而无需再次按下按钮。但是当我使用vector来存储点时。它不会追加,只能将其容量限制为2。以下是我的输出和代码 circle.cpp
void circle::mousePressEvent(QGraphicsSceneMouseEvent *e)
{
if(e->button()==Qt::LeftButton) {
if(mFirstClick){
x1 = e->pos().x();
y1 = e->pos().y();
mFirstClick = false;
mSecondClick = true;
}
else if(!mFirstClick && mSecondClick){
x2 = e->pos().x();
y2 = e->pos().y();
mPaintFlag = true;
mSecondClick = false;
update();
emit DrawFinished();
_store.set_point(e->pos());
store_point.push_back(_store);
qDebug() << _store.getValue();
qDebug() << "Size of vector =" << store_point.size() << "and" << store_point.capacity();
update();
}
}
mainwindow.cpp
void MainWindow::drawCircle(){
item2 = new circle;
scene->addItem(item2);
qDebug() << "Circle Created";
connect(item2, SIGNAL(DrawFinished()), this, SLOT(drawCircle()));
}
输出
Circle Created
QPointF(60, 87)
Size of vector = 1 and 1
Circle Created
QPointF(77, 221)
Size of vector = 2 and 2
QPointF(333, 57)
Size of vector = 1 and 1
当我删除信号DrawFinished()时,点存储完美但项目只被绘制一次。我需要再次按下按钮:(。以下是移除信号后的输出。
QPointF(74, 80)
Size of vector = 1 and 1
QPointF(118, 165)
Size of vector = 2 and 2
QPointF(335, 97)
Size of vector = 3 and 4
需要做些什么来完美地存储点以及允许重新绘制。请帮我理清这一切。
答案 0 :(得分:0)
嗯,不确定这是否能满足您的要求,但评论太小,无法写出我想告诉您的内容。
我真的不明白你信号的目的是什么DrawFinished()
。即使这个名字显而易见,我也不认为你需要它。
如果我总结一下你真正想要的东西,那么你需要QGraphicView
来绘制一些形状。在它旁边,你至少有一个(让我们说3个)按钮来选择你想要绘制的形状(圆形,三角形,矩形)。
假设你想绘制一些圆圈,点击CircleButton,然后点击QGraphicView。
在我看来,我会创造这样的东西:
两个类MainWindow
和View
,查看哪个类继承自QGraphicView
。您的三个按钮是在MainWindow类中使用Qt设计器定义的。因此,当您单击按钮时,您可以发出信号以通知View
。
在View
类中,每个形状可以有一个向量。
<强> MainWindow.h 强>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
signals:
void drawCircle();
void drawRectangle();
void drawTriangle();
private:
Ui::MainWindow *ui;
View view;
private slots:
void slotOnCircleButton();
void slotOnRectangleButton();
void slotOnTriangleButton();
};
<强> MainWindow.cpp 强>
[...]
void MainWindow::slotOnCircleButton()
{
emit(drawCircle());
}
[...]
<强> View.h 强>
class View : public QGraphicsView
{
Q_OBJECT
public:
explicit View(QWidget *parent = 0);
enum DrawingMode
{
UNDEFINED,
CIRCLE,
TRIANGLE,
RECTANGLE
}
signals:
public slots:
void slotOnDrawCircle();
void slotOnDrawRectangle();
void slotOnDrawTriangle();
private:
DrawingMode mode;
QVector<QPointF> vectorCircle;
QVector<QPointF> vectorTriangle;
QVector<QPointF> vectorRectangle;
};
<强> View.cpp 强>
[...]
void View::slotOnDrawCircle()
{
this->mode = CIRCLE;
}
[...]
void View::mousePressEvent(QGraphicsSceneMouseEvent *e)
{
if(e->button()==Qt::LeftButton && this->mode != UNDEFINED)
{
qreal x1 = e->pos().x();
qreal y1 = e->pos().y();
if(this->mode == CIRCLE)
{
this->vectorCircle.append(e->pos());
}
else if(...)
[...]
// updatePainting();
}
}
更新视图时,您只需要移动3个向量并绘制圆形,矩形或三角形。
这样你就不会有这样的意大利面条代码,它很清楚。
我没有运行代码,因此可能会出现一些小错误,不要忘记建立连接和初始化。