1

Qt 4.8 を GUI フレームワークとして使用する C++ アプリケーションに取り組んでいます。サブクラス化された QGraphicsView は、マウス カーソルの相対的なピクセル位置を知る必要がある 1 つ以上のサブクラス化された QGraphicsPixMapItem(s) を含むサブクラス化された QGraphicsScene をレンダリングします。

QGraphicsPixmapItem からピクセルの位置と色を表示する方法に従って、 QGraphicsPixmapItemサブクラス化します。

class MyGraphicsPixmapItem : public QObject, public QGraphicsPixmapItem
{
    Q_OBJECT
public:
    explicit MyGraphicsPixmapItem(QGraphicsItem *parent = 0);
signals:
public slots:
    void mouseMoveEvent(QGraphicsSceneMouseEvent * event);
    void mousePressEvent(QGraphicsSceneMouseEvent *event);
};

コンストラクターとハンドラーを実装します。

MyGraphicsPixmapItem::MyGraphicsPixmapItem(QGraphicsItem *parent) : QGraphicsPixmapItem(parent)
{
    qDebug() << "constructor mygraphicspixmapitem";
    setCacheMode(NoCache);
    setAcceptHoverEvents(true);
    setFlag(QGraphicsItem::ItemIsSelectable,true);
}

void MyGraphicsPixmapItem::mouseMoveEvent(QGraphicsSceneMouseEvent * event)
{
    QPointF mousePosition = event->pos(); 
    qDebug() << "mouseMoveEvent";
    qDebug() << mousePosition;
    QGraphicsPixmapItem::mouseMoveEvent(event);
}

また、QGraphicsView と QGraphicsScene をそれぞれの mouseMoveEvent ハンドラーでサブクラス化し、イベントをさらに下に正常に渡します。

void MyGraphicsScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
    qDebug() << "QGraphicsScene: mouseMoveEvent";
    QGraphicsScene::mouseMoveEvent(event);
}

ただし、 MyGraphicsView は構成されていますが...

setMouseTracking(true);
setInteractive(true);

... MyGraphicsPixmapItem は、クリックされたとき、またはグラバーとして設定した後にのみ、mouseMoveEvent ハンドラーを実行します。

void MyGraphicsPixmapItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    qDebug() << QString("item clicked at: %1, %2").arg( event->pos().x()).arg( event->pos().y()  );
    event->accept();
    grabMouse();
}

私が間違いを犯しているのか、それとも上記の回答で与えられた解決策に欠陥があるか不完全なのかを知りたいです。さらに、 QGraphicsPixmapItem を「グラバー」として構成せずに mouseMoveEvent ハンドラーをトリガーできるかどうかを知りたいです。マウスがアイテム上に最初に移動したときに、グラバーとしての構成が自動的に発生する場合も許容されます。

これは、非常によく似た問題がアイテムの参照に関連しているように見えるスレッドですが、アイテムを次のようにシーンに追加したためです。

thepixMapItem = new MyGraphicsPixmapItem();
scene->addItem(thepixMapItem);

これは関係ないと思います。

4

1 に答える 1

1

解決策は、アイテムのhoverMoveEventを再実装またはフィルタリングすることです。これは、mouseMoveEventがマウスの押下を受け取ったときにのみトリガーされるためです。

このイベントを受け取った場合は、このアイテムがマウス プレス イベントも受け取ったこと、およびこのアイテムが現在のマウス グラバーであることを確認できます。

于 2013-07-16T13:45:51.343 に答える