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

标签 c++ qt qevent

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

使用 MazeItem 保存 QGraphicsPixmapItem 位置:

#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

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

#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;
}

最佳答案

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

代替:

mazeItem.setToolTip("text");

应该是:

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

关于c++ - 鼠标悬停在 QGraphicsPixmapItem 上后 Qt 显示工具提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23585128/

相关文章:

Qt 鼠标移动事件未被事件过滤器捕获

qt - 我如何在 Qt 或 CQA 中使用 openssl for symbian?

c++ - QML Component 'Video' 无法播放来自Qt资源文件的视频文件

python - QTableView 不会将预期的 FocusIn/FocusOut 事件发送到 eventFilter

C++ 使用迭代器访问 vector 的指针元素

css - Qt 样式表不会立即应用

c++ - 在 Qt 中的对象之间发送自定义事件而不关联它们

c++ - 从 Python 调用 C/C++?

c++ - g++ 在正常编译时会产生段错误,但在 -g 时不会

c++ - QBoxLayout 的所有者是否成为所有布局小部件的所有者?