QtConcurrent 给出错误

Posted

技术标签:

【中文标题】QtConcurrent 给出错误【英文标题】:QtConcurrent gives errors 【发布时间】:2016-04-21 15:27:33 【问题描述】:

鉴于下面的代码,我得到以下错误:

fileio.cpp:47: 错误: C3867: 'FileIO::read': 非标准语法;采用 '&' 创建一个指向成员的指针

fileio.cpp:47: 错误: C2780: 'QFuture QtConcurrent::map(Iterator,Iterator,MapFunctor)':需要 3 个参数 - 提供 2 个

为什么会这样?

fileio.h

#ifndef FILEIO_H
#define FILEIO_H

#include <QtCore>

class FileIO : public QObject

    Q_OBJECT
    Q_DISABLE_COPY(FileIO)

signals:
    void finished();

public slots:
     Q_INVOKABLE void cancel();

private:
    void read(QString &fileURL);

public:
    FileIO(QObject *parent = 0);
    ~FileIO();


    Q_INVOKABLE void read_b64(const QString &fileURL);

;

#endif // FILEIO_H

fileio.cpp

#include "fileio.h"
#include <QFile>
#include <QDebug>
#include <QUrl>
#include <QThread>
#include <QtConcurrent>

FileIO::FileIO(QObject *parent)
    : QObject(parent)



FileIO::~FileIO()



void FileIO::read(QString &filePath)

    QByteArray finalBytes = QByteArray();

    filePath = QUrl(filePath).toLocalFile();

    QFile file(filePath);

    qDebug() << "file size: " << file.size();
    if (file.open(QIODevice::ReadOnly)) 
        finalBytes = file.readAll();
    

    qDebug() << "byte size: " << finalBytes.length();

    //bytes.toBase64();



void FileIO::read_b64(const QString &filePath)


    QFutureWatcher<void> futureWatcher;
    QObject::connect(this, &FileIO::cancel, &futureWatcher, &QFutureWatcher<void>::cancel, Qt::UniqueConnection);
    QObject::connect(&futureWatcher, &QFutureWatcher<void>::finished, this, &FileIO::finished);


    QStringList filePaths;
    filePaths << filePath;

    QFuture<void> future = QtConcurrent::map(filePaths, this->read);

    futureWatcher.setFuture(future);

【问题讨论】:

【参考方案1】:

this-&gt;read 无效。您想使用std::bind 将非静态成员函数与实例绑定,创建一个可调用对象,然后调用QtConcurrent::map 的第一个重载,采用两个参数:

QFuture<void> future =
    QtConcurrent::map(filePaths, std::bind(&FileIO::read, this));

【讨论】:

好吧,简单地声明 read 没有类命名空间(不确定正确的词)是有效的。即 void read 不是 void FileIO::read @davidkomer 哎呀,我错过了一些东西。现在它应该与 read 作为非静态成员函数一起使用。或者也许你应该考虑制作read static 成员函数。

以上是关于QtConcurrent 给出错误的主要内容,如果未能解决你的问题,请参考以下文章

QtConcurrent 错误:对非静态成员的引用

PySide/PyQt 中的 QtConcurrent

QtConcurrent::run 如何停止后台任务

QtConcurrent 运行的线程 id

QtConcurrent blockingMappedReduced 与 MappedReduced

QtConcurrent 与索引映射