我有一个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 ¶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。把它们都查出来,然后决定哪一个最适合你的需要。
关于c++ - 如何运行一段代码,使其不会在QtQuick中夺走所有焦点?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25422053/