在背景關系中創建并注冊類someClass some1in的物件。這個類創建了一個被推到執行緒上的類。在這個類中在運行(run)的程序中,執行緒內部創建了兩個物件:
和和發出的信號;在課堂上進行連接。mainqmlsomeClass2Var = new someClass2 ();someClass2Var-> moveToThread (& someThread);someClass2VarsomeThreadsomeClass4Var = new someClass4 ();someClass3Var = new someClass3 ();signalVarCreated ()someClass connect (this, & someClass :: signalsomeClass3fromSomeClass, someClass2Var.someClass3Var, & someClass3 :: signalsomeClass3) ;
當signalsomeClass3fromSomeClass從呼叫信號時qml,應該呼叫信號,
someClass3 :: signalsomeClass3后者又呼叫插槽someClass4 :: slotsomeClass4- 但它沒有。為什么?
如何實作主執行緒與另一個執行緒中創建的物件的通信?這是第一個問題。
第二個問題:類someClass3和someClass4位于同一個執行緒中someThread,在類someClass3中創建一個計時器,當呼叫完成時會發出signalsomeClass3 ()與插槽相關聯的信號someClass4 :: slotsomeClass4,但呼叫也不會發生。為什么?如何實施?是否有可能?
這個版本的作業是考慮讓應用為Android作業,有一個專案是在Windows下作業的,當Android中呼叫另一個服務時,應用就停止了,我的想法是將必要的類轉移到一個單獨的執行緒中,實踐表明,它不會停止,不像主執行緒,在當前專案中一切都已經實作,所以我想盡可能地使用它,上面描述的實作將是一個解決方案..
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
someClass some1;
qmlRegisterType<someClass>("FuelCore", 1, 0, "SomeClass");
engine.rootContext()->setContextProperty("MySomeClass", &some1);
const QUrl url(QStringLiteral("qrc:/main.qml"));
QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
&app, [url](QObject *obj, const QUrl &objUrl) {
if (!obj && url == objUrl)
QCoreApplication::exit(-1);
}, Qt::QueuedConnection);
engine.load(url);
return app.exec();
}
//---------------------------------------------------------
#ifndef SOMECLASS_H
#define SOMECLASS_H
#include <QObject>
#include <QThread>
#include "someclass2.h"
#include "someclass3.h"
#include "someclass4.h"
class someClass : public QObject
{
Q_OBJECT
public:
explicit someClass(QObject *parent = nullptr);
someClass2* someClass2Var;
QThread someThread;
signals:
void signalSomeClass();
void signalsomeClass3fromSomeClass();
};
#endif // SOMECLASS_H
//------------------------------------------------------------
#include "someclass.h"
someClass::someClass(QObject *parent) : QObject(parent)
{
someClass2Var = new someClass2();
connect(&someClass2Var, &someClass2::signalVarCreated, this, [this](){
connect(this,&someClass::signalsomeClass3fromSomeClass,someClass2Var.someClass3Var,&someClass3::signalsomeClass3);
});
connect(&someThread, &QThread::started, someClass2Var, &someClass2::run);
connect(this,&someClass::signalsomeClass3fromSomeClass,someClass2Var,&someClass2::signalsomeClass3_2);
someClass2Var->moveToThread(&someThread);
someClass2Var->setRunning(true);
someThread.start();
}
//----------------------------------------------------
#ifndef SOMECLASS2_H
#define SOMECLASS2_H
#include <QObject>
#include "someclass3.h"
#include "someclass4.h"
#include "someclass.h"
class someClass;
class someClass2 : public QObject
{
Q_OBJECT
public:
bool m_running;
explicit someClass2(QObject *parent = nullptr);
bool running() const;
void run();
int count;
void setRunning(bool running);
someClass3* someClass3Var;
someClass4* someClass4Var;
someClass *someParent;
signals:
void signalVarCreated();
void signalsomeClass3_2();
};
#endif // SOMECLASS2_H
//-------------------------------------------
#include "someclass2.h"
#include <QDebug>
#include <QThread>
someClass2::someClass2(QObject *parent) : QObject(parent)
{
}
bool someClass2::running() const
{
return m_running;
}
void someClass2::run()
{
someClass4Var= new someClass4();
someClass3Var= new someClass3();
connect(someClass3Var,&someClass3::signalsomeClass3,someClass4Var,&someClass4::slotsomeClass4);
signalVarCreated();
connect(this,&someClass2::signalsomeClass3_2,someClass4Var,&someClass4::slotsomeClass4);
while (m_running)
{
count ;
QThread::sleep (1);
}
}
void someClass2::setRunning(bool running)
{
if (m_running == running)
return;
m_running = running;
}
//----------------------------------------------------
#ifndef SOMECLASS3_H
#define SOMECLASS3_H
#include <QObject>
#include <QTimer>
class someClass3 : public QObject
{
Q_OBJECT
public:
explicit someClass3(QObject *parent = nullptr);
QTimer* tim;
signals:
void signalsomeClass3();
};
#endif // SOMECLASS3_H
//---------------------------------------------------
#include "someclass3.h"
#include <QThread>
#include <QDebug>
#include <QTimer>
someClass3::someClass3(QObject *parent) : QObject(parent)
{
tim = new QTimer();
tim->start(5000);
connect(tim, &QTimer::timeout, this, [this](){emit signalsomeClass3();});
}
//--------------------------------------------------
#ifndef SOMECLASS4_H
#define SOMECLASS4_H
#include <QObject>
#include <QDebug>
class someClass4 : public QObject
{
Q_OBJECT
public:
explicit someClass4(QObject *parent = nullptr);
signals:
public slots:
void slotsomeClass4() {qDebug()<<"voidslotsomeClass4";};
};
#endif // SOMECLASS4_H
//------------------------------------------------------------
Window {
visible: true
width: 640
height: 480
Button {
text: "Call someClass4 slot of object in QThread"
onClicked: {
MySomeClass.signalsomeClass3fromSomeClass()
}
}
}
uj5u.com熱心網友回復:
在清單中設定以下行
元資料 android: name = "android.app.background_running" android: value = "true"
是解決我在重疊在 Android 上運行的 Qt 應用程式的活動時要停止的問題的解決方案。因此,不再需要進行上述操作。
uj5u.com熱心網友回復:
為什么從 qml 中呼叫“signalsomeClass3fromSomeClass()”?并且您標記為信號,我認為它必須是插槽,請檢查此https://doc.qt.io/qt-5/qtqml-cppintegration-interactqmlfromcpp.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/355686.html
