QML分离业务逻辑代码

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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值