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