Qt之自定义提示框(类似QMessageBox)

    Qt中经常会用到提示框,用于交互操作!QMessageBox是被大多数人用到的,用起来是很方便,但是控件类型、大小、布局、样式、往往不是开发者想要的,如果使用一套不经过样式处理的界面交给用户,那么结果可想而知。。。

    简单举个例子吧!

    QMessageBox::information(NULL, QString("title"), QString("I am information"));

效果:

   



    关于QMessageBox的应用不再多提!因为主要说明的是自定义提示框。。。

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

 

#include "msg_box.h" 

MsgBox::MsgBox(QWidget *parent)
 : QDialog(parent)
{
  this->resize(320, 160);

  //获取主界面的宽度
  int width = this->width();
  int height = this->height();

  //初始化为未按下鼠标左键
  mouse_press = false;

  //设置标题栏隐藏
  this->setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog);
 
  close_button = new PushButton(this);
  close_button->loadPixmap("tipclose");
  close_button->setGeometry(width-30, 0, 30, 30); 
 
  //设置标题
  title_label = new QLabel(this);
  title_label->setObjectName(QString::fromUtf8("labelOne"));
  QFont font = title_label->font();
  font.setBold(true);
  title_label->setFont(font);
  title_label->setGeometry(0, 0, width-50, 30);

  //设置提示图片
  msg_label = new QLabel(this);
  msg_label->setGeometry(20, 50, 36, 36);
  msg_label->setScaledContents(true);

  //设置提示信息,让QLabel能够自动判断并换行显示:
  ask_label = new QLabel(this);
  ask_label->setGeometry(65, 60, width-100, 25*2);
  ask_label->setWordWrap(true);
  ask_label->setAlignment(Qt::AlignTop);
 
  check_box = new QCheckBox(this);
  check_box->setGeometry(10, height - 35, 160, 25);
  check_box->setHidden(true);

  cancel_button = new QPushButton(this);
  cancel_button->resize(70, 25);
  cancel_button->move(width - cancel_button->width() - 10, height - 35);

  ok_button = new QPushButton(this);
  ok_button->resize(70, 25);
  ok_button->move(width - ok_button->width() - cancel_button->width() - 20, height - 35);

  check_box->setStyleSheet("background:transparent;");

  ok_button->setObjectName(QString::fromUtf8("pushButtonTwo"));
  cancel_button->setObjectName(QString::fromUtf8("pushButtonTwo"));
 
  QObject::connect(ok_button, SIGNAL(clicked()), this, SLOT(okOperate()));
  QObject::connect(close_button, SIGNAL(clicked()), this, SLOT(cancelOperate()));
  QObject::connect(cancel_button, SIGNAL(clicked()), this, SLOT(cancelOperate()));

  this->translateLanguage();
}

void MsgBox::translateLanguage()
{
  close_button->setToolTip(tr("close"));
  check_box->setText(tr("remember"));
  ok_text = tr("ok");
  cancel_text = tr("cancel");
}

void MsgBox::setInfo(QString title_info, QString info, QPixmap pixmap, bool is_check_hidden, bool is_ok_hidden)
{
  title_label->setText(QString("  ") + title_info);

  //设置提示信息
  ask_label->setText(info);
  msg_label->setPixmap(pixmap);

  //是否隐藏复选框
  check_box->setChecked(false);
  check_box->setHidden(is_check_hidden);

  //是否隐藏确定按钮
  ok_button->setHidden(is_ok_hidden);
  if(is_ok_hidden)
  {
    cancel_button->setText(ok_text);
  }
  else
  {
    ok_button->setText(ok_text);
    cancel_button->setText(cancel_text);
  }

  //设置默认按钮为取消按钮
  cancel_button->setFocus();
}

void MsgBox::paintEvent(QPaintEvent *)
{
  QPainter painter(this);
  painter.drawPixmap(rect(), QPixmap(":/icon/tip"));

  QBitmap bitmap(this->size());
  QPainter painter2(&bitmap);
  painter2.fillRect(bitmap.rect(), Qt::white);
  painter2.setBrush(QColor(0, 0, 0));
  painter2.drawRoundedRect(rect(), 4, 4);
  setMask(bitmap);
}

void MsgBox::mousePressEvent( QMouseEvent * event )
{
  //只能是鼠标左键移动和改变大小
  if(event->button() == Qt::LeftButton)
  {
    mouse_press = true;
  }

  //窗口移动距离
  move_point = event->globalPos() - pos();
}

void MsgBox::mouseReleaseEvent( QMouseEvent *)
{
  mouse_press = false;
}

void MsgBox::mouseMoveEvent(QMouseEvent *event)
{
  //移动窗口
  if(mouse_press)  
  {
    QPoint move_pos = event->globalPos();
    move(move_pos - move_point);
  }
}

void MsgBox::okOperate()
{
  bool is_hidden = check_box->isHidden();
  if(!is_hidden)
  {
    bool is_checked = check_box->isChecked();
    emit msgChecked(is_checked, true);
  }
  this->accept();
}

void MsgBox::cancelOperate()
{
  bool is_check_hidden = check_box->isHidden();
  bool is_ok_hidden = ok_button->isHidden();
  if(!is_check_hidden)
  {
    bool is_checked = check_box->isChecked();
    if(!is_ok_hidden)
    {
      emit msgChecked(is_checked, false);
    }
   else
   {
     emit okMessageHidden(is_checked);
   } 
  }

  this->reject();
}

 

效果图:

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

 


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


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


 

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


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


博主,请问你的PushButton是什么啊?应该不是QPushButton,也不是QToolButton,是你自己定义的一个按钮类吗?
答:恩,是的,我那个是统一处理的按钮,为了美观!你可以改为QPushButton,替换就行了,使用qss设置正常、鼠标滑过、按下的样式即可!
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Qt自定义消息提示框是指开发者可以根据自己的需求设计出符合自己应用程序风格的消息提示框,从而提高应用程序的用户体验。可以使用Qt的QWidget或QDialog等控件来实现消息的展示和弹出。一般而言,自定义消息提示框通常包括标题、消息内容和按钮,通过控制按钮的显示和响应来实现交互。同时,还需要考虑消息提示框的美观和易读性,比如可以选择一些颜色和图标来增强视觉效果,并且还需要支持多语言,方便不同国家和地区的用户使用。另外,为了方便使用,还可以将自定义消息提示框封装成一个函数或类,供应用程序中其他地方调用。总之,Qt自定义消息提示框的使用可以大大提升应用程序的用户体验,增强用户的满意度和忠诚度。 ### 回答2: QT框架提供了一个简便实用的方法来实现自定义消息提示框。首先,我们可以创建一个继承自QWidget类的消息提示框,这个类可以包含我们自定义的消息显示区域、确定按钮和取消按钮等控件。接下来,我们可以通过使用QHBoxLayout或QVBoxLayout等布局管理器来设置这些控件的位置和大小,使得它们在提示框中排版合理。同时,在确定按钮和取消按钮的点击事件中,我们可以使用accept()和reject()函数来确认或取消消息提示框的显示。 值得注意的是,在消息提示框的显示过程中,我们可以使用QPropertyAnimation等动画效果来增加提示框显示时的平滑感。另外,为了使得消息提示框更加美观,我们也可以在其样式表中设置背景、边框等相关样式。最终,我们可以通过调用自定义消息提示框类的实例来显示我们自己设计的消息提示框,在用户点击确定或取消按钮后,根据其结果来进行相应的操作。 综上所述,通过继承QWidget类并使用布局管理器、动画效果和样式表等技巧,我们可以实现自定义的消息提示框,并在QT应用程序中使用它来提供更好的用户体验。 ### 回答3: QT是一款非常强大的跨平台图形用户界面库,开发者可以使用QT框架创建丰富功能的图形化应用程序。其中,消息提示框是在应用程序中非常常用的一种控件,使用者可以在提示框中显示各种类型的消息,比如警告、错误和信息等等。本文将介绍如何使用QT自定义消息提示框。 首先,我们需要创建一个新窗口,用于显示自定义消息提示框。然后,我们可以在窗口中添加各种控件,比如QLabel、QPushButton和QMessageBox等控件。控件的颜色、大小和位置等属性可以按照自己的设计来设置。 接下来,我们需要添加一些功能,比如设置提示框的标题、消息内容和图标等。在处理这些功能时,我们可以使用QT提供的信号和槽机制。比如,在点击按钮时,我们可以发出一个信号,然后使用槽函数来处理信号并显示消息内容。 最后,我们需要将自定义的消息提示框集成到我们的应用程序中。这可以通过调用消息框的show函数来实现。如果我们希望用户能够在不关闭提示框的情况下执行其他操作,我们可以调用消息框的exec函数。 总之,使用QT自定义消息提示框是非常简单的,只需要创建一个新窗口并添加所需的控件和功能即可。同时,QT也提供了丰富的文档和示例,可以帮助我们更好地理解和使用自定义消息提示框

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值