Die Änderungen an Qt Concurrent
Qt 6 sind das Ergebnis des bewussten Bemühens, das Framework effizienter und benutzerfreundlicher zu gestalten.
Wir versuchen, die Binär- und Quellcodekompatibilität für alle öffentlichen APIs in jeder Version zu erhalten. Einige Änderungen waren jedoch unvermeidlich, um Qt zu einem besseren Framework zu machen.
In diesem Thema fassen wir diese Änderungen in Qt Concurrent zusammen und geben eine Anleitung zu deren Handhabung.
QtConcurrent::run()
QtConcurrent::run() wurde verbessert, um mit einer variablen Anzahl von Argumenten arbeiten zu können, daher wurden die Signaturen geändert:
// 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)
Wenn f
ein Zeiger auf eine Mitgliedsfunktion ist, sollte als Nebeneffekt das erste Argument von args
das Objekt sein, für das dieses Mitglied definiert ist (oder eine Referenz oder ein Zeiger darauf). Anstatt also zu schreiben:
QImage image = ...; QFuture<void> future = QtConcurrent::run(&image, &QImage::invertPixels, QImage::InvertRgba);
Sie müssen schreiben:
QFuture<void> future = QtConcurrent::run(&QImage::invertPixels, &image, QImage::InvertRgba);
Ein weiterer Nebeneffekt ist, dass QtConcurrent::run()
nicht mehr mit überladenen Funktionen funktioniert. Der folgende Code lässt sich zum Beispiel nicht kompilieren:
void foo(int arg); void foo(int arg1, int arg2); ... QFuture<void> future = QtConcurrent::run(foo, 42);
Die einfachste Lösung ist, die überladene Funktion über Lambda aufzurufen:
QFuture<void> future = QtConcurrent::run([] { foo(42); });
Oder Sie können dem Compiler mitteilen, welche Überladung er wählen soll, indem Sie ein static_cast
verwenden:
QFuture<void> future = QtConcurrent::run(static_cast<void(*)(int)>(foo), 42);
Oder qOverload:
QFuture<void> future = QtConcurrent::run(qOverload<int>(foo), 42);
Andere Methoden von QtConcurrent haben keine Verhaltensänderungen zur Folge und führen nicht zu Brüchen in der Quellkompatibilität.
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.