Qt实现屏幕底部冒泡效果

在Qt局域网聊天程序的到的东西太多了,最想和大家分享的是关于局域网聊天信息的冒泡,他的设计也不是特别难,我写了一个类分享给大家。

可能各位道友有更好的办法,但希望不要拆台哦。

该类中有一部分适应屏幕分辨率的类,也一并加入。如有不懂的欢迎大家留言。

首先是获取屏幕分辨率,并实现自适应屏幕分辨率。

#ifndef VERDESKTOP_H#define VERDESKTOP_H #include <QObject>#include <QDesktopWidget> class VerDesktop : public QObject{  Q_OBJECTpublic:  explicit VerDesktop(QObject *parent = 0);  float getVerDesktop(); signals: public slots:}; #endif // VERDESKTOP_H
#include "verdesktop.h" VerDesktop::VerDesktop(QObject *parent) : QObject(parent){}float VerDesktop::getVerDesktop(){  QDesktopWidget dw;  float ver=float(dw.screenGeometry().width())/float(1920);  return ver;}

以下是冒泡的代码

#ifndef MESSAGEDIALOG_H#define MESSAGEDIALOG_H#include <QDialog>#include <QPropertyAnimation>#include <QLabel>#include "verdesktop.h"#include <QTimer>#include <QPaintEvent>#include <QPainter>  class MessageDialog : public QDialog{  Q_OBJECTpublic:  float ver;  VerDesktop *v;//适应屏幕分辨率  explicit MessageDialog(QWidget *parent=0);  QLabel *imagelabel;//头像  QLabel *namelabel;//名  void messagedialogseting();//设置  QTimer *timer0;private:  void paintEvent(QPaintEvent *event); public slots:  void timerout();}; #endif // MESSAGEDIALOG_H
#include "messagedialog.h"#include <QApplication>#include <QDesktopWidget>#include <QGraphicsDropShadowEffect>#include <QPalette> MessageDialog::MessageDialog(QWidget *parent):QDialog(parent){  v=new VerDesktop(this);  ver=v->getVerDesktop();  messagedialogseting();  connect(timer0,SIGNAL(timeout()),this,SLOT(timerout()));}void MessageDialog::messagedialogseting()//显现的动画{  QPalette palette(this->palette());  palette.setColor(QPalette::Background,QColor(49,225,215));  setPalette(palette);  setAutoFillBackground(true);  setWindowFlags(Qt::FramelessWindowHint|windowFlags());  QRect rect=QApplication::desktop()->availableGeometry();  setGeometry(rect.width()-250*ver,rect.height()-80*ver,250*ver,80*ver);  QGraphicsDropShadowEffect *effect=new QGraphicsDropShadowEffect(this);  effect->setOffset(10,10);  effect->setBlurRadius(10);  effect->setColor(QColor(50,50,50));  this->setGraphicsEffect(effect);  imagelabel=new QLabel(this);  namelabel=new QLabel(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=new QPropertyAnimation(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=new QTimer(this);  timer0->start(1000);}void MessageDialog::timerout()//消失的动画{  timer0->stop();  QPropertyAnimation *animation0=new QPropertyAnimation(this,"windowOpacity");  animation0->setDuration(500);  animation0->setStartValue(1);  animation0->setEndValue(0);  animation0->start(QAbstractAnimation::DeleteWhenStopped);  connect(animation0,SIGNAL(finished()),this,SLOT(close()));}void MessageDialog::paintEvent(QPaintEvent *event)//做阴影{  const int x=3;  Q_UNUSED(event);  QPainterPath yinying_path;  yinying_path.setFillRule(Qt::WindingFill);  yinying_path.addRect(x,x,this->width()-2*x,this->height()-2*x);  QPainter painter(this);  painter.setRenderHint(QPainter::Antialiasing,true);  QColor color(0,0,0,50);  for(int i=0;i<x;i++)  {    QPainterPath path;    path.setFillRule(Qt::WindingFill);    path.addRect(x-i, x-i, this->width()-(x-i)*2, this->height()-(x-i)*2);    color.setAlpha(150 - sqrt(i)*50);    painter.setPen(color);    painter.drawPath(path);  }}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

如你想要拥有完美无暇的友谊,可能一辈子找不到朋友

Qt实现屏幕底部冒泡效果

相关文章:

你感兴趣的文章:

标签云: