1

タイプ QGraphicsRectItem のアイテムが 2 つあります。もう一方の上に。

1 つ目は、Wall というカスタム クラスです。壁の内側には窓とドアがあります。実際、このカスタム Wall クラス内に Doors と Windows のリストがあります。

ドアもアイテムで、壁の中に描かれています。

ドアの上にマウスを移動すると、壁のホバー機能が発せられますが、ドアのホバー機能はありません。どちらも、保護された仮想ボイドとして互いに正しくコピーされました。

なぜそれが起こっているのですか?ドアと窓のアイテムにホバーを認識させるにはどうすればよいですか?.

4

1 に答える 1

3

QGraphicsItemcustomの代わりにcustom を試してみましたQGraphicsRectItemWallと の両方でホバー イベント ハンドラーが正常に呼び出されたようですDoor。これは、で明示的に設定QGraphicsItemすると発生しsetAcceptHoverEvents(true)ます。これは custom ではテストされていませんQGraphicsRectItem

スクリーンショット

#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsItem>
#include <QPainter>

class Item : public QGraphicsItem
{
    QBrush m_brush;
public:
    explicit Item(bool nested = true, QGraphicsItem* parent = 0) : QGraphicsItem(parent), m_brush(Qt::white)
    {
        if (nested) {
            Item* item = new Item(false, this);
            item->setPos(10,10);
            m_brush = Qt::red;
        }
        setAcceptHoverEvents(true);
    }
    QRectF boundingRect() const
    {
        return QRectF(0,0,100,100);
    }
    void hoverEnterEvent(QGraphicsSceneHoverEvent *)
    {
        m_brush = Qt::red;
        update();
    }
    void hoverLeaveEvent(QGraphicsSceneHoverEvent *)
    {
        m_brush = Qt::white;
        update();
    }
    void paint(QPainter *p, const QStyleOptionGraphicsItem *, QWidget *)
    {
        p->setBrush(m_brush);
        p->drawRoundRect(boundingRect());
    }
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QGraphicsScene scene;
    scene.addItem(new Item);
    QGraphicsView view;
    view.setScene(&scene);
    view.setMouseTracking(true);
    view.show();
    return app.exec();
}
于 2013-08-28T19:58:50.813 に答える