【问题标题】:Painting in graphicsview在图形视图中绘画
【发布时间】:2014-08-16 07:52:19
【问题描述】:

我正在使用图形视图在其中绘制图形项。早些时候,当我单击按钮时,相应的项目只绘制了一次,再次绘制相同的实体,我再次按下按钮。为了克服这个问题,我构建了信号以允许多次添加实体而无需再次按下按钮。但是当我使用向量来存储点时。它不会附加,将其容量限制为 2。以下是我的输出和代码 圆.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();

        }
    }

主窗口.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

需要做什么才能完美地存储点并允许重新绘制。请帮我解决这一切。

【问题讨论】:

  • 嗨!我不明白你为什么在代码中写一些布尔值mFirstClickmSecondClick,并在标题中写下“多次添加实体而无需再次按下按钮”。你真正想要的是什么 ?单击一次,添加几个形状,再次单击停止?
  • 我希望当我按下圆圈按钮时,我可以多次跟踪绘制圆圈的点。通常,当我按下按钮时,圆圈会被跟踪一次。我只能画一次。当我不得不再次绘制圆圈时,我不得不再次单击该按钮。为了克服这个问题,我使用了 DrawFinished。我想要同样的,但使用这种方法我无法处理使用向量的存储。
  • 好的,正如你所问的需要 Firstclick 并且一旦我发现是的我并不真正需要它时都会考虑一下。我用它来思考当用户点击第一点和第二点然后它应该绘画。我删除了它,如果我不使用 DrawFinished 存储是完美的。它已更新,但之前绘制的圆圈消失了。使用 drawFinished 提供与之前相同的问题。
  • 需要做什么?

标签: c++ qt


【解决方案1】:

好吧,不确定这是否会满足您的要求,但评论太小,无法写下我想告诉您的内容。

我真的不明白你的信号DrawFinished() 的目的是什么。即使由于名称很明显,我认为您也不需要它。

如果我总结了你真正想要的,你有一个QGraphicView,你想在其中绘制一些形状。在它旁边,您至少有一个(比如说 3 个)按钮来选择要绘制的形状(圆形、三角形、矩形)。

假设你想画一些圆圈,你点击 CircleButton,然后,点击 QGraphicView。

在我看来,我会创建这样的东西:

两个类,MainWindowView,视图继承自 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 个矢量并绘制圆形、矩形或三角形。

这样你就没有这样的意大利面代码了,很清楚。

我没有运行代码,所以可能存在一些小错误,不要忘记进行连接和初始化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多