我有一个套接字,它在一个单独的类中并在一个单独的线程中运行。它接收数据并将其发送到主窗口,然后转到表单。问题是在调用线路时:
preIn = QFileDialog::getExistingDirectory(this, tr("Open Directory"), "/home", QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
在另一个设置窗口中,会打开一个模式窗口,阻止显示通过套接字接收的数据。
告诉我如何使 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 进行启动://启动线程以连接 socket1 myDraw.start();
一切都在意料之中。我们阅读了文档https://doc.qt.io/qt-5/qfiledialog.html
也就是说,在 Windows 的情况下,对话框会阻塞事件队列。而且,当然,什么都行不通。甚至是计时器。
该怎么办?根据经典 - 为网络使用单独的线程。