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

2023-10-29

    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设置正常、鼠标滑过、按下的样式即可!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt之自定义提示框(类似QMessageBox) 的相关文章

随机推荐

  • Java配置,mysql双数据源 读写分离

    大致思路 创建用于标志数据源的自定义注解 通过配置切面 在操作数据库的方法之前 扫描该方法的注解所配置的数据源名称 将名称存储在一个代表当前线程变量工具类 创建AbstarctRoutingDataSource子类DynamicDataSo
  • geoserver+mysql+openlayers问题点

    1 tomcat下部署geoserver解决跨域访问问题 报错 Access to XMLHttpRequest at http localhost 8900 geoserver cite ows service WFS version 1
  • 如何使用ssh密钥的方式实现无密码scp传输文件

    一 什么是SSH公钥 私钥 在介绍如何使用SSH密钥的方式实现无密码SCP传输文件之前 我们先来了解一下什么是SSH公钥 私钥 SSH公钥和私钥是一对密钥 用于加密您的登录信息和授权您的访问 公钥存储在服务器上 私钥存储在您的本地电脑上 当
  • MobilenetV1、V2、V3系列详解

    Mobilenet系列模型作为当前主流的端侧轻量级模型被广泛应用 很多算法都会使用其作为backbone提取特征 这一章对Mobilenet系列模型做一个总结 一 MobilnetV1 MobilenetV1提出了深度可分离卷积 Depth
  • 正确使用STL-MAP中Erase函数 一切尽在代码中。

    include
  • A Comprehensive Survey on Graph Neural Networks

    本文是对 A Comprehensive Survey on Graph Neural Networks 论文的一个翻译 主要针对文字部分 插图和表格不添加 需要请看原论文 图神经网络综述 摘要 1 引言 2 背景和定义 A 背景 B 定义
  • 解读R-FCN的position-sensitive score map

    R FCN的位置敏感分数图灵感来自Instance sensitive Fully Convolutional Networks这篇论文 该论文是针对FCN不能对同类型物体分割的缺点的改进 具体说明见下面 本论文的出发点 FCN可以用来做s
  • Anaconda cloud参考指令

    命令参考 另请参见 API参考 Anaconda客户端是Anaconda Cloud的命令行界面 CLI 可用于登录 注销 管理帐户 上传文件 生成访问令牌 查看令牌以及运行以下所示的其他任务 anaconda h 完整命令参考 anaco
  • VBA判断函数IsArray、IsDate、IsEmpty、IsEmpty、IsError等

    我给VBA的定义 VBA是个人小型自动化处理的有效工具 利用好了 可以大大提高自己的劳动效率 而且可以提高数据处理的准确度 我推出的VBA系列教程共九套和一部VBA汉英手册 现在已经全部完成 希望大家利用 学习 如果您只是一般的职场VBA需
  • ES6迭代器、set、map知识点

    1 迭代器 迭代器 Iterator 就是这样一种机制 它是一种接口 为各种不同的数据结构提供统一的访问机制 任何数据结构只要部署Iterator接口 就可以完成遍历操作 即依次处理该数据结构的所有成员 Iterator 的作用有三个 一是
  • FastAPI从入门到实战(3)——Hello World(安装与运行)

    本文详细记录FastAPI本地的安装和运行 都很简单 主要记录验证一些特性 安装FastAPI 安装就非常简单 只需要安装两个包就行 FastAPI pip install fastapi uvicorn 用于加载和提供应用程序的服务器 p
  • DOS网络启动盘

    DOS网络启动盘 这张从97年到现在我一直保留并维护的工具盘 也许平时用的机会不多 但总在关键时刻救急 它能帮你在无法通过光驱安装操作系统时 通过网络或USB移动盘把几百兆的Windows系统安装文件复制到本地硬盘来进行安装 当然还可以用它
  • 图像分类_PyTorch图像数据分类

    图像分类数据集中最常用的是手写数字识别数据集MNIST 但大部分模型在MNIST上的分类精度都超过了95 为了更直观地观察算法之间的差异 我们将使用一个图像内容更加复杂的数据集Fashion MNIST 这个数据集也比较小 只有几十M 没有
  • 数字后端各种Cell相关概念汇总

    数字后端各种Cell相关概念汇总 数字电路器件 反相器 逻辑门 触发器 锁存器 半加器 全加器 半减器 全减器 数字后端常见Cell相关名词 buffer repeater delay cell endcap cell tap cell d
  • 2018计算机四级网络工程师笔记,全国计算机四级网络工程师刷题笔记

    全国计算机四级网络工程师刷题笔记 操作系统原理部分 单选题 1 批处理 2 操作系统体系整体式结构 层次式结构 微内核 客户机 服务器 结构 主要部分 进程管理 存储管理 文件管理 作业管理 设备管理 3 内核状态监控程序 特权指令 输入输
  • Linux配置浮动IP

    在高可用集群环境中 一般都需要使用浮动IP来实现web高可用 High Availability 浮动IP的概念以及为什么需要浮动IP请参考 https blog csdn net readiay article details 53538
  • jdbc:mysql://localhost:3306/test是什么?jdbc代表什么?

    jdbc mysql 是指JDBC连接方式 localhost 是指你的本机IP地址 在本地等同于127 0 0 1 3306 数据库所使用的端口号 默认3306 test 就是你要连接的数据库的地址 后面如果为jdbc test则同理 J
  • 神经网络学习小记录66——Keras版 Vision Transformer(VIT)模型的复现详解

    神经网络学习小记录66 Keras版 Vision Transformer VIT 模型的复现详解 学习前言 什么是Vision Transformer VIT 代码下载 Vision Transforme的实现思路 一 整体结构解析 二
  • 索引-mysql详解(三)

    上篇文章说了 mysql可以指定行格式 compact dynamic 他结构有变长字段长度列表 null值 头部和真实数据存储 compact真实数据会存一定量的页 后面指向页的页码 dynamic全部存的页码 char会根据字符集来变换
  • Qt之自定义提示框(类似QMessageBox)

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