簡體   English   中英

在graphicsview中繪畫

[英]Painting in graphicsview

我正在使用圖形視圖在其中繪制圖形項目。 早些時候,當我單擊按鈕時,相應的項目僅繪制了一次,以再次繪制我再次按下按鈕的相同實體。 為了克服這個問題,我構造了一個信號,允許多次添加實體,而無需再次按下按鈕。 但是當我使用向量存儲點時,它不會追加,將其容量限制為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();

        }
    }

主窗口

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

需要做些什么來完美地存儲點並允許重繪。 請幫我解決所有這些問題。

好吧,不確定這是否會回答您的請求,但是評論太小而無法寫我想告訴您的內容。

我真的不明白您的信號DrawFinished()的目的是什么。 即使很明顯得益於該名稱,我也不認為您需要它。

如果我總結出您真正想要的東西,您將擁有一個QGraphicView ,您可以在其中繪制一些形狀。 在它旁邊,您至少有一個(假設3個)按鈕可以選擇要繪制的形狀(圓形,三角形,矩形)。

假設您要繪制一些圓,單擊CircleButton,然后單擊QGraphicView。

在我看來,我將創建以下內容:

繼承自QGraphicView兩個類MainWindowView 您的三個按鈕是通過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());
}
[...]

視圖

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個向量並繪制圓形,矩形或三角形。

這樣,您就沒有這樣的意大利面條式代碼,這非常清楚。

我沒有運行代碼,因此可能存在一些小錯誤,請不要忘記進行連接和初始化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM