在我的应用程序中有一个阻止我的UI的保存过程。优化是不够的,所以我想用QtConcurrent
实现线程,但我不能让它工作,虽然语法看起来很容易。
现在的样子(原则):
Traymenu::Traymenu(QApplication *a){
//...
void save(){
//Get the savepath, choose if saving is necessary, and trigger saving
QString path = getSavePath();
saveNotes(path);
}
void saveNotes(QString savePath){
//save to the given path, takes quite a while, should be parallel
}
}
我尝试过:
Traymenu::Traymenu(QApplication *a){
//...
void save(){
//Get the savepath, choose if saving is necessary, and trigger saving
QString path = getSavePath();
QFuture<void> result = QtConcurrent(saveNotes, path); //ERROR
}
void saveNotes(QString savePath){
//save to the given path
}
}
此外,在我的标题中,我包含了这个:
#include <QtConcurrent/QtConcurrentRun>
错误消息是
C:\App\appname\traymenu.cpp:584: Error: no matching function for call
to 'run(<unresolved overloaded function type>, QString&)'
QFuture<void> future = QtConcurrent::run(save, outputFilename);
^
我也试过这个:
QFuture<void> future = QtConcurrent::run(this, this->save(outputFilename));
错误是
C:\App\appname\traymenu.cpp:584: Error: invalid use of void expression
QFuture<void> future = QtConcurrent::run(this, this->save(outputFilename));
^
我的标题如下:
class Traymenu : public QSystemTrayIcon
{
Q_OBJECT
public:
Traymenu(QApplication *);
~Traymenu();
void save();
void saveNotes(QString);
//[...]
我做错了什么?
答案 0 :(得分:4)
使用会员功能
QtConcurrent :: run()也接受指向成员函数的指针。第一个参数必须是const引用或指向该类实例的指针。在调用const成员函数时,通过const引用传递是很有用的。传递指针对于调用修改实例的非const成员函数很有用。
这意味着你会写这个来实现这个目的:
QtConcurrent::run(this, &Traymenu::saveNotes, outputFileName);