qt QFileDialog::getExistingDirectory блокирует работу сокета

У меня есть сокет, он находиться в отдельном классе и запускает в отдельном потоке. Он принимает данные и в окно main отправляет их, там они идут на форму. Проблема в том, что при вызове строки:

preIn = QFileDialog::getExistingDirectory(this, tr("Open Directory"), "/home", QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);

из другого окна Settings, открывается модальное окно, которое блокирует отображение данный, принятых через сокет.

Подскажите как сделать так, чтобы QFileDialog не блокировал принятие данных в сокете?


ДОБАВИЛ: код

void draw::sockReady(){

if(socket->waitForConnected(500))
{
    socket->waitForReadyRead(500);

    Data = socket->readAll();
    if(Data != ""){

        qDebug() << Data;

        emit emitSocket(Data);

    }
}

}

Для этого использую:

connect(socket, SIGNAL(readyRead()), this, SLOT(sockReady()));

Новое добавление создание отдельного потока для сокета:

это код draw.cpp:

#include <QDebug>
#include <QEventLoop>

#include "draw.h"


draw::draw()
{
    socket = new QTcpSocket(this);
    connect(socket, SIGNAL(readyRead()), this, SLOT(sockReady()));
    connect(socket, SIGNAL(disconnected()),this, SLOT(sockDisc()));

    //Соединяемся через TCP
    socket->connectToHost("127.0.0.1", 8000);

}

draw::~draw()
{
    socket->disconnectFromHost();
    socket->close();
}

//Отсоединение
void draw::sockDisc()
{
    socket->deleteLater();
}

//Ф-ция получения данных и отправка их в главное окно
void draw::sockReady(){

    if(socket->waitForConnected(500))
    {
        socket->waitForReadyRead(500);

        Data = socket->readAll();
        if(Data != ""){

            qDebug() << Data;

            emit emitSocket(Data);

        }
    }
}

void draw::run(){

    qDebug() << "draw: Закончить выполнение потока";
}





Теперь код draw.h:

#ifndef DRAW_H
#define DRAW_H

#include <QThread>
#include <Windows.h>
#include <QTcpSocket>

class draw : public QThread
{
    Q_OBJECT

public:
    draw();
    ~draw();

    void run();
    
    QTcpSocket* socket;
    QByteArray Data;

public slots:
    void sockDisc();
    void sockReady();

signals:
    void emitSocket(QByteArray);

private:


};

#endif // DRAW_H

Запуск делаю через main: //Запускаем поток для соединения сокета1 myDraw.start();


Ответы (1 шт):

Автор решения: KoVadim

Все ожидаемо. Читаем в документации https://doc.qt.io/qt-5/qfiledialog.html

On Windows, the dialog will spin a blocking modal event loop that will not dispatch any QTimers, and if parent is not nullptr then it will position the dialog just below the parent's title bar.

То есть, в случае Windows, диалоговое окно блокирует очередь событий. И, естественно, ничего не будет срабатывать. Даже таймер.

Что делать? по классике - использовать отдельный поток для сети.

→ Ссылка