博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Qt浅谈之四十八窗口下方弹出提示信息
阅读量:4180 次
发布时间:2019-05-26

本文共 6372 字,大约阅读时间需要 21 分钟。

一、简介

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

 

二、详解

1、代码

 

(1)faderwidget.h

#ifndef FADERWIDGET_H#define FADERWIDGET_H#include 
class faderwidget : public QWidget{ Q_OBJECTpublic: 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 
#include "faderwidget.h"class Widget : public QWidget{ Q_OBJECTpublic: 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 
int main(int argc, char *argv[]){ QApplication a(argc, argv); Widget w; w.show(); return a.exec();}

 

三、总结

(1)上述代码还不完善,还需进一步优化,仅提供思路参考。

(2)若有问题或建议,请留言,在此感谢!

 

 

 

你可能感兴趣的文章
Redis最常被问到知识点总结
查看>>
这才是微服务拆分的正确姿势,值得学习!
查看>>
MySQL中一条SQL是如何执行的?
查看>>
MySQL的索引是什么?怎么优化?
查看>>
2万字长文包教包会 JVM 内存结构
查看>>
不懂 spring 就彻底放弃 Java 吧!
查看>>
从MySQL高可用架构看高可用架构设计
查看>>
可以秒杀全场的SpringCloud微服务电商实战项目,文档贼全!
查看>>
java架构之路(多线程)synchronized详解以及锁的膨胀升级过程
查看>>
java架构之路(多线程)AQS之ReetrantLock显示锁的使用和底层源码解读
查看>>
百度现场面试:JVM+算法+Redis+数据库!(三面)
查看>>
java架构之路(多线程)JMM和volatile关键字
查看>>
创业感悟:技术兄弟为什么一直没有起来
查看>>
(转载)linux命令之十八locate 命令
查看>>
Linux发行光盘(红旗 5.0 SP2发行版,已不使用仅参考)
查看>>
linux下如何将文件打包、压缩并分割成制定大小
查看>>
CentOS6.5升级内核到3.10.28
查看>>
linux内核补丁安装和编译安装
查看>>
(转载)linux命令之十九find 命令
查看>>
(转载)linux命令之二十 find命令之exec
查看>>