Qt中实现屏幕底部冒泡的方法

本文介绍了一种在Qt应用程序中实现自适应屏幕分辨率的聊天消息冒泡对话框的方法。通过创建自定义对话框类,实现了消息对话框的显示动画及阴影效果,同时还考虑了不同屏幕分辨率下的适配问题。

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

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

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


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

#ifndef VERDESKTOP_H
#define VERDESKTOP_H

#include <QObject>
#include <QDesktopWidget>

class VerDesktop : public QObject
{
    Q_OBJECT
public:
    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_OBJECT
public:
    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);
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值