如何运行一段代码使得它不会在QtQuick中窃取所有焦点?

时间:2014-08-21 08:52:53

标签: c++ linux qt qml qthread

我有一个C ++类。它继承了继承QQuickItem的父类。因此,现在我无法继承QThread,因为QQuickItem已经存在 (如果尝试错误:Object is an ambiguous base of 'xClass'

我的班级已由qmlRegisterType注册,我可以通过QML访问其方法。

QML 按下按钮时会运行一段代码。这段代码需要花费大量时间来执行,它会从 QML 窗口完全中窃取焦点。

如何在我的C ++类中编写一段代码,当我运行时不会将所有焦点都移植到自身?

1 个答案:

答案 0 :(得分:1)

将阻止进程移动到新线程的一种方法是create a worker object by subclassing 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 &);
};

您可以找到更多线程技术here。检查它们并确定最适合您的需求。