Qt浅谈之四十八窗口下方弹出提示信息

一、简介

      在项目中一般都会弹出新的子对话框显示提示信息,但对于一些因后台数据变化引发的提示还是在窗口下方弹出提示信息比较合理。点击按钮弹出提示信息,当鼠标放在提示信息对话框上时,暂停动画可长时间查看提示信息。

 

二、详解

1、代码

 

(1)faderwidget.h

#ifndef FADERWIDGET_H
#define FADERWIDGET_H
#include <QtGui>

class faderwidget : public QWidget
{
    Q_OBJECT
public:
    enum warning_type {
        error = 1, warning = 2, normal = 3
    };

    explicit faderwidget(QWidget *parent = 0);
    void showWarning(const warning_type &type, const QString &contents);
    void fixWarning(const bool &fix);
    void setMainWidget(QWidget* win);

private:
    void setFixed(const bool &fix);
    bool isFixed() { return _fixed; }

protected:
    void paintEvent(QPaintEvent *event);
    void enterEvent(QEvent *);
    void leaveEvent(QEvent *);

private:
    QTimeLine *timeline;
    int changenumber;
    qreal view_width;
    qreal view_height;
    qreal picture_heigth;
    int status;
    int tip_change_rate;
    QString _content;

    QPixmap _tipsBox_error_left;
    QPixmap _tipsBox_error_center;
    QPixmap _tipsBox_error_right;
    QPixmap _tipsBox_note_left;
    QPixmap _tipsBox_note_center;
    QPixmap _tipsBox_note_right;
    QPixmap _tipsBox_succeed_left;
    QPixmap _tipsBox_succeed_center;
    QPixmap _tipsBox_succeed_right;
    bool _running;
    bool _fixed;
    QWidget* mainWidget;

signals:

private slots:
    void fade_on_fade_in(int counter);
    void receiveStatus(int,int,QString);
    void timeFinished();
};

#endif // FADERWIDGET_H

(2)faderwidget.cpp

#include "faderwidget.h"

faderwidget::faderwidget(QWidget *parent)
    : QWidget(parent)
    , _running(false)
    , _fixed(false)
    , status(3)
{
    if (parent) {
        mainWidget = parent;
        this->view_width = mainWidget->width();
        this->view_height = mainWidget->height();
        setGeometry(QRect(0, -33, mainWidget->width(), 33));
    }
    setWindowFlags(Qt::CustomizeWindowHint|Qt::FramelessWindowHint);
    setStyleSheet("background-color:rgba(255,255,255,0)");
    QTextCodec *codec = QTextCodec::codecForName("System");
    QTextCodec::setCodecForLocale(codec);
    QTextCodec::setCodecForCStrings(codec);
    QTextCodec::setCodecForTr(codec);

    timeline=new QTimeLine(3000, this);
    timeline->setFrameRange(0,300);
    changenumber = 0;
    picture_heigth = 30;

    _tipsBox_error_center.load(":/tipsBox_error_center.png");
    _tipsBox_note_center.load(":/tipsBox_note_center.png");
    _tipsBox_succeed_center.load(":/tipsBox_succeed_center.png");
    connect(timeline,SIGNAL(frameChanged(int)),this,SLOT(fade_on_fade_in(int)));
    connect(timeline, SIGNAL(finished()), this, SLOT(timeFinished()));
    hide();
}

void faderwidget::showWarning(const faderwidget::warning_type &type, const QString &contents)
{
    receiveStatus(type, 20 , contents);
    this->setFocus();
}
void faderwidget::fixWarning(const bool &fix)
{
    if (fix)  setFixed(fix);
}

void faderwidget::setMainWidget(QWidget *win)
{
    if (win) {
        mainWidget = win;
        this->view_width = mainWidget->width();
        this->view_height = mainWidget->height();
        setGeometry(QRect(0, -33, mainWidget->width(), 33));
    }
}

void faderwidget::setFixed(const bool &fix)
{
    _fixed = fix;
    if (!fix && timeline->state() == QTimeLine::Paused)
        timeline->resume();
}

void faderwidget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    QPixmap pixmapTwo;
    QString string;

    switch (status){
    case 1:
        pixmapTwo = _tipsBox_error_center;
        string=QString(tr("%1").arg(_content));
        break;
       case 2:
        pixmapTwo = _tipsBox_note_center;
        string=QString(tr("%1").arg(_content));
         break;
       case 3:
        pixmapTwo = _tipsBox_succeed_center;
        string=QString(tr("%1").arg(_content));
        break;
    }

    painter.setPen(QPen(QColor(255,255,255)));
    pixmapTwo = pixmapTwo.scaled(view_width,picture_heigth);
    painter.drawPixmap(0,0,view_width,picture_heigth,pixmapTwo);
    int textWidth = painter.fontMetrics().width(string);
    if(textWidth < 1)
        return;
    if(textWidth < view_width)
        painter.drawText((view_width-textWidth)/2,20,string);
    if(textWidth > view_width)
        painter.drawText(0,20,string);
}

void faderwidget::fade_on_fade_in(int counter)
{
    this->setVisible(true);
    changenumber=counter;

    if(changenumber<=10)
    {
        this->move(0,view_height-changenumber*picture_heigth/10);
    }
    else if(changenumber<250)
    {
        this->move(0,view_height-picture_heigth);
        if (_fixed) {
            timeline->setPaused(true);
        }
    }
    else if(changenumber<300)
    {
        this->move(0,view_height-3*picture_heigth+changenumber*picture_heigth/100);
    }
    else
    {
     timeline->stop();
     this->setVisible(false);
    }
}

void faderwidget::receiveStatus(int status,int tip_change_rate,QString content)
{
    if (_fixed)  return;
    timeline->stop();
    this->status = status;
    this->tip_change_rate = tip_change_rate;
    timeline->setUpdateInterval(this->tip_change_rate);
    timeline->setDuration(300*(this->tip_change_rate));
    timeline->setCurrentTime(0);
    this->_content=content;
    timeline->start();
    _running = true;
}

void faderwidget::timeFinished()
{
    _running = false;
}
void faderwidget::enterEvent(QEvent *)
{
    if (_running)  timeline->setPaused(true);
}

void faderwidget::leaveEvent(QEvent *)
{
    if (_running)  timeline->resume();
}

(3)widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include "faderwidget.h"

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();

private slots:
    void slotClicked();

private:
    faderwidget *fw;
    QPushButton *btn;
};

#endif // WIDGET_H

(4)widget.cpp

#include "widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent, Qt::FramelessWindowHint)
{
    resize(400, 400);
    this->setStyleSheet("background:#19649F");
    fw = new faderwidget(this);
    btn = new QPushButton(this);
    btn->move(150, 20);
    btn->setText(tr("click"));
    btn->setStyleSheet("background:yellow;color:#FF0000");
    btn->setFocusPolicy(Qt::NoFocus);
    connect(btn, SIGNAL(clicked()), this, SLOT(slotClicked()));
    move(100, 100);
}

Widget::~Widget()
{

}

void Widget::slotClicked()
{
    fw->showWarning(faderwidget::warning, tr("the information tips"));
    //fw->fixWarning(true);
    fw->show();
}

(5)main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

 

三、总结

(1)上述代码还不完善,还需进一步优化,仅提供思路参考。
(2)若有问题或建议,请留言,在此感谢!

 

 

 

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乌托邦2号

博文不易,支持的请给予小小打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值