最近我写项目的时候遇到一个奇怪的需求,要在工作线程内,根据某个情况弹出一个MessageBox,但是Qt提供的MessageBox只可以在gui线程(主线程)使用,于是我就对QMessageBox封装了一下,让其可以在非gui线程内被调用。
特新介绍
1.可以在任何线程调用
2.show后和默认的MessageBox一样是阻塞的,MessageBox关闭后才会返回
注意:
1.我只封装了information,如果需要其他的,请做扩展
声明:
#include <QMessageBox>
#include <QEventLoop>
class JasonQt_ShowInformationMessageBoxFromOtherThread: public QObject
{
Q_OBJECT
private:
const QString m_title;
const QString m_message;
public:
JasonQt_ShowInformationMessageBoxFromOtherThread(const QString &title, const QString &message);
static void show(const QString &title, const QString &message);
private:
void readyShow(void);
private slots:
void onShow(void);
};
定义:
JasonQt_ShowInformationMessageBoxFromOtherThread::JasonQt_ShowInformationMessageBoxFromOtherThread(const QString &title, const QString &message):
m_title(title),
m_message(message)
{ }
void JasonQt_ShowInformationMessageBoxFromOtherThread::show(const QString &title, const QString &message)
{
QEventLoop eventLoop;
auto messageBox = new JasonQt_ShowInformationMessageBoxFromOtherThread(title, message);
connect(messageBox, SIGNAL(destroyed()), &eventLoop, SLOT(quit()));
messageBox->readyShow();
eventLoop.exec();
}
void JasonQt_ShowInformationMessageBoxFromOtherThread::readyShow(void)
{
this->moveToThread(qApp->thread());
QTimer::singleShot(0, this, SLOT(onShow()));
}
void JasonQt_ShowInformationMessageBoxFromOtherThread::onShow(void)
{
QMessageBox::information(NULL, m_title, m_message);
this->deleteLater();
}
使用:
JasonQt_ShowInformationMessageBoxFromOtherThread::show("Title", "Message");