QML界面与Qt界面的区别
QML 是Qt 新引入的制作界面的框架,相比原始的Qt界面,QML可以做出更加丰富且美化的界面,且QML可以做移动端界面的开发,相比原始的Qt有更加强大的界面制作能力,但是QML在实现业务逻辑时,就显得格外的吃力。
如何让QML实现业务逻辑?
QML实现业务逻辑的方式是:
(1)创建一个C++的类,继承于QObject,包含宏Q_OBJECT
#ifndef TESTCLASS_H
#define TESTCLASS_H
#include <QObject>
#include <QDebug>
#include "threadclass.h"
class TestClass : public QObject
{
Q_OBJECT
public:
explicit TestClass(QObject *parent = nullptr);
signals:
void beginSig();
public slots:
void StartSlots();
};
#endif // TESTCLASS_H
(2)在QML工程下的main.cpp中注册新建的C++类
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include"testclass.h"
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
qmlRegisterType<TestClass>("Union.Lotto.TestClass",1,0,"TestClass");
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
if (engine.rootObjects().isEmpty())
return -1;
return app.exec();
}
(3)在需要使用的地方插入注册的C++类
import QtQuick 2.6
import QtQuick.Window 2.2
import Union.Lotto.TestClass 1.0
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello 测试")
TestClass{
id:testID
// onBeginSig: StartSlots()
}
MainForm {
button.onClicked: {
console.log("dakai")
testID.StartSlots()
}
}
}
以下是整个工程的代码,加入了一个处理线程
main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include"testclass.h"
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
qmlRegisterType<TestClass>("Union.Lotto.TestClass",1,0,"TestClass");
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
if (engine.rootObjects().isEmpty())
return -1;
return app.exec();
}
main.qml
import QtQuick 2.6
import QtQuick.Window 2.2
import Union.Lotto.TestClass 1.0
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello 测试")
TestClass{
id:testID
// onBeginSig: StartSlots()
}
MainForm {
Keys.onPressed: {
if(event.key == Qt.Key_A)
{
console.log("key_A")
}
}
button.onClicked: {
console.log("dakai")
// fun()
testID.StartSlots()
}
button1.onClicked: {
Qt.quit()
}
anchors.fill: parent
mouseArea.onClicked: {
console.log(qsTr('Clicked on background. Text: "' + '"'))
}
}
}
testclass.h
#ifndef TESTCLASS_H
#define TESTCLASS_H
#include <QObject>
#include <QDebug>
#include "threadclass.h"
class TestClass : public QObject
{
Q_OBJECT
public:
explicit TestClass(QObject *parent = nullptr);
signals:
void beginSig();
public slots:
void StartSlots();
};
#endif // TESTCLASS_H
testClass.cpp
#include "testclass.h"
TestClass::TestClass(QObject *parent) : QObject(parent)
{
}
void TestClass::StartSlots()
{
qDebug()<<"start slots";
/*for(int i = 0; i < 10; ++i)
{
qDebug()<< i;
}*/
ThreadClass *pth = new ThreadClass();//需要释放
pth->start();
}
线程文件threadclass.h
#ifndef THREADCLASS_H
#define THREADCLASS_H
#include <QObject>
#include <QThread>
#include <QDebug>
class ThreadClass : public QThread
{
public:
ThreadClass();
void run();
};
#endif // THREADCLASS_H
线程文件threadclass.cpp
#include "threadclass.h"
ThreadClass::ThreadClass()
{
}
void ThreadClass::run()
{
int i = 0;
while(1)
{
i++;
if(i >1000)
{
//break;
}
qDebug()<< i;
}
}