У меня есть класс C++. Он наследует родительский класс, который наследует QQuickItem
. Поэтому теперь я не могу наследовать от QThread
поскольку QQuickItem
уже существует.
(Ошибка при попытке: Object is an ambiguous base of 'xClass'
)
Мой класс был зарегистрирован qmlRegisterType
и я могу получить доступ к его методам через QML.
Существует кусок кода, который запускается при нажатии кнопки с QML. Этот фрагмент кода занимает много времени, и он полностью захватывает фокус из окна QML.
Как написать часть кода в моем классе C++, который, когда я бегу, не крадет все внимание на себя?
Одним из способов переноса процесса блокировки в новый поток является создание рабочего объекта путем подкласса QObject
. Затем используйте сигналы и слоты для сигнала, когда поток должен обрабатывать некоторые данные и возвращать данные.
Вот пример из Qt docs:
class Worker : public QObject
{
Q_OBJECT
public slots:
void doWork(const QString ¶meter) {
QString result;
/* ... here is the expensive or blocking operation ... */
emit resultReady(result);
}
signals:
void resultReady(const QString &result);
};
class Controller : public QObject
{
Q_OBJECT
QThread workerThread;
public:
Controller() {
Worker *worker = new Worker;
worker->moveToThread(&workerThread);
connect(&workerThread, &QThread::finished, worker, &QObject::deleteLater);
connect(this, &Controller::operate, worker, &Worker::doWork);
connect(worker, &Worker::resultReady, this, &Controller::handleResults);
workerThread.start();
}
~Controller() {
workerThread.quit();
workerThread.wait();
}
public slots:
void handleResults(const QString &);
signals:
void operate(const QString &);
};
Вы можете найти больше поточной технологии здесь. Проверьте их все и решите, какой из них лучше всего подходит вашим потребностям.
C++
которую вы хотели бы перенести в новый поток?