网页右下角上经常会出现一些提示性的信息,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);
}
}