Qt实现屏幕底部冒泡效果
在Qt局域网聊天程序的到的东西太多了,最想和大家分享的是关于局域网聊天信息的冒泡,他的设计也不是特别难,我写了一个类分享给大家。
可能各位道友有更好的办法,但希望不要拆台哦。
该类中有一部分适应屏幕分辨率的类,也一并加入。如有不懂的欢迎大家留言。
首先是获取屏幕分辨率,并实现自适应屏幕分辨率。
#ifndefVERDESKTOP_H #defineVERDESKTOP_H #include#include classVerDesktop:publicQObject { Q_OBJECT public: explicitVerDesktop(QObject*parent=0); floatgetVerDesktop(); signals: publicslots: }; #endif//VERDESKTOP_H
#include"verdesktop.h" VerDesktop::VerDesktop(QObject*parent):QObject(parent) { } floatVerDesktop::getVerDesktop() { QDesktopWidgetdw; floatver=float(dw.screenGeometry().width())/float(1920); returnver; }
以下是冒泡的代码
#ifndefMESSAGEDIALOG_H #defineMESSAGEDIALOG_H #include#include #include #include"verdesktop.h" #include #include #include classMessageDialog:publicQDialog { Q_OBJECT public: floatver; VerDesktop*v;//适应屏幕分辨率 explicitMessageDialog(QWidget*parent=0); QLabel*imagelabel;//头像 QLabel*namelabel;//名 voidmessagedialogseting();//设置 QTimer*timer0; private: voidpaintEvent(QPaintEvent*event); publicslots: voidtimerout(); }; #endif//MESSAGEDIALOG_H
#include"messagedialog.h" #include#include #include #include MessageDialog::MessageDialog(QWidget*parent):QDialog(parent) { v=newVerDesktop(this); ver=v->getVerDesktop(); messagedialogseting(); connect(timer0,SIGNAL(timeout()),this,SLOT(timerout())); } voidMessageDialog::messagedialogseting()//显现的动画 { QPalettepalette(this->palette()); palette.setColor(QPalette::Background,QColor(49,225,215)); setPalette(palette); setAutoFillBackground(true); setWindowFlags(Qt::FramelessWindowHint|windowFlags()); QRectrect=QApplication::desktop()->availableGeometry(); setGeometry(rect.width()-250*ver,rect.height()-80*ver,250*ver,80*ver); QGraphicsDropShadowEffect*effect=newQGraphicsDropShadowEffect(this); effect->setOffset(10,10); effect->setBlurRadius(10); effect->setColor(QColor(50,50,50)); this->setGraphicsEffect(effect); imagelabel=newQLabel(this); namelabel=newQLabel(this); imagelabel->setGeometry(5*ver,15*ver,50*ver,50*ver); namelabel->setGeometry(90*ver,0,150*ver,80*ver); namelabel->setFont(QFont("微软雅黑",15*ver)); namelabel->setAlignment(Qt::AlignCenter); QPropertyAnimation*animation0=newQPropertyAnimation(this,"geometry"); animation0->setDuration(500*ver); animation0->setStartValue(QRect(rect.width(),rect.height()-80*ver,250*ver,80*ver));//起点 animation0->setEndValue(QRect(rect.width()-250*ver,rect.height()-80*ver,250*ver,80*ver));//终点 animation0->start(QAbstractAnimation::DeleteWhenStopped); timer0=newQTimer(this); timer0->start(1000); } voidMessageDialog::timerout()//消失的动画 { timer0->stop(); QPropertyAnimation*animation0=newQPropertyAnimation(this,"windowOpacity"); animation0->setDuration(500); animation0->setStartValue(1); animation0->setEndValue(0); animation0->start(QAbstractAnimation::DeleteWhenStopped); connect(animation0,SIGNAL(finished()),this,SLOT(close())); } voidMessageDialog::paintEvent(QPaintEvent*event)//做阴影 { constintx=3; Q_UNUSED(event); QPainterPathyinying_path; yinying_path.setFillRule(Qt::WindingFill); yinying_path.addRect(x,x,this->width()-2*x,this->height()-2*x); QPainterpainter(this); painter.setRenderHint(QPainter::Antialiasing,true); QColorcolor(0,0,0,50); for(inti=0;i width()-(x-i)*2,this->height()-(x-i)*2); color.setAlpha(150-sqrt(i)*50); painter.setPen(color); painter.drawPath(path); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。