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);
これは関係ないと思います。