QT之灵活的消息框(可在任意类中使用)

我们知道,QT中的QMainWindow类或QDialog类等可以使用消息框弹出用户提示或警告信息。但在一些自己定义的类中,QMessagBox类是无法使用的,针对这个问题,可以借用QT的信号槽机制设计一个弹窗机制。
效果:可以在任意类中使用emit进行自定义弹窗(弹窗一直停留,或在xxms后自动关闭)
涉及知识:信号槽的创建,绑定,发出;自定义弹窗类别,文本内容,停留时长;

话不多说,直接上代码

一、自己定义的类,需要在这个类中使用emit弹窗

test.h文件

class Test : public QObject
{
    Q_OBJECT
public:
    explicit  Test();
    ~ Test();  
    void emit_MessBox();  
signals:
    void MessBox(QMessageBox::Icon,QString,int); //参数为消息框类型、文本内容、停留时间(ms)
}

Test类继承自QObject并且声明Q_OBJECT宏是为了在Test类中使用信号槽机制

test.cpp文件(节选)

void Test::emit_MessBox()
{
    emit MessBox(QMessageBox::Warning,"这是一个测试弹窗",0);
}

在emit_MessBox函数中,使用emit发出信号,弹框类型为警告框、文本内容为"这是一个测试弹窗"、停留时间为0ms(表示一直停留,直到被用户点击才关闭)。

一、MainWindow类,需要在这个类中实现对应的槽函数,执行弹窗操作

mainwindow.h

#include "test.h"

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    Ui::MainWindow *ui;
private slots:
    void MessBox(QMessageBox::Icon,QString,int);

}

mainwindow.cpp 信号槽绑定、槽实现


void MainWindow::SignalsConnect()
{
    qRegisterMetaType <QMessageBox::Icon> ("QMessageBox::Icon");  //注册参数类型 <QMessageBox::Icon>
    QObject::connect(T,SIGNAL(MessBox(QMessageBox::Icon,QString,int)),
            this,SLOT(MessBox(QMessageBox::Icon,QString,int)),Qt::QueuedConnection);
}

void MainWindow::MessBox(QMessageBox::Icon messboxIcon, QString str,int ms)
{
    if(ms==0)
    {
        if(messboxIcon==QMessageBox::Information)
            QMessageBox::information(this, tr("消息"),str,
                                           QMessageBox::Ok | QMessageBox::Cancel);
        else if(messboxIcon==QMessageBox::Warning)
            QMessageBox::warning(this, tr("警告"),str,
                                           QMessageBox::Ok );
        else if(messboxIcon==QMessageBox::Critical)
            QMessageBox::critical(this, tr("错误"), str,
                                           QMessageBox::Ok );
        else
            QMessageBox::question(this, tr("未知"),str,
                                           QMessageBox::Ok );
    }
    else if(ms>0)
    {
        QMessageBox* box;
        box = new QMessageBox("Messagebox",
                str,
                messboxIcon,
                QMessageBox::Ok | QMessageBox::Default,
                QMessageBox::Cancel | QMessageBox::Escape,
                0);

        box->show();
        Delay_MSec(ms);
        box->hide();
        delete box;
    }
}

注意:QObject::connect(T,SIGNAL(MessBox(QMessageBox::Icon,QString,int)),
this,SLOT(MessBox(QMessageBox::Icon,QString,int)),Qt::QueuedConnection);
绑定操作中,T为Test类指针,指向一个Test对象。
注意:在emit代码执行之前,确保已经进行了连接,所以推荐信号槽连接在MainWindow类的构造函数中完成,emit信号在Test类的构造函数完成后,需要弹窗的时候再执行。

总结:QT的信号槽是一种方便又安全的机制,可使用于不同的类之间,只要他们都继承自QObject类,就可以使用信号槽,并且此机制是线程安全的,为多线程编程提供了一个方便的辅助。有问题请留言,大家共同进步!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值