Как запустить кусок кода таким образом, чтобы он не крал весь фокус на себе в QtQuick?

0

У меня есть класс C++. Он наследует родительский класс, который наследует QQuickItem. Поэтому теперь я не могу наследовать от QThread поскольку QQuickItem уже существует.
(Ошибка при попытке: Object is an ambiguous base of 'xClass')

Мой класс был зарегистрирован qmlRegisterType и я могу получить доступ к его методам через QML.

Существует кусок кода, который запускается при нажатии кнопки с QML. Этот фрагмент кода занимает много времени, и он полностью захватывает фокус из окна QML.

Как написать часть кода в моем классе C++, который, когда я бегу, не крадет все внимание на себя?

  • 1
    Возможно, вам следует объяснить свою проблему более четко. У вас есть какая-то длинная блокирующая операция в вашем коде C++ которую вы хотели бы перенести в новый поток?
  • 0
    @thuga есть фрагмент кода, который запускается при нажатии кнопки из QML. Выполнение этого фрагмента кода занимает много времени, и оно полностью скрывает фокус из окна QML. Я не могу нигде щелкнуть в окне QML, пока этот фрагмент кода не завершит свою работу.
Показать ещё 4 комментария
Теги:
qt
qml
qthread

1 ответ

1
Лучший ответ

Одним из способов переноса процесса блокировки в новый поток является создание рабочего объекта путем подкласса QObject. Затем используйте сигналы и слоты для сигнала, когда поток должен обрабатывать некоторые данные и возвращать данные.

Вот пример из Qt docs:

class Worker : public QObject
{
    Q_OBJECT

public slots:
    void doWork(const QString &parameter) {
        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 &);
};

Вы можете найти больше поточной технологии здесь. Проверьте их все и решите, какой из них лучше всего подходит вашим потребностям.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню