鼠标悬停在 QGraphicsPixmapItem 上后 Qt 显示工具提示

Posted

技术标签:

【中文标题】鼠标悬停在 QGraphicsPixmapItem 上后 Qt 显示工具提示【英文标题】:Qt Display tooltip after mouse hover on QGraphicsPixmapItem 【发布时间】:2014-05-10 19:04:47 【问题描述】:

我正在使用 QGraphicView 来显示包含 QGraphicsPixmapItems 的游戏地图。我需要在鼠标悬停在 QGraphicsPixmapItem 时显示工具提示。

为了保存 QGraphicsPixmapItem 位置,我使用 MazeItem:

#ifndef MAZEITEM_H
#define MAZEITEM_H

#include <QPoint>
#include <QGraphicsItem>

class MazeItem

private:
    QPoint myPosition;
    QString myToolTip;

public:
    MazeItem();
    QPoint position() const;
    QString toolTip() const;
    void setToolTip(const QString &toolTip);
    void setPosition(const QPoint &position);
    QPoint getPosition();
    QGraphicsPixmapItem * pixmap;
;

#endif // MAZEITEM_H

我有小部件类来显示游戏地图:

#include <QWidget>
#include <QtGui>
#include <QGraphicsView>
#include <QToolTip>
#include "mazeitem.h"

class MazeGUI : public QWidget

    Q_OBJECT

private:
    QGraphicsView * graphicsView;
    QGraphicsScene * graphicsScene;
    QString sceneString;
    int imageSize;
    QList<MazeItem> mazeItems;
    void addItem(int x, int y, QPixmap picture);
    bool event(QEvent *event);
    int itemAt(const QPoint &pos);

public:
    explicit MazeGUI(QWidget *parent = 0);
    void setScene(QString sceneString);

signals:

public slots:
    void redraw();

;
#endif // MAZEGUI_H

在构造函数中我设置了鼠标跟踪。

MazeGUI::MazeGUI(QWidget *parent) :
    QWidget(parent)

    setMouseTracking(true);
    ...

这就是我添加新迷宫项目的方式。

void MazeGUI::addItem(int x, int y, QPixmap picture)

    MazeItem mazeItem;
    mazeItem.setPosition(QPoint(x, y));
    mazeItem.setToolTip("text");
    mazeItem.pixmap = this->graphicsScene->addPixmap(picture);
    mazeItem.pixmap->setPos(y, x);
    mazeItems.append(mazeItem);

这是我从 Qt 教程中获得的,

bool MazeGUI::event(QEvent *event)

    if (event->type() == QEvent::ToolTip) 

        // HERE - it never goes here!!      

        QHelpEvent *helpEvent = static_cast<QHelpEvent *>(event);
        int index = itemAt(helpEvent->pos());
        if (index != -1) 
            QToolTip::showText(helpEvent->globalPos(), mazeItems[index].toolTip());
         else 
            QToolTip::hideText();
            event->ignore();
        

        return true;
    
    return QWidget::event(event);


int MazeGUI::itemAt(const QPoint &pos)

    for (int i=0; i < mazeItems.size(); ++i)
    
        if (mazeItems[i].getPosition() == pos)
            return i;
    
    return -1;

【问题讨论】:

那有什么问题? 问题是tooltip没有出现,甚至连启动都打不开。 【参考方案1】:

在错误的对象上添加了工具提示:

代替:

mazeItem.setToolTip("text");

应该是:

mazeItem.pixmap->setToolTip("text");

【讨论】:

以上是关于鼠标悬停在 QGraphicsPixmapItem 上后 Qt 显示工具提示的主要内容,如果未能解决你的问题,请参考以下文章

如何使qgraphicspixmapitem对象不可被选取

快速鼠标悬停/鼠标悬停的完整悬停动画持续时间?

当鼠标不再悬停在悬停动画上时,悬停动画会立即停止吗?

当鼠标悬停(悬停)在对象上时,鼠标光标应该改变(three.js)

CSS如何实现鼠标悬停在图片上底部弹出文字内容?

js在鼠标悬停的时候放大一张图片