Qt --- 自定义提示框 类似QMessagebox

news2025/1/16 5:06:09
QMessageBox::information(NULL, QString("title"), QString("I am information"));

以下是自定义提示框的代码,有图有真相!提示框大部分都采用模态的形式,关于模态也不再多提!所以父类为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();

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/926787.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【力扣】59. 螺旋矩阵 II <模拟>

【力扣】59. 螺旋矩阵 II 给你一个正整数 n n n &#xff0c;生成一个包含 1 到 n 2 n^2 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n n n n nn 正方形矩阵 m a t r i x matrix matrix 。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[[1,…

解锁未来网络新奇体验:探索算力网络的边缘创新

在当今数字时代&#xff0c;我们正处于网络变革的前沿&#xff0c;而算力网络正是这场变革的引领者之一。随着5G时代的到来&#xff0c;算力网络以其创新性和前瞻性&#xff0c;正在重新定义我们对网络构架的认知。让我们一起深入探索&#xff0c;了解算力网络如何为未来网络构…

搭建 Gitlab

当设置和配置 GitLab 实例并执行诸如创建群组、项目、用户和上传代码等操作时&#xff0c;涉及到多个步骤&#xff0c;每个步骤都有特定的目的。让我们逐步解释每个步骤并说明其背后的原因&#xff1a; 安装必需的软件&#xff1a; yum install -y curl policycoreutils-python…

9.Redis数据结构之整数数组

Redis中的Set与Java中的HashSet一样&#xff0c;无序且存储元素不重复。 Redis的集合对象Set使用了intset和hashtable两种数据结构存储。intset我们可以理解为数组,hashtable就是普通的哈希表(key为Set集合中元素的值&#xff0c;value为null)。当value是整数值时&#xff0c;且…

【安卓】自定义View实现画板涂鸦等功能

一、实现效果 二、代码 1、MainActivity.class package com.lsl.mydrawingboarddemo;import androidx.appcompat.app.AppCompatActivity; import androidx.core.content.ContextCompat;import android.os.Bundle; import android.os.Handler; import android.view.View; impo…

目标检测笔记(十一):如何结合特定区域进行目标检测(基于OpenCV的人脸检测实例)

文章目录 背景代码结果 背景 由于我们在做项目的时候可能会涉及到某个指定区域进行目标检测或者人脸识别等任务&#xff0c;所以这篇博客是为了探究如何在传统目标检测的基础上来结合特定区域进行检测&#xff0c;以OpenCV自带的包为例。 一般来说有两种方式实现区域指定&…

【AI模型】gym强化学习仿真平台配置与使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍gym强化学习仿真平台配置与使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&…

Spring BeanName自动生成原理

先看代码演示 项目先定义一个User类 public class User {private String name;Overridepublic String toString() {return "User{" "name" name \ };}public String getName() {return name;}public void setName(String name) {this.name name;} }…

ensp启动设备AR1失败,错误代码: 40.详细:启动失败!串口登录端口号2000 冲突请指定新的端口。

1.重新打开ensp,点击注册设备&#xff0c;勾选全部&#xff0c;注册 2.关闭虚拟化&#xff0c;输入cmd,管理员身份运行命令提示符 输入一下代码&#xff0c;回车&#xff0c;然后重启电脑 bcdedit /set hypervisorlaunchtype off 3.重装ensp及其组件 eNSP下载链接&#xff1a…

集成学习:Bagging, Boosting,Stacking

目录 集成学习 一、bagging 二、boosting Bagging VS Boosting 1.1 集成学习是什么&#xff1f; Bagging Boosting Stacking 总结 集成学习 好比人做出一个决策时&#xff0c;会从不同方面&#xff0c;不同角度&#xff0c;不同层次去思考&#xff08;多个自我&am…

常见前端面试之VUE面试题汇总八

22. Vue 子组件和父组件执行顺序 加载渲染过程&#xff1a; 1.父组件 beforeCreate 2.父组件 created 3.父组件 beforeMount 4.子组件 beforeCreate 5.子组件 created 6.子组件 beforeMount 7.子组件 mounted 8.父组件 mounted 更新过程&#xff1a; 1. 父组件 befor…

【LeetCode-中等题】189. 轮转数组

题目 题解一&#xff1a;开辟数组 取模运算寻找位置(ik)mod n 新位置 思路&#xff1a;通过&#xff0c;开辟数组 取模运算寻找新位置------位置(ik)mod n 新位置 int[] newNums new int[nums.length];for(int i 0;i<nums.length;i){newNums[(ik)%nums.length] nums[i…

京东面试题:java中static 应用场景有哪些?

大家好&#xff0c;我是你们的小米&#xff01;今天我要和大家聊一个在Java中非常重要的关键词——static&#xff01;在京东的面试中&#xff0c;经常会遇到与static相关的问题&#xff0c;而我们今天就要揭开它的神秘面纱&#xff0c;深入探讨它在Java中的应用场景。无论你是…

IoTDB 集群环境搭建

什么是IoTDB IoTDB&#xff08;Internet of Things Database&#xff09;是一个专门设计用于存储和管理大规模物联网&#xff08;IoT&#xff09;数据的开源时序数据库系统。它专注于高效地存储、查询和分析时间序列数据&#xff0c;特别适用于物联网应用中的大量实时数据。 Io…

1146:判断字符串是否为回文

#include <iostream> #include <string> using namespace std; int main() {string str;// 输入一个字符串cin>>str;int nstr.length();for(int i0;i<n;i){if(str[i]!str[n-1-i]){cout<<"no"; // 如果发现不对称的字符&#xff0c;则输出…

系统学习Linux-LVS集群

集群概述 负载均衡技术类型 四层负载均衡器 也称为 4 层交换机&#xff0c;主要通过分析 IP 层及 TCP/UDP 层的流量实现基于 IP 加端口的负载均衡&#xff0c;如常见的 LVS、F5 等&#xff1b; 七层负载均衡器 也称为 7 层交换机&#xff0c;位于 OSI 的最高层&#xff0c;即…

第二讲Java基本语法(变量、数据类型、运算符)

一、前言导读 上一讲,我们安装java的开发工具idea,并且简单介绍如何使用,初步认识了Java的helloworld,我们写了第一行代码,有了初步的印象,接下来我们将真正展开对于java的了解,从这一讲开始,请大家做好笔记,改背的背。为什么说Java是一门编程语言呢,主要是他跟英语一…

控制疫情蔓延嵌入式物联网能帮大忙

联合国所订定之永续发展目标之一&#xff0c;便是针对防治传染病的蔓延做好准备。在新型冠状病毒(COVID-19)流行期间&#xff0c;防疫已成为当前最重要目标&#xff0c;科技在对抗传染病方面扮演重要角色&#xff0c;而物联网(IoT)相关技术正是我们重要的防疫武器──降低成本、…

网络渗透day2-Windows服务器服务管理相关

1.在Windows Server中&#xff0c;用于监视网络连接和流量的工具是&#xff1f; A.Event Viewer B.Performance Monitor C.Task Scheduler D.Resource Monitor 正确答案&#xff1a;D 你的答案&#xff1a;B 解析&#xff1a; 答案解析&#xff1a;Resource Monitor用于监…

【Jetpack】Navigation 导航组件 ④ ( Fragment 跳转中使用 safe args 安全传递参数 )

文章目录 一、页面跳转间的传统的数据传递方式1、传统的数据传递方式 - Bundle 传递数据1、Navigation 组件中的 Bundle 数据传递2、传统数据传递实现步骤3、FragmentA 完整代码示例4、FragmentB 完整代码示例5、执行结果 2、使用 Bundle 传递数据安全性差 二、页面跳转间的传统…