2011-10-20 27 views
13

Tôi có mã sau để thiết lập QGraphicsScene. Tôi muốn nhấp vào cảnh và vẽ một điểm tại vị trí tôi đã nhấp vào. Làm thế nào tôi có thể làm điều này? Đây là mã hiện tại của tôi:Làm thế nào để vẽ một điểm (trên mouseclick) trên một QGraphicsScene?

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 

    QGraphicsScene *scene; 
    QGraphicsView *view = new QGraphicsView(this); 

    view->setGeometry(QRect(20, 50, 400, 400)); 
    scene = new QGraphicsScene(50, 50, 350, 350); 
    view->setScene(scene); 
} 

Trả lời

31

CẬP NHẬT: Có một lớp mới gọi là QGraphicsSceneMouseEvent giúp việc này dễ dàng hơn một chút. Tôi vừa hoàn thành một ví dụ sử dụng nó ở đây:

https://stackoverflow.com/a/26903599/999943

Nó khác với câu trả lời dưới đây ở chỗ nó lớp con QGraphicsScene, không QGraphicsView, và nó sử dụng mouseEvent->scenePos() do đó không phải là một nhu cầu tự lập bản đồ tọa độ.


Bạn đang đi đúng hướng, nhưng bạn vẫn còn một chút nữa để tiếp tục.

Bạn cần phải phân lớp QGraphicsView để có thể thực hiện điều gì đó bằng cách nhấn chuột hoặc thả chuột bằng cách sử dụng QMouseEvent.

#include <QGraphicsView> 
    #include <QGraphicsScene> 
    #include <QGraphicsEllipseItem> 
    #include <QMouseEvent> 

    class MyQGraphicsView : public QGraphicsView 
    { 
     Q_OBJECT 
    public: 
     explicit MyQGraphicsView(QWidget *parent = 0); 

    signals: 

    public slots: 
     void mousePressEvent(QMouseEvent * e); 
     // void mouseReleaseEvent(QMouseEvent * e); 
     // void mouseDoubleClickEvent(QMouseEvent * e); 
     // void mouseMoveEvent(QMouseEvent * e); 
    private: 
     QGraphicsScene * scene; 
    }; 

QGraphicsView không thực sự có điểm không có thứ nguyên. Có thể bạn sẽ muốn sử dụng mục QGraphicsEllipse hoặc đơn giản là scene->addEllipseItem() với bán kính rất nhỏ.

#include "myqgraphicsview.h" 
    #include <QPointF> 

    MyQGraphicsView::MyQGraphicsView(QWidget *parent) : 
     QGraphicsView(parent) 
    { 
     scene = new QGraphicsScene(); 
     this->setSceneRect(50, 50, 350, 350); 
     this->setScene(scene); 
    } 

    void MyQGraphicsView::mousePressEvent(QMouseEvent * e) 
    { 
     double rad = 1; 
     QPointF pt = mapToScene(e->pos()); 
     scene->addEllipse(pt.x()-rad, pt.y()-rad, rad*2.0, rad*2.0, 
      QPen(), QBrush(Qt::SolidPattern)); 
    } 

Lưu ý việc sử dụng mapToScene() để làm cho pos() của bản đồ sự kiện một cách chính xác đến nơi mouse click lên hiện trường.

Bạn cần thêm một thể hiện của lớp con của bạn được phân lớp QGraphicsView vào bố cục của ui nếu bạn định sử dụng biểu mẫu.

QGridLayout * gridLayout = new QGridLayout(ui->centralWidget); 
    gridLayout->addWidget(new MyQGraphicsView()); 

hoặc nếu ui của bạn có một layout đã nó sẽ giống như thế này:

ui->centralWidget->layout()->addWidget(new MyGraphicsView()); 

Nếu bạn không sử dụng một và một hình thức QMainWindow, bạn có thể thêm nó vào một QWidget nếu bạn thiết lập bố cục cho nó và sau đó thêm QGraphicsView của bạn vào bố cục đó theo cách tương tự. Nếu bạn không muốn có một lề xung quanh QGraphicsView của bạn, chỉ cần gọi hiển thị trên nó và không đặt nó bên trong một bố trí khác nhau.

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

    int main(int argc, char *argv[]) 
    { 
     QApplication a(argc, argv); 

     MyQGraphicsView view; 
     view.show(); 

     return a.exec(); 
    } 

Và đó là nó. Bây giờ bạn đang nguy hiểm với QGraphicsView và tương tác của họ với con chuột.

Đảm bảo đọc và nghiên cứu về số Graphics View Framework của Qt và examples có liên quan có hiệu lực khi sử dụng QGraphicsViewQGraphicsScene. Họ là những công cụ rất mạnh mẽ cho đồ họa 2D và có thể có một chút của một đường cong học tập nhưng họ có giá trị nó.

+0

phyatt, cảm ơn bạn rất nhiều về "Lưu ý việc sử dụng mapToScene() để làm cho pos() của bản đồ sự kiện chính xác đến nơi con chuột được nhấp vào hiện trường." – mathieug

Các vấn đề liên quan