Qt 自定义提示框 右下角冒泡

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值