用qt实现创建和使用线程发送文件
时间: 2024-05-12 08:13:05 浏览: 43
qt websocket 客户端 多线程使用
首先,我们需要创建一个线程类,用于发送文件。以下是一个简单的示例:
```c++
class FileSender : public QThread
{
Q_OBJECT
public:
FileSender(QObject *parent = nullptr);
void setFileName(const QString &fileName);
signals:
void progressChanged(int value);
void finished();
protected:
void run() override;
private:
QString m_fileName;
};
```
在这个类中,我们定义了一个槽函数 `setFileName()` 用于设置要发送的文件名,以及两个信号 `progressChanged()` 和 `finished()` 用于反馈发送进度和完成状态。
接下来,我们实现这个类的具体内容,即在 `run()` 函数中发送文件。以下是一个简单的发送文件的实现:
```c++
void FileSender::run()
{
// 打开文件
QFile file(m_fileName);
if (!file.open(QIODevice::ReadOnly)) {
qDebug() << "Cannot open file for reading: " << file.errorString();
return;
}
// 获取文件大小
qint64 fileSize = file.size();
// 创建网络连接
QTcpSocket socket;
socket.connectToHost("127.0.0.1", 1234);
if (!socket.waitForConnected()) {
qDebug() << "Cannot connect to host: " << socket.errorString();
return;
}
// 发送文件名和文件大小
QString fileName = QFileInfo(m_fileName).fileName();
QByteArray fileNameBytes = fileName.toUtf8();
qint64 fileNameSize = fileNameBytes.size();
QByteArray fileSizeBytes(reinterpret_cast<const char *>(&fileSize), sizeof(fileSize));
socket.write(reinterpret_cast<const char *>(&fileNameSize), sizeof(fileNameSize));
socket.write(fileNameBytes);
socket.write(fileSizeBytes);
// 发送文件内容
QByteArray buffer;
qint64 totalBytesSent = 0;
qint64 bytesToSend = qMin(fileSize, qint64(1024 * 1024));
while (totalBytesSent < fileSize) {
buffer = file.read(bytesToSend);
qint64 bytesSent = socket.write(buffer);
if (bytesSent == -1) {
qDebug() << "Error sending data: " << socket.errorString();
return;
}
totalBytesSent += bytesSent;
bytesToSend = qMin(fileSize - totalBytesSent, qint64(1024 * 1024));
emit progressChanged(int(totalBytesSent * 100 / fileSize));
}
// 关闭文件和网络连接
file.close();
socket.close();
emit finished();
}
```
在这个实现中,我们首先打开要发送的文件,并获取文件大小。然后,我们创建一个 `QTcpSocket` 对象,连接到指定的主机和端口。接着,我们将文件名和文件大小发送给接收方。最后,我们将文件内容分段发送给接收方,并在发送过程中反馈发送进度。发送完成后,我们关闭文件和网络连接,并发出发送完成的信号。
最后,我们可以在主线程中创建一个 `FileSender` 对象,并启动线程:
```c++
FileSender sender;
sender.setFileName("path/to/file");
connect(&sender, &FileSender::progressChanged, [=](int value) {
// 更新进度条
});
connect(&sender, &FileSender::finished, [=]() {
// 发送完成
});
sender.start();
```
这样,我们就实现了用 Qt 创建线程并发送文件的功能。
阅读全文