IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Qt 自定义提示框 类似QMessageBox -> 正文阅读

[游戏开发]Qt 自定义提示框 类似QMessageBox

前言

为什么需要设计自定义提示框呢?
1.Qt自带的提示框样式单一;
2.提示框的太小;
3.界面风格跟项目的不搭配;

程序执行效果在这里插入图片描述源码下载

https://gitee.com/jiang_bin_yu/qt---custom-prompt-box

程序源码

使用说明
参数info:输入你需要显示的提示内容
参数parent:指定此对话框的父类,即窗口会根据父类窗口大小自适应
参数exec:是否使用模态方式显示
参数confirmName:确认按钮显示的文本,默认是确 定

    //弹出消息框
    void showMessageBoxInfo(const QString &info,QWidget *parent,bool exec = true,const QString &confirmName="确 定");

程序应用

//显示提示框
void MainWindow::on_pushButton_showInfo_clicked()
{
    myDialog::Instance()->setAnimationDirection(QtMaterialJbyDialog::UPTODOWN);
    myDialog::Instance()->showMessageBoxInfo("通过单例方式显示的\r\n提示框",this,true);
}
//显示询问框
void MainWindow::on_pushButton_showQuestion_clicked()
{
    myDialog::Instance()->setAnimationDirection(QtMaterialJbyDialog::RIGHTTOLEFT);
    int dlg = myDialog::Instance()->showMessageBoxQuestion("是否看懂了\r\n此程序",this,true,"简 单!","讲个der~?");
    if(dlg == QMessageBox::Yes)
    {
        qDebug() << "用户看懂了";
    }
    if(dlg == QMessageBox::No)
    {
        qDebug() << "用户是个老六 没看懂";
    }
}
//显示警示框
void MainWindow::on_pushButton_showError_clicked()
{
    myDialog::Instance()->setAnimationDirection(QtMaterialJbyDialog::LEFTTORIGHT);
    myDialog::Instance()->showMessageBoxError("通过单例方式显示的\r\n提示框",this,true);
}

输入框继承说明
myDialog继承QtMaterialJbyDialog
QtMaterialJbyDialog继承QtMaterialOverlayWidget
QtMaterialOverlayWidget继承QWidget在这里插入图片描述
输入框各父类对应功能讲解
1.QtMaterialOverlayWidget 主要实现窗口与父类窗口大小一致

bool QtMaterialOverlayWidget::event(QEvent *event)
{
    if (!parent()) {
        return QWidget::event(event);
    }
    switch (event->type())
    {
    case QEvent::ParentChange:
    {
        parent()->installEventFilter(this);
        setGeometry(overlayGeometry());
        break;
    }
    case QEvent::ParentAboutToChange:
    {
        parent()->removeEventFilter(this);
        break;
    }
    default:
        break;
    }
    return QWidget::event(event);
}

2.QtMaterialJbyDialog 主要负责界面动画
动画1:界面背景模板的淡入淡出

void QtMaterialJbyDialog::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event)
    QPainter painter(this);

    QBrush brush;
    brush.setStyle(Qt::SolidPattern);
    brush.setColor(Qt::black);
    painter.setBrush(brush);
    painter.setPen(Qt::NoPen);
    painter.setOpacity(m_opacity);        //值越高越不透明
    painter.drawRect(rect());
}
Q_PROPERTY(qreal opacity WRITE setOpacity READ opacity)

动画2:窗口移动

	//四种动画模式
    enum ANIMATIONDIRECTION
    {
        UPTODOWN = 0,
        DOWNTOUP = 1,
        RIGHTTOLEFT = 2,
        LEFTTORIGHT = 3
    };
 	showAnimation = new QPropertyAnimation(mainWidget, "geometry",this);
    showAnimation->setDuration(AnimationTime);
    showAnimation->setEasingCurve(QEasingCurve::InCirc);

    if(hideAnimation)
        delete hideAnimation;
    hideAnimation = new QPropertyAnimation(mainWidget, "geometry",this);
    hideAnimation->setDuration(AnimationTime);
    hideAnimation->setEasingCurve(QEasingCurve::InCirc);
    connect(hideAnimation, SIGNAL(finished()),this, SLOT(slotHideAnimationFinish()));
    if(m_animationDirection == UPTODOWN)
    {
        hideAnimation->setStartValue(QRect((mainRect.width()-rect.width())/2, (mainRect.height()-rect.height())/2,rect.width(), rect.height()));
        hideAnimation->setEndValue(QRect((mainRect.width()-rect.width())/2,0,rect.width(), rect.height()));
    }else if(m_animationDirection == DOWNTOUP)
    {
        hideAnimation->setStartValue(QRect((mainRect.width()-rect.width())/2, (mainRect.height()-rect.height())/2,rect.width(), rect.height()));
        hideAnimation->setEndValue(QRect((mainRect.width()-rect.width())/2,mainRect.height()-rect.height(),rect.width(), rect.height()));
    }else if(m_animationDirection == RIGHTTOLEFT)
    {
        hideAnimation->setStartValue(QRect((mainRect.width()-rect.width()), (mainRect.height()-rect.height())/2,rect.width(), rect.height()));
        hideAnimation->setEndValue(QRect(mainRect.width(),(mainRect.height()-rect.height())/2,rect.width(), rect.height()));
    }else if(m_animationDirection == LEFTTORIGHT)
    {
        hideAnimation->setStartValue(QRect(0, (mainRect.height()-rect.height())/2,rect.width(), rect.height()));
        hideAnimation->setEndValue(QRect(-rect.width(),(mainRect.height()-rect.height())/2,rect.width(), rect.height()));
    }

myDialog 负责提示框的显示

int myDialog::showDialog(const QString &info, QWidget *parent, bool exec, const QString &confirmName, const QString &cancleName)
{
    if(info == m_Message)
        return QMessageBox::Cancel;
    if(exec && !this->isHidden())
    {
        qDebug() << "showMessageBoxInfo 已经有一个了";
        myDialog *dlg = new myDialog();
        return dlg->showMessageBoxQuestion(info,parent,exec);
    }
    setParent(parent);
    m_Message = info;
    ui->pushButton_confirm->setText(confirmName);
    ui->pushButton_cancle->setText(cancleName);
    ui->pushButton_confirm->show();
    ui->pushButton_cancle->show();

    ui->label_Tip->setText(info);
    update();
    if(exec)
    {
        m_Message.clear();
        QtMaterialJbyDialog::exec();
    }
    else
    {
        QtMaterialJbyDialog::showDialog();
    }
    return DlgState();
}

特别需要注意的地方
myDialog 使用方法
1.设置动画窗口

QtMaterialJbyDialog::->setMainWidget(ui->widget_main);

2.设置动画方向

QtMaterialJbyDialog::setAnimationDirection(QtMaterialJbyDialog::UPTODOWN);

3.设置父类

setParent(parent);
  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章           查看所有文章
加:2022-10-22 21:51:25  更:2022-10-22 21:53:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/17 6:12:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码