Qt 6 是努力使框架更高效,且更易於使用的結果。
為兼容每個發行的所有公共 API,我們試著維護二進製和源代碼。但是,為使 Qt 成為更優框架,一些改變是不可避免的。
在此話題中,我們匯總瞭那些 Qt Concurrent 變化,並提供處理它們的指導。
QtConcurrent::run() has been improved to work with a variable number of arguments, so the signatures are changed to:
// run template <typename T> QFuture<T> run(Function &&f, Args &&...args) // run with a QThreadPool argument template <typename T> QFuture<T> run(QThreadPool *pool, Function &&f, Args &&...args)
As a side effect, if
f
is a pointer to a member function, the first argument of
args
should be the object for which that member is defined (or a reference, or a pointer to it). So instead of writing:
QImage image = ...; QFuture<void> future = QtConcurrent::run(&image, &QImage::invertPixels, QImage::InvertRgba);
You have to write:
QFuture<void> future = QtConcurrent::run(&QImage::invertPixels, &image, QImage::InvertRgba);
Another side effect is that
QtConcurrent::run()
will not work with overloaded functions anymore. For example, the code below won't compile:
void foo(int arg); void foo(int arg1, int arg2); ... QFuture<void> future = QtConcurrent::run(foo, 42);
The easiest workaround is to call the overloaded function through lambda:
QFuture<void> future = QtConcurrent::run([] { foo(42); });
Or you can tell the compiler which overload to choose by using a
static_cast
:
QFuture<void> future = QtConcurrent::run(static_cast<void(*)(int)>(foo), 42);
Or qOverload :
QFuture<void> future = QtConcurrent::run(qOverload<int>(foo), 42);
Other methods of QtConcurrent have no behavioral changes and do not introduce source compatibility breaks.