• Qt实现冒泡提示框


    通过QLabel创建类似冒泡方式的提示框(提示框显示位置为父类控件居中位置,具体可根据需要自行修改),鼠标停留提示框界面时查看信息,离开时自动淡化消失的效果;

    头文件定义

    #ifndef _TTipWidget_H_
    #define _TTipWidget_H_
    
    class TTipWidget :public QLabel
    {
        Q_OBJECT
    
    public:
        static TTipWidget &Instance();
        void SetMesseage(const QString &strMessage, const QPoint *pPoint=nullptr);
    
    private:
        TTipWidget();
        ~TTipWidget();
    
        void OnTimer();
        void enterEvent(QEvent *);
        void leaveEvent(QEvent *);
    
    private:
        QWidget *mpParent;
        QTimer  *mpTimer;
        bool     mbEnter;
        int      mnTransparent;
    };
    
    #endif // _TTipWidget_H_

    实例实现

    #include "TTipWidget.h"
    
    TTipWidget::TTipWidget()
        : mpParent(nullptr)
        , mbEnter(false)
        , mnTransparent(200)
    {
        setWindowFlags(Qt::Tool | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
        setAlignment(Qt::AlignCenter);
    
        mpTimer = new QTimer(this);
        connect(mpTimer, &QTimer::timeout, this, &TTipWidget::OnTimer);
    }
    
    TTipWidget::~TTipWidget()
    {
        deleteLater();
    }
    
    void TTipWidget::enterEvent(QEvent *)
    {
        mbEnter       = true;
        mnTransparent = 200;
        setStyleSheet(QString("color:white;font:12px "Microsoft YaHei";border-radius:5px;background-color:rgba(80, 80, 80, %1);").arg(mnTransparent));
    }
    
    void TTipWidget::leaveEvent(QEvent *)
    {
        mbEnter = false;
    }
    
    void TTipWidget::OnTimer()
    {
        if (mbEnter)
        {
            return;
        }
    
        mnTransparent -= 3;
        if (mnTransparent > 0)
        {
            if (mpParent && parentWidget())
            {
                QPoint pt((parentWidget()->width() - width()) >> 1, (parentWidget()->height() - height()) >> 1);
                if (pos() != pt)
                {
                    move(pt);
                }
            }
            setStyleSheet(QString("color:white;font:12px "Microsoft YaHei";border-radius:5px;background-color:rgba(80, 80, 80, %1);").arg(mnTransparent));
        }
        else
        {
            mpTimer->stop();
            setVisible(false);
        }
    }
    
    void TTipWidget::SetMesseage(const QString &strMessage, const QPoint *pPoint)
    {
        if (strMessage.isEmpty())
        {
            return;
        }
            
        QFontMetrics fm1(font());
        setFixedSize(fm1.width(strMessage) + 30, 30);
    
        mpParent = parentWidget();
    
        if (width() > mpParent->width())
        {
            setFixedSize(mpParent->width() - 60, 60);
            setWordWrap(true);
        }
        else
        {
            setWordWrap(false);
        }
    
        setText(strMessage);
    
        if (nullptr != mpParent)
        {
            if (nullptr != pPoint)
            {
                move(mpParent->mapFromGlobal(*pPoint));
                mpParent = nullptr;
            }
            else
            {
                move((mpParent->width() - width()) >> 1, (mpParent->height() - height()) >> 1);
            }
        }
    
        setVisible(true);
        mnTransparent = 200;
        
        mpTimer->start(30);
    }
    
    TTipWidget &TTipWidget::Instance()
    {
        static TTipWidget tipWidget;
        return tipWidget;
    }

    外部引用

    TTipWidget::Instance().setParent(this);   //设置实例的引用者
    TTipWidget::Instance().setVisible(false);
    
    TTipWidget::Instance().SetMesseage(tr("Disappearing tips!"));  //提示信息
  • 相关阅读:
    C#中关于DBNULL的处理方法
    html 点击复制
    AJAX的简洁写法
    PHP 数组模糊查询
    PHP二维数组搜索返回数组
    php 数组排序得方法
    PHPExcel的使用
    使用PHPword中文乱码并且下载的方法
    关于多图上传的修改的操作
    把一个表里的两列或者三列合并为一行
  • 原文地址:https://www.cnblogs.com/sz-leez/p/7155714.html
Copyright © 2020-2023  润新知