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.