Qt5制作鼠标悬停显示相应信息的ToolTip

 来到这里小伙伴,应该已经知道它是干什么的吧,相当于当你指向图标时,给出你一些简要的提示信息。网上有类似资源,但可能无法立即执行,新入门的伙伴可以看看我的代码哈。

ctooltip.h

#ifndef CTOOLTIP_H
#define CTOOLTIP_H

#include 
#include 
#include 
#include 
#include 
#include 

class CToolTip : public QWidget
{
    Q_OBJECT
public:
    explicit CToolTip(QWidget *parent = 0);
    void showMessage(const QPixmap *pixmap, QString name, QString info, QPoint point);
    void showMessage(const QPixmap *pixmap, QPoint point);
signals:

public slots:

private:
    QLabel *labelIcon;
    QLabel *labelName;
    QLabel *labelInfo;

    QHBoxLayout *horLayout;
    QVBoxLayout *verlayout;

    QGroupBox *groupBox;

protected:
    void hoverEvent(QHoverEvent *);
};

#endif // CTOOLTIP_H

ctooltip.cpp

#include "ctooltip.h"
#include 
#include 
#include 

CToolTip::CToolTip(QWidget *parent) :
    QWidget(parent)
{
    this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint);
    this->resize(200, 100); ;

    this->setObjectName("CToolTip");
    this->setStyleSheet("QWidget#CToolTip {border: 2px solid green; background-color: skyblue;}");

    groupBox = new QGroupBox(this);
    groupBox->setGeometry(10, 10, 180, 80);
    groupBox->setTitle("用户信息");

    labelIcon = new QLabel(groupBox);
    labelName = new QLabel(groupBox);
    labelInfo = new QLabel(groupBox);

    verlayout = new QVBoxLayout();
    verlayout->setContentsMargins(0, 0, 0, 0);
    verlayout->addWidget(labelName);
    verlayout->addWidget(labelInfo);

    horLayout = new QHBoxLayout(groupBox);
    horLayout->setContentsMargins(10, 10, 10, 10);
    horLayout->addWidget(labelIcon, 1, Qt::AlignTop);
    horLayout->addLayout(verlayout, 4);
}

// 显示ToolTip消息
void CToolTip::showMessage(const QPixmap *pixmap, QString name, QString info, QPoint point) {
    labelIcon->setPixmap(*pixmap);
    labelName->setText(name);
    labelInfo->setText(info);

    // 重新定义CToolTip的坐标
    int rectX;
    int rectY;
    if (point.rx() < 200) {
        rectX = point.rx() + 10;
    } else {
        rectX = point.rx() - 240;
    }
    rectY =  point.ry();
    move(QPoint(rectX, rectY));
    QWidget::show();
}

// 显示ToolTip消息
void CToolTip::showMessage(const QPixmap *pixmap, QPoint point) {
    labelIcon->setPixmap(*pixmap);

    labelName->setText("自己想办法获取");
    labelInfo->setText("自己动手,丰衣足食");
    // 此处可以作为QToolTip样式进行显示
    move(point);
    QWidget::show();
}

// 当鼠标进入事件时,让界面隐藏掉
void CToolTip::hoverEvent(QHoverEvent *) {
    hide();
}

itemwidget.h

#ifndef ITEMWIDGET_H
#define ITEMWIDGET_H

#include 
#include 
#include 
#include 
#include 
#include "ctooltip.h"

//class CLabel;

class ItemWidget : public QWidget
{
    Q_OBJECT
public:
    explicit ItemWidget(QWidget *parent = 0);
    void setText(QPixmap pixmap, QString name, QString info);
    void setText(QString info);
signals:

public slots:
    void doprocessToolTip(CToolTip*);
private:
    QLabel *labelIcon;
    QLabel *labelName;
    QLabel *labelInfo;

    QHBoxLayout *horLayout;
    QVBoxLayout *verlayout;
    CToolTip *g_toolTip;
protected:
    bool event(QEvent *e);
};

#endif // ITEMWIDGET_H

itemwidget.cpp

#include "itemwidget.h"
//#include "global.h"
#include 
#include 
#include 

ItemWidget::ItemWidget(QWidget *parent) :
    QWidget(parent)
{
    labelIcon = new QLabel(this);
    labelName = new QLabel(this);
    labelName->setStyleSheet("QLabel{color: green; font: 13pt bold;}");
    labelInfo = new QLabel(this);
    labelInfo->setStyleSheet("QLabel{color: gray;}");

    verlayout = new QVBoxLayout();
    verlayout->setContentsMargins(0, 0, 0, 0);
    verlayout->addWidget(labelName);
    verlayout->addWidget(labelInfo);

    horLayout = new QHBoxLayout(this);
    horLayout->setContentsMargins(2, 2, 2, 2);
    horLayout->addWidget(labelIcon, 1, Qt::AlignTop);
    horLayout->addLayout(verlayout, 4);
}

void ItemWidget::setText(QPixmap pixmap, QString name, QString info) {
    labelIcon->setPixmap(pixmap);
    labelName->setText(name);
    labelInfo->setText(info);
}

// 测试用的
void ItemWidget::setText(QString info) {
    labelIcon->setText(info);
}

void ItemWidget::doprocessToolTip(CToolTip * tooltip)
{
    g_toolTip=tooltip;
}

// 鼠标悬停的时候,显示当前用户简要信息
bool ItemWidget::event(QEvent *e) {
    if (e->type() == QEvent::ToolTip) {
        qDebug() << "tool tip show";
        g_toolTip->showMessage(labelIcon->pixmap(),
                               labelName->text(),
                               labelInfo->text(),
                               QCursor::pos());
    } else if (e->type() == QEvent::Leave) {
        qDebug() << "tool tip leave";
        g_toolTip->hide();
    }
    return QWidget::event(e);
}

此处注意为了让我们的工具类ctooltip 在mainwidegt和itemwidget使用同步,我们采用发送信号的方式

mainwidget.h

#ifndef MAINWIDGET_H
#define MAINWIDGET_H

#include 
#include "ctooltip.h"
class CToolTip;

namespace Ui {
class MainWidget;
}

class MainWidget : public QWidget
{
    Q_OBJECT

public:
    explicit MainWidget(QWidget *parent = 0);
    ~MainWidget();
signals:
    void signalToolTip(CToolTip *);
private:
    Ui::MainWidget *ui;
    CToolTip *ctoolTip;
};

#endif // MAINWIDGET_H

mainwidget.cpp

#include "mainwidget.h"
#include "ui_mainwidget.h"
#include "itemwidget.h"


#include 

//CToolTip *g_toolTip;

MainWidget::MainWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MainWidget)
{
//    this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint);

    ui->setupUi(this);
    ctoolTip = new CToolTip();
    // 定义全局的ToolTip,方便使用
    //g_toolTip = ctoolTip;

    // 本行代码主要针对ListWidgetItem右键点击时才生效的
    ui->listWidget->setMouseTracking(true);

    // 添加测试数据
    for (int i = 0; i < 10; i++) {
        ItemWidget *itemWidget = new ItemWidget(ui->listWidget);
        connect(this,SIGNAL(signalToolTip(CToolTip*)),itemWidget,SLOT(doprocessToolTip(CToolTip*)));
        emit signalToolTip(ctoolTip);
        itemWidget->setText(QPixmap(QString(":/images/1.jpg")),
                                    QString("标题"), QString("写点什么呢: %1?").arg(i));
        QListWidgetItem *listItem = new QListWidgetItem(ui->listWidget);
        // 此处的size如果不设置,界面被压缩了看不出ItemWidget的效果,高度一定要设置
        listItem->setSizeHint(QSize(200, 40));
        ui->listWidget->setItemWidget(listItem, itemWidget);
    }
}

MainWidget::~MainWidget()
{
    delete ui;
}

 

你可能感兴趣的:(QT(C++))