• Qt5制作鼠标悬停显示Hint的ToolTip


    在日常生活中的使用的软件中,我们经常会遇到这样的情况。 
    我们在网页上,有些网页链接的文字(比如文章标题,知乎问题标题,百度的词条等)因为太长了,而显示不出来,但是鼠标悬停在上面的时候就可以显示出来。 
    我们在QQ上或者某些输入框内,我们不知道应该输入什么内容,但是鼠标如果悬停在输入框内的时候,会产生一个友好信息的hint。 
    实现方法,就是我们今天的ToolTip设置。

    代码如下: 
    ItemWidget.h

    #ifndef ITEMWIDGET_H
    #define ITEMWIDGET_H
    
    #include <QWidget>
    #include <QLabel>
    #include <QPushButton>
    #include <QVBoxLayout>
    #include <QHBoxLayout>
    
    //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:
    private:
        QLabel *labelIcon;
        QLabel *labelName;
        QLabel *labelInfo;
    
        QHBoxLayout *horLayout;
        QVBoxLayout *verlayout;
    protected:
        bool event(QEvent *e);
    };
    
    #endif // ITEMWIDGET_H
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    ItemWidget.cpp

    #include "itemwidget.h"
    #include "global.h"
    #include "ctooltip.h"
    
    #include <QEvent>
    #include <QCursor>
    
    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);
    }
    
    // 鼠标悬停的时候,显示当前用户简要信息
    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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53

    然后是CToolTip自定义样式部分: 
    CToolTip.h

    #ifndef CTOOLTIP_H
    #define CTOOLTIP_H
    
    #include <QWidget>
    #include <QLabel>
    #include <QPushButton>
    #include <QGroupBox>
    #include <QVBoxLayout>
    #include <QHBoxLayout>
    
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    CToolTip.cpp

    #include "ctooltip.h"
    #include <QDebug>
    #include <QApplication>
    #include <QDesktopWidget>
    
    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; }");
    
        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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68

    当然当然,在大多数的组件上面都有一个成员函数setToolTip(QSTring& ..) 
    这个就可以实现简单的友好信息提示功能了。

    http://blog.csdn.net/u013007900/article/details/50224873

  • 相关阅读:
    Value '0000-00-00' can not be represented as java.sql.Date
    mysql建表设置两个默认CURRENT_TIMESTAMP的技巧
    PowerDesigner 的mysql PDM 的COMMENT注释
    tomcat配置及优化
    Tomcat7调优及JVM性能优化for Linux环境
    maven混淆Java代码
    通过Maven配置测试环境和开发环境连接不同的数据库
    删除电脑中用强制删除不能删除的bat命令脚本
    在Linux中设置共享目录
    ftp以及smb的配置
  • 原文地址:https://www.cnblogs.com/findumars/p/5107629.html
Copyright © 2020-2023  润新知