QMessagebox не показывать текст при вызове показать()

моя проблема заключается в том, что мне нужно показать сообщение, чтобы пользователи ждали, когда я проверю доступность сети других клиентов.Мой путь это у меня есть классworkerThread, чтобы сделать бизнес, прежде чем начать его я создаю qMessageBox. Но в сообщении отображается только заголовок, а не содержание. Я не имею никакую идею почему, помощь pls 🙁

Вот рабочий поток:

#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 }' > 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;
}

Как я называю его в MainWindow:

 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 ответ

  1. Вы создаете новый поток, но не перемещаете в него объекты. Так что ваш новый поток ничего не делает. Я предполагаю, что вы не mpWorkerThreadхотите быть перемещены в новый поток. В этом случае вы отсутствуете mpWorkerThread->moveToThread(mpThreadPing);