2016-05-01 9 views
0

私の問題は、私は他のクライアントのネットワークの可用性をチェックするときにユーザーが待つかどうかを尋ねるメッセージを表示する必要があります。私の方法は私がクラスを持っているworkerThread私はそれを開始する前に、 qMessageBoxを作成します。しかし、メッセージにはタイトルだけが表示され、コンテンツは表示されません。実装QMessageboxがコール時にテキストを表示しない

#include <QObject> 
#include <QString> 
#include "clientdataobj.h" 
class WorkerThread : public QObject 
{ 
    Q_OBJECT 
public: 
    explicit WorkerThread(QObject *parent = 0); 


    QList<ClientDataObj> listClient() const; 
    void setListClient(const QList<ClientDataObj> &listClient); 


signals: 
    void finished(); 
    void error(QString err); 
    void listClientPingChecked(QList <ClientDataObj> list); 
public slots: 
    void testPing(); 

private: 
    QList <ClientDataObj> mListClient; 



    bool pingEachClient(QString ip); 

}; 

#include "workerthread.h" 
#include <QFile> 
#include <QMessageBox> 
#include <QTextStream> 
WorkerThread::WorkerThread(QObject *parent) : 
    QObject(parent) 
{ 
} 

void WorkerThread::testPing() 
{ 
    if (mListClient.size()==0) { 
     emit finished(); 
     return; 
    } 
    else{ 

     for(unsigned i=0;i<mListClient.size();i++){ 

      bool result = pingEachClient(mListClient[i].ip()); 
      if(result) 
       mListClient[i].setStatus(true); 
      else 
       mListClient[i].setStatus(false); 

     } 
     emit listClientPingChecked(mListClient); 
    } 
    emit finished(); 
} 

bool WorkerThread::pingEachClient(QString ip) 
{ 
    QString pingCommand = "ping " +ip + " -c 3 | grep loss | awk ' {print $7}' > pingResult.txt"; 
    system(qPrintable(pingCommand)); 
    QString lossPercentTxt = readFileText("pingResult.txt") ; 
    lossPercentTxt.chop(1); 
    int lossPercent = lossPercentTxt.toInt(); 

    if(lossPercent<10){ 
     return true; 
    } 
    else return false; 
} 


QList<ClientDataObj> WorkerThread::listClient() const 
{ 
    return mListClient; 
} 

void WorkerThread::setListClient(const QList<ClientDataObj> &listClient) 
{ 
    mListClient = listClient; 
} 

を私はメインウィンドウでそれを呼び出す方法:

on_pbSendUpdate_clicked() 
    { 
     changeModeWaitPing(); 
     getClientOnlineList(); 

    } 
getClientOnlineList() 
{ 
    if(mListClient.size()==0){ 
     return; 
    } 
    mpThreadPing = new QThread; 
    mpWorkerThread = new WorkerThread; 
    mpWorkerThread->setListClient(mListClient); 
    connectThreadPingToGui(); 
    mpThreadPing->start(); 

} 

changeModeWaitPing() 
{ 
    ui->pbSendUpdate->setEnabled(false); 
    callMsgBox("Pinging client... Pls wait!"); 
// callWaitDialog(); 



} 


callMsgBox(QString text) 
{ 
    if (NULL==mMsg) { 
     return; 
    } 

    mMsg->setWindowTitle("INFO"); 
// mMsg->setAttribute(Qt::WA_DeleteOnClose); 
    mMsg->setWindowModality(Qt::NonModal); 
    mMsg->setModal(false); 
    QString info ="Pinging client... Pls wait!"; 
    mMsg->setText(info); 
    mMsg->show(); 

} 

connectThreadPingToGui() 
{ 
    connect(mpWorkerThread, SIGNAL(error(QString)), this, SLOT(errorString(QString))); 
    connect(mpThreadPing, SIGNAL(started()), mpWorkerThread, SLOT(testPing())); 
    connect(mpWorkerThread, SIGNAL(finished()), mpThreadPing, SLOT(quit())); 
    connect(mpWorkerThread, SIGNAL(finished()), mpWorkerThread, SLOT(deleteLater())); 
    connect(mpThreadPing, SIGNAL(finished()), mpThreadPing, SLOT(deleteLater())); 
    connect(mpWorkerThread,SIGNAL(listClientPingChecked(QList<ClientDataObj>)),this,SLOT(updateListClientOnline(QList<ClientDataObj>))); 
} 

updateListClientOnline(QList<ClientDataObj> list) 
{ 
    mListClientOnline = list; 
    mPingDone = true; 
    if (NULL==mMsg) { 
     return; 
    } 
    else{ 
     mMsg->hide(); 
    } 
    if(mpDialogWaitPing==NULL){ 
     return; 
    } 
    else{ 
     mpDialogWaitPing->hide(); 
    } 
    launchClientListTable(); 
} 
+1

あなたは十分なコードを投稿していません。 'mMsg'はどこに宣言されていますか? 'info'とは何ですか? MCVEを投稿してください:http://stackoverflow.com/help/mcve – jpo38

+1

あなたの 'mpThreadPing'は何もしません。あなたはそのスレッドにオブジェクトを移動しません。 – thuga

+0

ご返信いただき、ありがとうございましたjpoとthugaに感謝します。私はオブジェクトをスレッドに移動しないでください。 @thugaあなたが解決した問題をマークすることができ、いくつかのポイントを返すことができるセクションに答えるためにあなたのコメントを貼り付けることができますか? – Tiana987642

答えて

0

あなたを私がなぜ、PLSの:(

はここでワーカースレッドのヘルプ見当がつかない新しいスレッドを作成しますが、オブジェクトをそのスレッドに移動しないでください。新しいスレッドは何もしません。私はあなたがいないと思いますmpWorkerThreadを新しいスレッドに移動します。その場合あなたは紛失していますmpWorkerThread->moveToThread(mpThreadPing);

関連する問題