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

来源:互联网 发布:centos 查看目录 编辑:程序博客网 时间:2024/06/13 17:30

    网页右下角上经常会出现一些提示性的信息,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。
0 0
原创粉丝点击