2011-10-14 30 views
17

Tôi đã phân lớp QGraphicsScene và phương thức thêm mouseMoveEvent để xử lý sự kiện di chuyển chuột. Tôi tạo ra một người cai trị trên đầu của GraphicsView và có người theo dõi chuột di chuyển. Trong QGraphicsScene :: mousemoveEvent tôi gọi mouseMoveEvent của widget cai trị một cách khéo léo. Mục đích là để người cai trị biết rằng vị trí chuột hiện tại.Theo dõi di chuyển chuột trong lớp QGraphicsScene

Bây giờ có vẻ như QGraphicsScene :: mousemoveEvent không được gọi khi tôi di chuyển chuột. Tuy nhiên, tôi có thể làm cho nó hoạt động nếu tôi nhấn nút chuột trái và di chuyển nó trong khi giữ nút. Đây không phải là điều tôi muốn thấy; Tôi muốn phương pháp này được gọi là bất cứ khi nào tôi đặt chuột lên chế độ xem và di chuyển chuột.

Có cách giải quyết nào không?

+4

OK, tôi tìm hiểu . Tôi cần bật tính năng mouseTracking trong QGraphicsView. Sau khi làm điều đó nó hoạt động như một sự quyến rũ. – cuteCAT

+4

để trả lời bạn câu hỏi và chấp nhận câu trả lời – Dmitriy

+0

@SherwoodHu như geotavros đã nói, bạn nên trả lời câu hỏi của riêng bạn và chấp nhận nó. Đó là một thực hành hoàn toàn hợp lệ ở đây. –

Trả lời

9

Như đã nêu trong tài liệu hướng dẫn QGraphicsView, quan điểm có trách nhiệm chuyển chuột và bàn phím sự kiện vào các sự kiện cảnh và tuyên truyền mà đến hiện trường:

Bạn có thể tương tác với các mặt hàng trên sân khấu bằng cách sử dụng chuột và bàn phím. QGraphicsView dịch chuột và các sự kiện quan trọng vào các sự kiện cảnh, (các sự kiện kế thừa QGraphicsSceneEvent,) và chuyển tiếp chúng đến cảnh được hiển thị.

Kể từ mouse move events chỉ xảy ra khi một nút được nhấn theo mặc định, bạn cần phải setMouseTracking(true) trên quan điểm cho các sự kiện di chuyển để tạo ra ở nơi đầu tiên, do đó nó có thể chuyển tiếp những đến hiện trường.
Ngoài ra, nếu bạn không cần dịch sang tọa độ cảnh, bạn có thể triển khai lại trực tiếp mouseMoveEvent thay vì trong cảnh của bạn. Nhưng trong trường hợp này, hãy đảm bảo bạn gọi lớp cơ sở QGraphicsView::mouseMoveEvent trong quá trình triển khai của mình để các sự kiện di chuột được tạo đúng cách cho các mục trong cảnh của bạn.

2

tôi đã hỏi, và trong một số nơi tìm thấy một số thông tin hữu ích, và thử nghiệm viết này:

tgs.cpp:

#include <QtGui> 
#include "tgs.h" 
#define _alto 300 
#define _ancho 700 
#include <QGraphicsSceneMouseEvent> 

TGs::TGs(QObject *parent) 
    :QGraphicsScene(parent) 
{ // Constructor of Scene 
    this->over = false; 
} 

void TGs::drawBackground(QPainter *painter, const QRectF &rect) 
{ 

#define adjy 30 
#define adjx 30 

    int j = 0; 
    int alto = 0; 

    QPen pen; 
    pen.setWidth(1); 
    pen.setBrush(Qt::lightGray); 
    painter->setPen(pen); 

    painter->drawText(-225, 10, this->str); 
    alto = _alto; // 50 + 2 

    for(int i = 0; i < alto; ++i) 
    { 
     j = i * adjy - 17; 

     painter->drawLine(QPoint(-210, j), QPoint(_ancho, j)); 
    } 

    for(int i = 0; i < 300; ++i) 
    { 
     j = i * adjx - 210; 

     painter->drawLine(QPoint(j, 0), QPoint(j, _ancho * 2)); 
    } 
} 

void TGs::mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent) 
{ 
    QString string = QString("%1, %2") 
       .arg(mouseEvent->scenePos().x()) 
       .arg(mouseEvent->scenePos().y()); // Update the cursor position text 
    this->str = string; 
    this->update(); 
} 

void TGs::mousePressEvent(QGraphicsSceneMouseEvent *event) 
{ 
    this->update(); 
} 

void TGs::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) 
{ 
    this->update(); 
} 

tgs.h:

#ifndef TGS_H 
#define TGS_H 

#include <QObject> 
#include <QGraphicsView> 
#include <QGraphicsScene> 
#include <QGraphicsTextItem> 

QT_BEGIN_NAMESPACE 

class QGraphicsSceneMouseEvent; 
class QMenu; 
class QPointF; 
class QGraphicsLineItem; 
class QFont; 
class QGraphicsTextItem; 
class QColor; 

QT_END_NAMESPACE 

class TGs : public QGraphicsScene 
{ 
public: 
    TGs(QObject *parent = 0); 

public slots: 
    void drawBackground(QPainter *painter, const QRectF &rect); 
    void mouseMoveEvent(QGraphicsSceneMouseEvent * mouseEvent); 
    void mousePressEvent(QGraphicsSceneMouseEvent *event); 
    void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); 

    bool over; 
    QString str; 
    QGraphicsTextItem cursor; 
}; 

#endif // TGS_H 
Các vấn đề liên quan