我有一个C ++类。它继承了继承QQuickItem
的父类。因此,现在我无法继承QThread
,因为QQuickItem
已经存在
(如果尝试错误:Object is an ambiguous base of 'xClass'
)
我的班级已由qmlRegisterType
注册,我可以通过QML访问其方法。
从 QML 按下按钮时会运行一段代码。这段代码需要花费大量时间来执行,它会从 QML 窗口完全中窃取焦点。
如何在我的C ++类中编写一段代码,当我运行时不会将所有焦点都移植到自身?
答案 0 :(得分:1)
将阻止进程移动到新线程的一种方法是create a worker object by subclassing 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 &);
};
您可以找到更多线程技术here。检查它们并确定最适合您的需求。