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 QGraphicsView
và QGraphicsScene
. 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ó.
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