2016-04-21 112 views
0

考虑下面的代码,我得到以下错误:QtConcurrent给出错误

fileio.cpp:47: error: C3867: 'FileIO::read': non-standard syntax; use '&' to create a pointer to member

fileio.cpp:47: error: C2780: 'QFuture QtConcurrent::map(Iterator,Iterator,MapFunctor)': expects 3 arguments - 2 provided

这是为什么?

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); 
} 

回答

0

this->read无效。你想用std::bind绑定与实例的非静态成员函数来创建一个调用,然后调用QtConcurrent::map第一过载,取两个参数:

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

包括并替换该行,但仍然得到错误.. – davidkomer

+0

没关系简单地声明没有类命名空间的读取(不确定正确的单词)工作。即void读取不是void FileIO ::读取 – davidkomer

+0

现在它工作:D – davidkomer