我们知道,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类,就可以使用信号槽,并且此机制是线程安全的,为多线程编程提供了一个方便的辅助。有问题请留言,大家共同进步!