我有一个C++类。它继承了继承QQuickItem的父类。因此现在我不能从QThread继承,因为QQuickItem已经存在了。
(尝试时出错:Object is an ambiguous base of 'xClass'
我的类已由qmlRegisterType注册,我可以通过QML访问它的方法。
有一段代码在QML中按下按钮时运行。这段代码需要大量的时间来执行,它完全从QML窗口窃取了焦点。
如何在我的C++类中编写一段代码,当我运行时,它不会窃取所有的焦点?

最佳答案

将阻塞进程移动到新线程的一种方法是create a worker object by subclassing QObject。然后使用信号和插槽来通知线程何时应该处理某些数据并返回数据。
以下是Qt文档中的一个示例:

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。把它们都查出来,然后决定哪一个最适合你的需要。

关于c++ - 如何运行一段代码,使其不会在QtQuick中夺走所有焦点?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25422053/

10-15 00:18