请选择 进入手机版 | 继续访问电脑版
开启左侧

[转载] Qt交互Ⅲ:自定义提示框之类似QMessageBox

[复制链接]
小思 发表于 2017-7-25 14:47:43 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
本帖最后由 小思 于 2017-7-25 14:50 编辑

Qt中经常会用到提示框,用于交互操作!QMessageBox是被大多数人用到的,用起来是很方便,但是控件类型、大小、布局、样式、往往不是开发者想要的,如果使用一套不经过样式处理的界面交给用户,那么结果可想而知。。。
    简单举个例子吧!
   
  1. QMessageBox::information(NULL, QString("title"), QString("I am information"));
复制代码

效果:
   
1.jpeg



    关于QMessageBox的应用不再多提!因为主要说明的是自定义提示框。。。
    以下是自定义提示框的代码,有图有真相!提示框大部分都采用模态的形式,关于模态也不再多提!所以父类为QDialog,通过exec()返回值QDialog::Accepted或QDialog::Rejected来进行判断执行相应的事件。

  1. #include "msg_box.h"
  2. MsgBox::MsgBox(QWidget *parent)
  3. : QDialog(parent)
  4. {
  5.   this->resize(320, 160);
  6.   //获取主界面的宽度
  7.   int width = this->width();
  8.   int height = this->height();
  9.   //初始化为未按下鼠标左键
  10.   mouse_press = false;
  11.   //设置标题栏隐藏
  12.   this->setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog);

  13.   close_button = new PushButton(this);
  14.   close_button->loadPixmap("tipclose");
  15.   close_button->setGeometry(width-30, 0, 30, 30);

  16.   //设置标题
  17.   title_label = new QLabel(this);
  18.   title_label->setObjectName(QString::fromUtf8("labelOne"));
  19.   QFont font = title_label->font();
  20.   font.setBold(true);
  21.   title_label->setFont(font);
  22.   title_label->setGeometry(0, 0, width-50, 30);
  23.   //设置提示图片
  24.   msg_label = new QLabel(this);
  25.   msg_label->setGeometry(20, 50, 36, 36);
  26.   msg_label->setScaledContents(true);
  27.   //设置提示信息,让QLabel能够自动判断并换行显示:
  28.   ask_label = new QLabel(this);
  29.   ask_label->setGeometry(65, 60, width-100, 25*2);
  30.   ask_label->setWordWrap(true);
  31.   ask_label->setAlignment(Qt::AlignTop);

  32.   check_box = new QCheckBox(this);
  33.   check_box->setGeometry(10, height - 35, 160, 25);
  34.   check_box->setHidden(true);
  35.   cancel_button = new QPushButton(this);
  36.   cancel_button->resize(70, 25);
  37.   cancel_button->move(width - cancel_button->width() - 10, height - 35);
  38.   ok_button = new QPushButton(this);
  39.   ok_button->resize(70, 25);
  40.   ok_button->move(width - ok_button->width() - cancel_button->width() - 20, height - 35);
  41.   check_box->setStyleSheet("background:transparent;");
  42.   ok_button->setObjectName(QString::fromUtf8("pushButtonTwo"));
  43.   cancel_button->setObjectName(QString::fromUtf8("pushButtonTwo"));

  44.   QObject::connect(ok_button, SIGNAL(clicked()), this, SLOT(okOperate()));
  45.   QObject::connect(close_button, SIGNAL(clicked()), this, SLOT(cancelOperate()));
  46.   QObject::connect(cancel_button, SIGNAL(clicked()), this, SLOT(cancelOperate()));
  47.   this->translateLanguage();
  48. }
  49. void MsgBox::translateLanguage()
  50. {
  51.   close_button->setToolTip(tr("close"));
  52.   check_box->setText(tr("remember"));
  53.   ok_text = tr("ok");
  54.   cancel_text = tr("cancel");
  55. }
  56. void MsgBox::setInfo(QString title_info, QString info, QPixmap pixmap, bool is_check_hidden, bool is_ok_hidden)
  57. {
  58.   title_label->setText(QString("  ") + title_info);
  59.   //设置提示信息
  60.   ask_label->setText(info);
  61.   msg_label->setPixmap(pixmap);
  62.   //是否隐藏复选框
  63.   check_box->setChecked(false);
  64.   check_box->setHidden(is_check_hidden);
  65.   //是否隐藏确定按钮
  66.   ok_button->setHidden(is_ok_hidden);
  67.   if(is_ok_hidden)
  68.   {
  69.     cancel_button->setText(ok_text);
  70.   }
  71.   else
  72.   {
  73.     ok_button->setText(ok_text);
  74.     cancel_button->setText(cancel_text);
  75.   }
  76.   //设置默认按钮为取消按钮
  77.   cancel_button->setFocus();
  78. }
  79. void MsgBox::paintEvent(QPaintEvent *)
  80. {
  81.   QPainter painter(this);
  82.   painter.drawPixmap(rect(), QPixmap(":/icon/tip"));
  83.   QBitmap bitmap(this->size());
  84.   QPainter painter2(&bitmap);
  85.   painter2.fillRect(bitmap.rect(), Qt::white);
  86.   painter2.setBrush(QColor(0, 0, 0));
  87.   painter2.drawRoundedRect(rect(), 4, 4);
  88.   setMask(bitmap);
  89. }
  90. void MsgBox::mousePressEvent( QMouseEvent * event )
  91. {
  92.   //只能是鼠标左键移动和改变大小
  93.   if(event->button() == Qt::LeftButton)
  94.   {
  95.     mouse_press = true;
  96.   }
  97.   //窗口移动距离
  98.   move_point = event->globalPos() - pos();
  99. }
  100. void MsgBox::mouseReleaseEvent( QMouseEvent *)
  101. {
  102.   mouse_press = false;
  103. }
  104. void MsgBox::mouseMoveEvent(QMouseEvent *event)
  105. {
  106.   //移动窗口
  107.   if(mouse_press)  
  108.   {
  109.     QPoint move_pos = event->globalPos();
  110.     move(move_pos - move_point);
  111.   }
  112. }
  113. void MsgBox::okOperate()
  114. {
  115.   bool is_hidden = check_box->isHidden();
  116.   if(!is_hidden)
  117.   {
  118.     bool is_checked = check_box->isChecked();
  119.     emit msgChecked(is_checked, true);
  120.   }
  121.   this->accept();
  122. }
  123. void MsgBox::cancelOperate()
  124. {
  125.   bool is_check_hidden = check_box->isHidden();
  126.   bool is_ok_hidden = ok_button->isHidden();
  127.   if(!is_check_hidden)
  128.   {
  129.     bool is_checked = check_box->isChecked();
  130.     if(!is_ok_hidden)
  131.     {
  132.       emit msgChecked(is_checked, false);
  133.     }
  134.    else
  135.    {
  136.      emit okMessageHidden(is_checked);
  137.    }
  138.   }
  139.   this->reject();
  140. }
复制代码


效果图:
  1. MsgBox *msg_box = new MsgBox();
  2. msg_box->setInfo(QString("文件删除"), QString("确实要把文件放入回收站吗?"), QPixmap(":/icon/attention"), true, false);
  3. msg_box->exec();
复制代码
2.jpeg


MsgBox *msg_box2 = new MsgBox();
msg_box2->setInfo(QString("重命名"), QString("文件名不能包含下列任何字符:\n     \\ / : * ? \" < > |"), QPixmap(":/icon/attention"), true, true);
msg_box2->exec();
3.jpeg

MsgBox *msg_box3 = new MsgBox();
msg_box3->setInfo(QString("批量文件删除"), QString("确实要把所有文件放入回收站吗?"), QPixmap(":/icon/attention"), false, false);
msg_box3->exec();

4.jpeg


    界面样式林林总总,只有想不到的,没有做不到的!实现方式也不尽相同,界面样式可以通过图片设计,也可以通过Qt样式自行实现,不同的人可以想象出维纳斯双臂的各种美的姿势。所以,具体实现细节还得由设计者根据实际情况来定!


注:
    技术在于交流、沟通,转载请注明出处并保持作品的完整性。
    作者:╰☆奋斗ing❤孩子`  原文:
http://blog.sina.com.cn/s/blog_a6fb6cc90101dta3.html

越努力,越幸运。
所以,请努力成为更好的自己!

精彩评论3

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

发布主题
阅读排行 更多
广告位
0351-8210788
周一至周日 9:00-18:00
意见反馈:mind@unigress.com
关注我们

扫一扫关注我们

Powered by Discuz! X3.4 Licensed  © 2001-2013 Comsenz Inc.( 晋ICP备12005011 )