您的位置:首页 > 编程语言 > Qt开发

Qt之自定义提示框二(右下角冒泡)

2014-03-03 19:36 239 查看
网页右下角上经常会出现一些提示性的信息,B/S有的东西,C/S当然也可以有,就像QQ的消息提示一样!

实现一个类似的东西并不困难,只要想明白原理实现起来就很简单了!



实现原理:

(1)显示:右下角缓慢弹出,定时器启动,逐渐改变位置即可,到达相应位置,停止计时器

(2)驻留:定时器启动,让界面停留一定的时间,相应的时间过后停止定时器

(3)退出:可以直接退出,也可以采用改变透明度的形式模糊退出

好了,既然都已经考虑清楚,那就开始我们的代码之旅吧!



标题栏:

#include "message_title.h"

#include "setting.h"

MessageTitle::MessageTitle(QWidget *parent)

: QWidget(parent)

{

setFixedHeight(30);

title_label = new QLabel();

close_button = new PushButton();

layout = new QHBoxLayout();

title_label->setObjectName(QString::fromUtf8("labelOne"));

QFont title_font = title_label->font();

title_font.setBold(true);

title_label->setFont(title_font);

close_button->loadPixmap("tipclose");

close_button->setToolTip(tr("close"));

layout->addWidget(title_label);

layout->addStretch();

layout->addWidget(close_button);

layout->setMargin(0);

setLayout(layout);

connect(close_button, SIGNAL(clicked()), this, SIGNAL(myClose()));

}

void MessageTitle::paintEvent(QPaintEvent *)

{

QLinearGradient linear(rect().topLeft(), rect().bottomRight());

linear.setColorAt(0, QColor(55, 135, 215));

linear.setColorAt(0.5, QColor(140, 120, 185));

linear.setColorAt(1, QColor(55, 135, 215));

QPainter painter(this);

painter.setBrush(QBrush(linear));

painter.setPen(Qt::NoPen);

painter.drawRect(rect());

}

void MessageTitle::setTitleText(QString title)

{

title_label->setText(title);

}



弹出框界面:

#include "message_widget.h"

MessageWidget::MessageWidget(QWidget *parent)

: QWidget(parent)

{

setFixedSize(300, 180);

setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);

message_title = new MessageTitle();

content_label = new QLabel();

icon_label = new QLabel();

timer_show = new QTimer(this);

timer_stay = new QTimer(this);

timer_close = new QTimer(this);

time_count = 0;

transparent = 1.0;

desktop_height = QApplication::desktop()->height();

icon_label->setFixedSize(64, 64);

content_label->setWordWrap(true);

content_label->setAlignment(Qt::AlignTop);

QVBoxLayout *v_layout = new QVBoxLayout();

v_layout->addWidget(icon_label);

v_layout->addStretch();

QVBoxLayout *v_layout2 = new QVBoxLayout();

QSpacerItem *spacerItem = new QSpacerItem(20, 20, QSizePolicy::Minimum, QSizePolicy::Minimum);

v_layout2->addSpacerItem(spacerItem);

v_layout2->addWidget(content_label);



QHBoxLayout *h_layout = new QHBoxLayout();

h_layout->addLayout(v_layout);

h_layout->addLayout(v_layout2);

QMargins margins = h_layout->contentsMargins();

margins.setTop(20);

margins.setLeft(10);

margins.setRight(10);

h_layout->setContentsMargins(margins);

QVBoxLayout *main_layout = new QVBoxLayout();

main_layout->setMargin(0);

main_layout->addWidget(message_title);

main_layout->addLayout(h_layout);

setLayout(main_layout);

connect(timer_show, SIGNAL(timeout()), this, SLOT(myMove()));

connect(timer_stay, SIGNAL(timeout()), this, SLOT(myStay()));

connect(timer_close, SIGNAL(timeout()), this, SLOT(myClose()));

connect(message_title, SIGNAL(myClose()), this, SLOT(close()));

}

void MessageWidget::showMsg(QString title, QString content)

{

QPixmap pixmap(":/icon/win");

icon_label->setPixmap(pixmap);

message_title->setTitleText(" " + title);

content_label->setText(" " + content);

this->showMessage();

}

void MessageWidget::paintEvent(QPaintEvent *)

{

QBitmap bitmap(this->size());

bitmap.fill(Qt::white);

QPainter painter(this);

painter.setBrush(QBrush(QColor(250, 240, 230)));

painter.setPen(QPen(QBrush(QColor(55, 135, 215)), 6));

painter.drawRoundedRect(bitmap.rect(), 5, 5);

setMask(bitmap);

}

void MessageWidget::showMessage()

{

time_count = 0;

transparent = 1.0;

desktop_height = QApplication::desktop()->height();

timer_show->stop();

timer_stay->stop();

timer_close->stop();

setWindowOpacity(1);

QDesktopWidget *desktop = QApplication::desktop();

desk_rect = desktop->availableGeometry();

normal_point.setX(desk_rect.width() - rect().width());

normal_point.setY(desk_rect.height() - rect().height());

move(normal_point.x(), normal_point.y());

showNormal();

timer_show->start(5);

}

void MessageWidget::myMove()

{

desktop_height--;

move(normal_point.x(), desktop_height);

if(desktop_height <= normal_point.y())

{

timer_show->stop();

timer_stay->start(1000);

}

}

void MessageWidget::myStay()

{

time_count++;

if(time_count >= 9)

{

timer_stay->stop();

timer_close->start(200);

}

}

void MessageWidget::myClose()

{

transparent -= 0.1;

if(transparent <= 0.0)

{

timer_close->stop();

this->close();

}

else

{

setWindowOpacity(transparent);

}

}



效果:





注:

技术在于交流、沟通,转载请注明出处并保持作品的完整性。

作者:╰☆奋斗ing❤孩子` 原文:http://blog.sina.com.cn/s/blog_a6fb6cc90101dtav.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: