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_INVOKABLEmakrosu, 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_PROPERTYmakrosu, 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_PROPERTYayr?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.

