Qt實現屏幕底部冒泡效果
更新時間:2020年08月20日 10:05:32 作者:番茄炒蛋不要蛋
這篇文章主要為大家詳細介紹了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); } }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
您可能感興趣的文章:
相關文章
Java?C++?算法題解leetcode652尋找重復子樹
這篇文章主要為大家介紹了Java?C++?算法題解leetcode652尋找重復子樹示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-09-09FFmpeg實戰(zhàn)之利用ffplay實現自定義輸入流播放
ffplay是FFmpeg提供的一個極為簡單的音視頻媒體播放器,可以用于音視頻播放、可視化分析。本文將利用ffplay實現自定義輸入流播放,需要的可以參考一下2022-12-12詳解C++中StringBuilder類的實現及其性能優(yōu)化
在Java和C#中,StringBuilder可以創(chuàng)造可變字符序列來動態(tài)地擴充字符串,那么在C++中我們同樣也可以實現一個StringBuilder并且用來提升性能,下面就來詳解C++中StringBuilder類的實現及其性能優(yōu)化2016-05-05