0


QMessageBox手动添加按钮并绑定按钮的信号

视频展示效果(结合代码看效果更佳哦,代码在最下面):

QMessageBox手动添加有重试效果的按钮

**效果图: **

点击详细文本之后展开如下图:

** **

图标可选:
*QMessageBox::Critical错误图标QMessageBox::NoIcon 没有图标QMessageBox::Question 提问图标QMessageBox::Information 消息图标QMessageBox::Warning 警告图标
按钮角色可选:
*QMessageBox::InvalidRole 无效;设置之后,这个按钮不会出现在弹框里面QMessageBox::AcceptRole 确定;设置之后,对话框被接受,点击按钮后,弹窗会消失QMessageBox::RejectRole*
取消;设置之后,对话框被拒绝,点击按钮后,弹窗会消失
QMessageBox::DestructiveRole不保存;设置之后,点击按钮后会导致破坏性更改并关闭弹窗***QMessageBox::ActionRole 激活QMessageBox::HelpRole 帮助QMessageBox::YesRole QMessageBox::NoRole QMessageBox::ApplyRole 应用QMessageBox::ResetRole **重置

.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMessageBox>
#include <QPushButton>
#include <QTimer>
#include <QDialog>
#define ETIME 10//每次重试的时间
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

public slots:
    void slotRetry();
   void slotCountdown();
   void slotClose();
   void slotBtnClick(QAbstractButton* btn);

private:
    Ui::MainWindow *ui;
    QMessageBox *m_mBox;
    QPushButton *m_retryBrn;
    QPushButton *m_closeBtn;
    QTimer *m_tmrRetry;
    int m_iCount;
    int iRetryCount;
};

#endif // MAINWINDOW_H

.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    //ui->setupUi(this);

    m_tmrRetry = new QTimer(this);
    m_tmrRetry->setInterval(1000);
    connect(m_tmrRetry,SIGNAL(timeout()),this,SLOT(slotCountdown()));

    m_mBox = new QMessageBox();
    m_mBox->setIcon(QMessageBox::Critical);//设置图标
    m_mBox->setWindowTitle("错误");//设置对话框标题
    m_mBox->setText("测试说明");//设置副标题
    m_mBox->setInformativeText("今天是个好日子");//设置提示说明
    //m_mBox->setDetailedText("点个关注吧");//设置详细文本
    m_retryBrn = new QPushButton();
    m_closeBtn = new QPushButton();

    //添加按钮的方法
    //..1
    m_retryBrn = m_mBox->addButton("重试",QMessageBox::AcceptRole);
    m_closeBtn = m_mBox->addButton("关闭",QMessageBox::RejectRole);

    //..2
    //    m_retryBrn->setText("重试");
    //    m_closeBtn->setText("关闭");
    //    m_mBox->addButton(m_retryBrn,QMessageBox::AcceptRole);
    //    m_mBox->addButton(m_closeBtn,QMessageBox::RejectRole);

    //_________________________________________
    //绑定按钮槽函数的方法
    //..1
    connect(m_mBox,SIGNAL(buttonClicked(QAbstractButton*)),this,SLOT(slotBtnClick(QAbstractButton*)));
    //..2
    connect(m_retryBrn,SIGNAL(clicked(bool)),this,SLOT(slotRetry()));

    //关闭弹窗后触发的信号
    connect(m_mBox,SIGNAL(destroyed(QObject*)),this,SLOT(slotClose()));

    m_mBox->show();
    m_iCount=0;//已经重试了几次
    iRetryCount=0;//总共重试几次
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::slotRetry()
{
    m_mBox->show();//一定要show,不然点击按钮之后,弹窗就会消失,就看不到倒计时的效果了
    if(m_retryBrn->isEnabled())
    {
        m_retryBrn->setEnabled(false);
        m_closeBtn->setEnabled(false);
    }
    iRetryCount++;
    if(iRetryCount>3)//最多只重试3次
    {
        qDebug() << "重试次数已试完";
        m_mBox->close();
        m_mBox->deleteLater();
        return;
    }
    qDebug() << "重试方式一";
    m_tmrRetry->start();
    m_retryBrn->setText(QString("重试 %1").arg(ETIME));
}

void MainWindow::slotCountdown()
{
    m_mBox->show();
    m_iCount++;
    int iTemp = ETIME - m_iCount;
    if(iTemp<=0)
    {
        //可以在倒计时结束后做你想做的事
        m_tmrRetry->stop();
        m_retryBrn->setEnabled(true);
        m_closeBtn->setEnabled(true);
        m_iCount=0;
        iTemp=ETIME;
    }
    m_retryBrn->setText(QString("重试 %1").arg(iTemp));
}

void MainWindow::slotClose()
{
    qDebug() << "弹窗已关闭";
}

void MainWindow::slotBtnClick(QAbstractButton *btn)
{
    if(btn == m_retryBrn)
    {
        qDebug() << "重试 方法2";
    }
    else if(btn == m_closeBtn)
    {
        qDebug() << "关闭 方法2";
    }
}
标签: ui QT QMessageBox

本文转载自: https://blog.csdn.net/ligare/article/details/129749438
版权归原作者 Licht小粉 所有, 如有侵权,请联系我们删除。

“QMessageBox手动添加按钮并绑定按钮的信号”的评论:

还没有评论