簡體   English   中英

如何使用Qt4在運行時在Qgraphicsview中動態繪制矩形

[英]How to draw a Rectangle in Qgraphicsview dynamically (runtime), using Qt4

使用QT Creator版本2.4.1。

我只是QT平台上的入門者,正在嘗試動態繪制矩形。 該程序使用3個鼠標事件

  • mousePressEvent
  • mouseMoveEvent
  • mouseReleaseEvent

問題是mouseMoveEvent永遠不會被調用。

這是代碼片段

main.cpp

#include <QtGui/QApplication>
#include "dialog.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Dialog w;
    w.show();

    return a.exec();
}

對話框.cpp

#include "dialog.h"
#include "ui_dialog.h"
#include "mysquare.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
    setMouseTracking(true);
    scene = new QGraphicsScene(this);
    ui->graphicsView->setScene(scene);
    scene->setBackgroundBrush(Qt::black);
    square = new mySquare;
    scene->addItem(square);
    square->mPix = QPixmap(200,200);
    square->mPix.fill(Qt::white);
    scene->addPixmap(square->mPix);
}

Dialog::~Dialog()
{
    delete ui;
}

void Dialog::on_pushButton_clicked()
{
    square->selectedTool = 1;
}

對話框

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QtCore>
#include <QtGui>
#include "mysquare.h"

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();

private slots:
    void on_pushButton_clicked();

private:
    Ui::Dialog *ui;
    QGraphicsScene *scene;
    mySquare *square;

};

#endif // DIALOG_H

mysquare.cpp

#include "mysquare.h"

using namespace std;


mySquare::mySquare()
{
    pressed  = false;
    selectedTool = 1;
    mPix = QPixmap(200,200);
    mPix.fill(Qt::white);
}

void mySquare::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    painter->begin(this);
    if(pressed)
    {
        painter->drawPixmap(0,0,mPix);
        painter->drawRect(mRect);
        drawStarted = true;
    }
    else if (drawStarted)
    {
        QPainter tempPainter(&mPix);
        tempPainter.drawRect(mRect);
        painter->drawPixmap(0,0,mPix);
    }

    painter->end();
}

void mySquare::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    pressed = true;

    y = event->pos();
    cout<<"Pos X : "<<y.x() <<endl;
    cout<<"Pos Y : "<<y.y() <<endl;

    if(selectedTool == 1)
    {
        mRect.setTopLeft(event->pos());
        mRect.setBottomRight(event->pos());

        cout << "Value of x_start axis " << X_1 <<endl;
        cout << "Value of y_start axis " << Y_1 <<endl;
    }
    else if (selectedTool == 2)
    {

    }
    update();
}

void mySquare::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
    cout<<"Inside mouseMoveEvent \n";
    if(event->type() == QEvent::MouseMove)
    {
        if(selectedTool == 1){
            mRect.setBottomRight(event->pos());
        }
        else if (selectedTool == 2){
            //mLine.setP2(event->pos());
        }
    }
    update();
}

void mySquare::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
    pressed = false;
    update();
    cout<<"Inside mouseReleaseEvent \n";
}

mysquare.h

#ifndef MYSQUARE_H
#define MYSQUARE_H

#include <QPainter>
#include <QGraphicsItem>
#include <QDebug>
#include <QPainter>
#include <iostream>
#include <QPixmap>
#include <QPaintEvent>
#include <QGraphicsSceneMouseEvent>

class mySquare: public QGraphicsItem
{
public:
    mySquare();
    int selectedTool;
    QPixmap mPix;
    QRectF boundingRect() const;
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
    bool pressed;
    bool drawStarted;

protected:
    void mousePressEvent(QGraphicsSceneMouseEvent *event);
    void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
    void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);

private:
    QRectF mRect;
    QPointF y;


private slots:

};

#endif // MYSQUARE_H

請指導我,謝謝。

嘗試將屬性mouseTracking設置為true。 你可以在這里閱讀它

您的代碼中也有一些問題。 例如,使用square = new mySquare;創建mySquare對象square = new mySquare; 但是我看不到您將代碼稱為delete square代碼。

暫無
暫無

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

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