C++QML

C++ & Qt5 Nas?l Kullan?l?r? Part 1

C++ ve Qt5 frameworkü beraber kullan?larak android windows mac ve linux için yaz?l?mlar geli?tirebilirsiniz.

Çok basit olarak;

  • Ba?lant?lar nas?l kurulur?
  • OOP nas?l aktif olarak kullan?l?r?
  • Sinyaller nas?l i?lenir ve kullan?l?r?
  • QML içinde bir C++ fonksiyonu nas?l ça?r?l?r?
  • C++ kodlar?m? nas?l QML içinde kullanabilirim?

Sorular?na cevaplar verece?iz

?lk olarak c++ ile header dosyam?z? haz?rlayal?m.

#ifndef DENEMESINIF_H
#define DENEMESINIF_H
#include <QApplication>

#include <QMetaObject>
#include <QGuiApplication>
#include <QQuickItem>

kütüphanelerimizi import ediyoruz

S?n?f?m?z? QObject s?n?f?ndan türetiyoruz.

class DenemeSinif:public QObject
{

    Q_OBJECT
public:

    DenemeSinif(QObject* parent = nullptr);
    ~DenemeSinif();
#endif // EVKONTROLPANELI_H

Basit bir ?ekilde s?n?f?m?z? olu?turduk ?imdi QML ile nas?l ba?lant? kuraca??m?za bakal?m.

Q_INVOKABLE & Q_PROPERTY tan?mlar?n? öncelikle ö?renmeliyiz

Q_INVOKABLE :

  • Q_INVOKABLE makrosu, bir s?n?f?n içindeki bir üye i?levin, Qt’nin meta nesne sistemi taraf?ndan ça?r?labilir oldu?unu belirtir.
  • Bu makro, Qt’nin dinamik özelliklere sahip oldu?u durumlarda, özellikle de sinyal/slot mekanizmas? kullan?l?rken, s?n?flar aras?nda i?lev ça?r?lar?n? kolayla?t?rmak için kullan?l?r.
  • Qt’nin meta nesne sistemi, çal??ma zaman?nda s?n?flar?n özelliklerini ve fonksiyonlar?n? sorgulamak ve ça??rmak için kullan?l?r. Q_INVOKABLE, bu sistemi kullan?rken i?levin d?? dünya taraf?ndan ça?r?labilir oldu?unu belirtir.
class MyObject : public QObject {
    Q_OBJECT
public:
    Q_INVOKABLE void myFunction() {
        // Fonksiyon kodlar? burada
    }
};

Q_PROPERTY:

  • Q_PROPERTY makrosu, bir s?n?f?n özelliklerini (property) tan?mlamak için kullan?l?r. Bu özellikler genellikle bir nesnenin durumunu veya de?erini temsil eder.
  • Bu makro, Qt’nin meta nesne sistemi taraf?ndan kullan?larak, özelliklere dinamik eri?im ve kontrol sa?lar. Özellikle GUI uygulamalar?nda, sinyal/slot mekanizmas?yla birlikte kullan?larak, arayüz elemanlar?yla ili?kilendirilen de?erleri yönetmek için kullan?l?r.
  • Q_PROPERTY ayr?ca Qt’nin özellikle Qt Designer gibi araçlar taraf?ndan kullan?labilen özelliklerini belirlemek için de kullan?l?r.
class MyObject : public QObject {
    Q_OBJECT
    Q_PROPERTY(int myProperty READ getMyProperty WRITE setMyProperty NOTIFY myPropertyChanged)

public:
    int getMyProperty() const {
        return m_myProperty;
    }

    void setMyProperty(int value) {
        if (m_myProperty != value) {
            m_myProperty = value;
            emit myPropertyChanged();
        }
    }

signals:
    void myPropertyChanged();

private:
    int m_myProperty;
};

Özetle e?er bir fonksiyon sadece bir i?lev yapacaksa ve karma??k de?ilse Q_INVOKABLE kullan?l?r. E?er bir i?lev de?i?tirme okuma sinyal i?lemleri içerecekse Q_PROPERTY kullan?l?r. Pratiklik aç?s?ndan Q_INVOKABLE kullan?m? daha basittir fakat Q_PROPERTY daha kullan??l? bir çözümdür.

Kodumuza devam edersek

Örnek bir Q_INVOKABLE kullan?m? yapal?m bu bir QNetworkAccessManager kullanarak ba?lanm?m?za yard?mc? olan bir fonksiyon olacakt?r.

Bir json verisini kullan?c? do?rulamas? yaparak bir http iste?i göndermeye çal??t???n? görüyoruz.

Q_INVOKABLE bool postDataAuth(QString url,QString jsonData,QString kullaniciAdi,QString sifre);

Fonksiyonun içeri?ine bakt???m?zda

bool DenemeSinif::postDataAuth(QString url, QString jsonData, QString kullaniciAdi, QString sifre)
{
    QUrl serviceUrl = QUrl(url);
    QNetworkRequest request(serviceUrl);

    // HTTP Header ayarlar?
    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");

    // Basic Auth için kullan?c? ad? ve ?ifreyi Base64 ile kodlama
    QByteArray auth = kullaniciAdi.toUtf8() + ":" + sifre.toUtf8();
    auth = "Basic " + auth.toBase64();
    request.setRawHeader("Authorization", auth);

    // JSON verisini QJsonDocument nesnesine dönü?türme
    QJsonDocument doc = QJsonDocument::fromJson(jsonData.toUtf8());

    // POST iste?ini gönderme
    manager->post(request, doc.toJson());

    return true;
}

fonksiyonun içerisinde yer alan verileri qml içerisinden göndererek sistemi tamamlayaca??z

QML kodumuza c++ kodlar?m?z? tan?tmak için

Main dosyam?za header dosyam?z? import ediyoruz

#include "DenemeSinif.h"

static QObject* denemeSinifSingletonFactory(QQmlEngine*, QJSEngine*)
{
    DenemeSinif* denemeSinif= new DenemeSinif;
    return evControl;
}

int main(int argc, char *argv[])
{

....

qmlRegisterSingletonType<DenemeSinif> ("COtomasyon.denemeSinif",    1, 0, "DenemeSinif",  denemeSinifSingletonFactory);

....
}

art?k kodlar?m?z? QML içerisinde kullanmaya haz?r?z

//QML içerisine
import COtomasyon.evControl 1.0

//örnek kullan?m

Button {
                            text: "aç"
                            onClicked: {
                                var url = apiUrl+"webhook";
                                var json = JSON.stringify({ [model.name]: "1" });
                                //EvControl.postData(url, json)
                                EvControl.postDataAuth(url,json,username,password)
                            }
                        }

Bu tarz bir örnek kullan?m ile QML içerisinde bir c++ fonksiyonunu kullanabilirsiniz.

Bir yanıt yazın