พฤศจิกายน 22, 2017, 10:52:54 am *
ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน
ส่งอีเมล์ยืนยันการใช้งาน?

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น
   หน้าแรก   ช่วยเหลือ เข้าสู่ระบบ สมัครสมาชิก  
หน้า: [1]   ลงล่าง
  พิมพ์  
ผู้เขียน หัวข้อ: Qt : ส่ง Signal จาก QML ไปให้ C++  (อ่าน 852 ครั้ง)
0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้
ShadowMan
Administrator
Hero Member
*****
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 8267


ShadowWares


| |
« เมื่อ: มิถุนายน 03, 2015, 07:28:53 pm »

Qt : ส่ง Signal จาก QML ไปให้ C++

ในตอนที่ผ่านมาได้แนะนำการส่งผ่านตัวแปรจาก C++ ไปให้ QML ในตอนนี้จะแนะนำสิ่งที่มีประโยชน์มากไม่แพ้กันอีกตัวหนึ่ง นั่นก้คือการส่งผ่าน Signal จาก QML มายัง C++
โดยการออกแบบโปรแกรมแล้ว QML จะใช้ในหารออกแบบ GUI ในขณะที่ C++ ใช้ในการประมวลผล และแน่นอน GUI ย่อมต้องประกอบไปด้วยส่วนติดต่อกับผู้ใชงาน และเมื่อผู้ใช้งานทำอะไรบางอย่างกับส่วนของ GUI (QML) โปรแกรม (C++) ก็ต้องประมวลผลเพื่อส่งคำตอบกลับไปให้ผู้ใช้งาน หรือกลับไปแสดงผลบน GUI นั่นเอง
ในที่นี้จะขอยกตัวอย่าง เมื่อผู้ใช้งาน (user) คลิกปุ่ม (button) ให้ C++ ทำการ reset ตัวแปร counter เป็น 0





อ้างอิงจากในตอนที่ผ่านมา:
ให้ทำการแก้ "mycounter.h" เป็น:

Code: (c)
#ifndef MYCOUNTER_H
#define MYCOUNTER_H

#include <QObject>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include <QTimer>

class MyCounter : public QObject
{
    Q_OBJECT
public:
    explicit MyCounter(QObject *parent = 0);
    int getCounter(void){return(counter);}
    void strat(void);
private:
    int counter;
    QQmlApplicationEngine *engine;
    QTimer *timer;
signals:

public slots:
    void countUp(void);
    void clearCounter();
};

#endif // MYCOUNTER_H


แก้ไข "mycounter.cpp" เป็น:
Code: (c)
#include "mycounter.h"

MyCounter::MyCounter(QObject *parent) : QObject(parent)
{
    this->counter = 0;
    engine = new QQmlApplicationEngine();
    engine->rootContext()->setContextProperty("counter", counter);
    engine->load(QUrl(QStringLiteral("qrc:/main.qml")));
    timer = new QTimer(this);
    QObject::connect(timer, SIGNAL(timeout()), this, SLOT(countUp()));

    QObject *object = engine->rootObjects().first();
    QObject::connect(object, SIGNAL(qmlSignal()), this, SLOT(clearCounter()));
}

void MyCounter::strat()
{
    timer->start(1);
}

void MyCounter::countUp(void)
{
    this->counter++;
    engine->rootContext()->setContextProperty("counter", counter);
}

void MyCounter::clearCounter()
{
    this->counter = 0;
}


แก้ไข "main.qml" เป็น:
Code: (xml)
import QtQuick 2.4
import QtQuick.Window 2.2

Window {

    signal qmlSignal()

    visible: true
    width:  300
    height: 50
    minimumWidth: 300
    minimumHeight: 50
    color: "red";

    Rectangle{
        id:button
        anchors.centerIn: parent
        width: parent.width/2
        height: parent.height/2
        radius: height/4
        border.width: 1

        color: "yellow"
    }

    MouseArea{
        id:mouseButtonArea
        anchors.fill: button
        hoverEnabled: true
        onEntered:{
            button.color="blue"
            text.color="white"
        }
        onExited: {
            button.color = "yellow"
            text.color="blue"
        }

        onClicked: {
            qmlSignal()
        }
    }

    Text {
        id:text
        anchors.centerIn: parent
        text: "Counter = " + counter
        color: counter>20?"green":"blue";
        font.pointSize: 12
    }
}


ส่วนที่สำคัญ:
ใน "mycounter.cpp":
Code: (c)
QObject *object = engine->rootObjects().first();
    QObject::connect(object, SIGNAL(qmlSignal()), this, SLOT(clearCounter()));

เป็นการเชื่อมโยง Signal and Slot ตามรูปแบบของ Qt โดยที่ตัวส่ง Signal ได้มาจาก root object ในที่นี่มองเป็น QML นั่นเอง
ความหมายคือ มีมี Signal จาก QML เกิดขึ้น (ฺButton ที่ GUI ถูกกด) ฟังก์ชั่น clearCounter() ใน C++ จะถูกเรียกให้ทำงานอัตโนมัติ


ใน "main.qml" มีการประกาศประกาศ function ที่เป็น signal function:
Code: (c)
signal qmlSignal()

และมีการการส่ง Signal (เรียกใช้ฟังกืชั่น) ที่ onClicked:
Code: (xml)
        onClicked: {
            qmlSignal()
        }


นั่นหมายความว่าเมื่อปุ่มถูกกด ตัว Counter ก็ถูก reset เป็น 0 นั่นเอง
จากตอนที่ผ่านมา รวมกันกับตอนนี้ถือได้ว่ามากพอสำหรับการสร้างโปรแกรมให้ประมวลผลด้วย C++ และออกแบบ GUI สวยๆ ด้วย QML แล้วครับ

บันทึกการเข้า

By SDW: Do No Wrong Is Do Nothing
          If you want to increase your success rate, double your failure rate
หน้า: [1]   ขึ้นบน
  พิมพ์  
 
กระโดดไป: