现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

Qt编程:在非gui线程使用QMessageBox

2015-04-12 06:23 工业·编程 ⁄ 共 1552字 ⁄ 字号 暂无评论

最近我写项目的时候遇到一个奇怪的需求,要在工作线程内,根据某个情况弹出一个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"); 

给我留言

留言无头像?