{"id":1701,"date":"2020-02-24T18:23:01","date_gmt":"2020-02-24T18:23:01","guid":{"rendered":"https:\/\/www.yazilimperver.com\/?p=1701"},"modified":"2020-11-21T16:33:49","modified_gmt":"2020-11-21T16:33:49","slug":"qmlcplusplusintegration","status":"publish","type":"post","link":"https:\/\/www.yazilimperver.com\/index.php\/2020\/02\/24\/qmlcplusplusintegration\/","title":{"rendered":"Haftal\u0131k C++ 25 \u2013 QML\/C++ Entegrasyonu"},"content":{"rendered":"<p>Sizlerin de takip etti\u011fi \u00fczere, bir s\u00fcredir\u00a0 QT ve QML kullan\u0131m\u0131na ili\u015fkin bir \u00e7ok yaz\u0131 ve kod payla\u015f\u0131yorum. Bug\u00fcn de sizlerle QML ile C++&#8217;\u0131 nas\u0131l kullanabilece\u011finize, bu kullan\u0131m s\u0131ras\u0131nda dikkat etmeniz gereken hususlara, bir ka\u00e7 \u00f6rnek \u00fczerinden bakaca\u011f\u0131z. Bu yaz\u0131 ile birlikte, kendi QML ve C++ uygulamar\u0131n\u0131z\u0131 kolay bir \u015fekilde geli\u015ftirebilece\u011finizi umuyorum.<\/p>\n<p>Bu yaz\u0131da, QML ve C++ kullan\u0131m\u0131na ili\u015fkin, temel ve gerekli oldu\u011funu d\u00fc\u015f\u00fcnd\u00fc\u011f\u00fcm bir tak\u0131m konulara de\u011finece\u011fim, daha karma\u015f\u0131k konulara (C++ modelleri ile QML&#8217;i nas\u0131l entegre edebiliriz, \u00f6zellikle ListView, ComboBox gibi bile\u015fenler i\u00e7in) ise farkl\u0131 yaz\u0131larda e\u011filece\u011fiz.<\/p>\n<p>Bu yaz\u0131ma belli ba\u015fl\u0131 sorular ile y\u00f6n vermek istiyorum. O zaman ilk soru ile ba\u015flayal\u0131m.<\/p>\n<h2><span style=\"color: #0000ff;\"><strong>Neden C++\/QML kullanmal\u0131y\u0131m?<\/strong><\/span><\/h2>\n<p>Asl\u0131nda bakarsan\u0131z bu soru, biraz da sizin ihtiya\u00e7lar\u0131n\u0131za ba\u011fl\u0131. Normal \u015fartlarda, sadece QML veya sadece C++ kullanarak da pekala bir \u00e7ok ihtiyac\u0131n\u0131z\u0131 ger\u00e7ekle\u015ftirebilecek uygulamalar geli\u015ftirebilirsiniz. Bana kal\u0131rsa bu birlikteli\u011fin, en \u00f6nemli iki avantaj\u0131, g\u00f6rsel k\u0131s\u0131mlar ile i\u015flem yo\u011fun k\u0131s\u0131mlar\u0131 birbirinden kolay bir \u015fekilde ay\u0131rmak ve hali haz\u0131rda mevcut kodlar\u0131n\u0131z\u0131 kullanabilmek derim. Tabi, C++ kullanabilmek de, benim gibi yaz\u0131l\u0131mperver dostlar i\u00e7in bir motivasyon olabilir. Bu hususlar\u0131 biraz daha anlamak ad\u0131na C++ m\u0131 QML mi sorular\u0131na, ayr\u0131 ayr\u0131 bakal\u0131m.<\/p>\n<h2><span style=\"color: #0000ff;\"><strong>Neden C++ kullanmal\u0131y\u0131z?<\/strong><\/span><\/h2>\n<p>E\u011fer uzun bir s\u00fcredir sayfam\u0131 takip ediyorsan\u0131z art\u0131k C++&#8217;\u0131 neden ve nerede kullanman\u0131z gerekti\u011fini biliyorsunuzdur diye umuyorum ama burada QML ve QT anlam\u0131nda tekrar bakacak ve hat\u0131rlayacak olursak. E\u011fer veri yo\u011fun ve performans kritik bir i\u015f yapacaksan\u0131z. C++ sizin i\u00e7in do\u011fru se\u00e7im olacakt\u0131r. QML ile kar\u015f\u0131la\u015ft\u0131racak olursak, C++ kodu, binary dosyalar olu\u015fturacak ve QML ve benzeri kodlara g\u00f6re daha tutarl\u0131 ve emniyetli bir se\u00e7enek olacakt\u0131r. Her ne kadar ben hen\u00fcz bu \u00f6zellikleri kullanmam\u0131\u015f olsam da, QT C++ k\u00fct\u00fcphaneleri baz\u0131 ileri seviye kullan\u0131mlarda QML&#8217;den daha fazla \u00f6zellik sunuyorlarm\u0131\u015f.<\/p>\n<p>Son olarak, QML, a\u00e7\u0131l\u0131\u015f zaman\u0131nda bir tak\u0131m haz\u0131rl\u0131klar ve i\u015fler yapt\u0131\u011f\u0131 i\u00e7in C++ uygulamas\u0131na g\u00f6re biraz daha yava\u015f olacakt\u0131r. Bu konu ile ilgili a\u015fa\u011f\u0131daki sayfada g\u00fczel bir kar\u015f\u0131la\u015ft\u0131rma ve analiz bulabilirsiniz. \u015eunu da ifade etmeliyim ki, ilgili yaz\u0131 Qt 5.8 i\u00e7in yaz\u0131lm\u0131\u015f, yani o zamandan bu yana performans anlam\u0131nda ilerleme oldu\u011funu muhakkak g\u00f6z \u00f6n\u00fcnde bulundurmal\u0131s\u0131n\u0131z.<\/p>\n<p><strong><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/woboq.com\/blog\/qml-vs-cpp-for-application-startup-time.html\">https:\/\/woboq.com\/blog\/qml-vs-cpp-for-application-startup-time.html<\/a><\/span><\/strong><\/p>\n<p>\u015eimdi, di\u011fer soruya bakal\u0131m.<\/p>\n<h2><strong><span style=\"color: #0000ff;\">Neden QML kullanmal\u0131y\u0131z?<\/span><\/strong><\/h2>\n<p>\u00d6zellikle, \u00e7oklu platform destekleyecek aray\u00fczlerin geli\u015ftirilmesi i\u00e7in QML kullan\u0131lmas\u0131n\u0131 tavsiye ediyoruz. Asl\u0131nda bu konuya a\u015fa\u011f\u0131daki yaz\u0131mda k\u0131saca de\u011finmi\u015ftim:<\/p>\n<p><strong><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2019\/07\/26\/qt-bcom-serisi-2\/\">QT (B\u00c7OM Serisi \u2013 2)<\/a><\/span><\/strong><\/p>\n<p>Burada bir ka\u00e7 \u00f6nemli hususun \u00fczerinden ge\u00e7ece\u011fiz. \u00d6ncelikle QML ve Javascript hem \u00f6\u011frenmesi kolay hem de aray\u00fcz geli\u015ftirmek, bu sayede hem zamandan hem geli\u015ftirilecek kod miktar\u0131 ciddi anlamda azalmakta. QML ile gelen \u00f6zelliklerin ba\u011flanmas\u0131, durum y\u00f6netimleri, sinyaller gibi bir \u00e7ok mekanizma da size bu anlamdan kolayl\u0131k sa\u011flayacaklar. Bir di\u011fer \u00f6nemli avantaj da, animasyonlar\u0131n \u00e7ok kolay bir \u015fekilde yap\u0131labilmesi ve bunlar\u0131n mevcut bile\u015fenler ile kolay bir \u015fekilde ili\u015fkilendirilebilmesi. G\u00f6rselle\u015ftirme performans anlam\u0131nda da QML&#8217;in avantaj\u0131 mevcut. Arka planda OpenGL ve C++ kullan\u0131lmas\u0131 sebebi ile mobil ayg\u0131tlarda sizi pek \u00fczmeyecektir.<\/p>\n<p>Evet h\u0131zl\u0131ca C++ ve QML perspektifinden olaya bakt\u0131ktan sonra art\u0131k bu ikisini birlikte nas\u0131l kullanabilece\u011fimize g\u00f6z atal\u0131m.<\/p>\n<h2><strong><span style=\"color: #0000ff;\">C++\/QML kullan\u0131m\u0131<\/span><\/strong><\/h2>\n<p>Evet gelelim bu i\u015fi nas\u0131l yapaca\u011f\u0131m\u0131za. Bu ba\u015fl\u0131ktan itibaren, ad\u0131m ad\u0131m ve \u00f6rnek bir kod \u00fczerinden gidiyor olaca\u011f\u0131z. Burada geli\u015ftirdi\u011fimiz kodlara a\u015fa\u011f\u0131daki adresten de ula\u015fabilirsiniz:<\/p>\n<p><span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"https:\/\/github.com\/yazilimperver\/QmlCPlusPlusIntegration\">https:\/\/github.com\/yazilimperver\/QmlCPlusPlusIntegration<\/a><\/strong><\/span><\/p>\n<p>\u00d6ncelikle, QML uygulamalar\u0131, bir \u00e7al\u0131\u015fma zaman\u0131 ortam\u0131nda \u00e7al\u0131\u015ft\u0131r\u0131lmaktad\u0131r. Bu \u00e7al\u0131\u015fma zaman\u0131 da C++ kullan\u0131larak QtQml mod\u00fcl\u00fc i\u00e7erisinde geli\u015ftirilmi\u015ftir. Bu anlamda, ihtiya\u00e7 duyaca\u011f\u0131m\u0131z ilk \u015fey QML kodumuzu, bu \u00e7al\u0131\u015fma zaman\u0131 motoruna sa\u011flamak olacak. Bunun i\u00e7in de a\u015fa\u011f\u0131daki kodu kullanaca\u011f\u0131z:<\/p>\n<pre class=\"lang:c++ decode:true\">#include &lt;QGuiApplication&gt;\r\n#include &lt;QQmlApplicationEngine&gt;\r\n\r\nint main(int argc, char *argv[])\r\n{\r\n    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);\r\n    QGuiApplication app(argc, argv);\r\n\r\n    QQmlApplicationEngine engine;\r\n    const QUrl url(QStringLiteral(\"qrc:\/main.qml\"));\r\n    QObject::connect(&amp;engine, &amp;QQmlApplicationEngine::objectCreated,\r\n                     &amp;app, [url](QObject *obj, const QUrl &amp;objUrl) {\r\n        if (!obj &amp;&amp; url == objUrl)\r\n            QCoreApplication::exit(-1);\r\n    }, Qt::QueuedConnection);\r\n    engine.load(url);\r\n\r\n    return app.exec();\r\n}\r\n<\/pre>\n<p>QML, QT&#8217;in &#8220;Meta Object System&#8221;ini kulland\u0131\u011f\u0131 i\u00e7in, QML i\u00e7erisinde C++ kodunu \u00e7a\u011f\u0131rmak, olduk\u00e7a kolay. Bunu ger\u00e7ekle\u015ftirmek i\u00e7in \u00f6ncelikle:<\/p>\n<ul>\n<li>\u0130lgili C++ s\u0131n\u0131f\u0131m\u0131z <em>QObject<\/em>&#8216;ten t\u00fcretilmeli, <strong>Q_OBJECT<\/strong> makrosu s\u0131n\u0131f tan\u0131m\u0131 i\u00e7erisinde olmal\u0131d\u0131r:<\/li>\n<\/ul>\n<pre class=\"lang:c++ decode:true\">\/\/ Our header file\r\n#pragma once\r\n#include &lt;QObject&gt;\r\n#include &lt;QString&gt;\r\n\r\nclass BackEndClass : public QObject {\r\n    Q_OBJECT\r\npublic:\r\n    explicit BackEndClass(QObject *parent = nullptr);\r\n};\r\n<\/pre>\n<ul>\n<li>Daha sonra s\u0131n\u0131f\u0131m\u0131z\u0131 main.cpp i\u00e7erisinden a\u015fa\u011f\u0131da belirtildi\u011fi \u015fekilde kay\u0131t ettirmemiz gerekiyor. Bundan sonra art\u0131k <em>BackEndClass<\/em> bir tip olarak eklenmi\u015f oldu, bu tipi de QML i\u00e7erisinden kullanmak i\u00e7in &#8220;import yazilimperver.example.backend 1.0&#8221; eklememiz yeterli olacak.<\/li>\n<\/ul>\n<pre class=\"lang:c++ decode:true\">#include &lt;QGuiApplication&gt;\r\n#include &lt;QQmlApplicationEngine&gt;\r\n\r\n#include \"BackEndClass.h\"\r\n\r\nint main(int argc, char *argv[])\r\n{\r\n    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);\r\n    QGuiApplication app(argc, argv);\r\n\r\n    \/\/ Sinifimizi kaydettirdigimiz yer\r\n    qmlRegisterType&lt;BackEndClass&gt;(\"yazilimperver.examples.BackEndClass\", 1, 0, \"BackEndClass\");\r\n\r\n    QQmlApplicationEngine engine;\r\n    const QUrl url(QStringLiteral(\"qrc:\/main.qml\"));\r\n    QObject::connect(&amp;engine, &amp;QQmlApplicationEngine::objectCreated,\r\n                     &amp;app, [url](QObject *obj, const QUrl &amp;objUrl) {\r\n        if (!obj &amp;&amp; url == objUrl)\r\n            QCoreApplication::exit(-1);\r\n    }, Qt::QueuedConnection);\r\n    engine.load(url);\r\n\r\n    return app.exec();\r\n}\r\n<\/pre>\n<ul>\n<li>Son tahlilde bu \u00f6rnek i\u00e7in a\u015fa\u011f\u0131daki QML dosyas\u0131n\u0131 kullanaca\u011f\u0131z.\u00a0 Burada <em>BackEndClass<\/em> s\u0131n\u0131f\u0131m\u0131z\u0131n da nas\u0131l QML i\u00e7erisinde kullanabilece\u011fimizi g\u00f6rebilirsiniz. Asl\u0131nda di\u011fer bile\u015fenlerden pek bir fark\u0131 yok.<\/li>\n<\/ul>\n<pre class=\"lang:c++ decode:true\">import QtQuick 2.7\r\nimport QtQuick.Controls 2.0\r\nimport QtQuick.Layouts 1.0\r\nimport yazilimperver.examples.BackEndClass 1.0\r\n\r\nApplicationWindow\r\n{\r\n    width: 640\r\n    height: 480\r\n    visible: true\r\n\r\n    BackEndClass{\r\n        id: myBackEndClass\r\n    }\r\n\r\n    ColumnLayout{\r\n        spacing: 2\r\n        anchors.fill: parent\r\n        Rectangle {\r\n            color: \"green\"\r\n            Layout.fillWidth: true\r\n            height: 40\r\n            Text {\r\n                text: \"QML\/C++ Integration Example\"\r\n                verticalAlignment: Text.AlignVCenter\r\n                horizontalAlignment: Text.AlignHCenter\r\n                anchors.top: parent.top\r\n                height: parent.height\r\n                width:parent.width\r\n                font.family: \"Helvetica\"\r\n                font.pointSize: 16\r\n                font.capitalization: Font.AllUppercase\r\n                color: \"white\" }\r\n        }\r\n        Rectangle{\r\n            color:\"blue\"\r\n            Layout.fillHeight: true\r\n            Layout.fillWidth: true\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<p>Tabi ki i\u015fimiz burada bitmedi. Bilakis yeni ba\u015fl\u0131yoruz. \u015eimdi geldik, QML ve QT aras\u0131ndaki etkile\u015fimleri nas\u0131l ger\u00e7ekle\u015ftirebilece\u011fimize. Asl\u0131na bakarsan\u0131z, &#8220;Meta Object System&#8221; sayesinde normal <em>QObject<\/em>&#8216;ten t\u00fcretilmi\u015f C++ s\u0131n\u0131flar\u0131 ile benzer \u015fekilde kullanabilece\u011fiz. O zaman gelsin sorular. \u00d6ncelikle, verileri nas\u0131l payla\u015fabiliriz?<\/p>\n<h2><span style=\"color: #0000ff;\"><strong>QML\/C++ veri payla\u015f\u0131m\u0131<\/strong><\/span><\/h2>\n<p>Qt bizler i\u00e7in temel, QT s\u0131n\u0131flar\u0131n\u0131 QML&#8217;e de sunmakta, yani <em>QString<\/em> ve benzeri tipleri kullanmak i\u00e7in \u00f6zel bir \u015fey yapman\u0131za gerek yok. Tabi bunlar\u0131 ayn\u0131 isimler kullanamayabilirsiniz (temel tipler d\u0131\u015f\u0131nda). Bir fikir vermesi a\u00e7\u0131s\u0131ndan temel QT veri tiplerini buraya ekliyorum. Daha detayl\u0131 bilgi i\u00e7in <strong><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/doc.qt.io\/qt-5\/qtqml-cppintegration-data.html\">https:\/\/doc.qt.io\/qt-5\/qtqml-cppintegration-data.html<\/a><\/span> <\/strong>sayfas\u0131na g\u00f6z atabilirsiniz.<\/p>\n<table class=\"generic\">\n<tbody>\n<tr class=\"odd\" valign=\"top\">\n<td><strong>Qt Tipi<\/strong><\/td>\n<td><strong>QML Kar\u015f\u0131l\u0131\u011f\u0131<\/strong><\/td>\n<\/tr>\n<tr class=\"even\" valign=\"top\">\n<td>bool<\/td>\n<td><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/doc.qt.io\/qt-5\/qml-bool.html\">bool<\/a><\/span><\/td>\n<\/tr>\n<tr class=\"odd\" valign=\"top\">\n<td>unsigned int, int<\/td>\n<td><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/doc.qt.io\/qt-5\/qml-int.html\">int<\/a><\/span><\/td>\n<\/tr>\n<tr class=\"even\" valign=\"top\">\n<td>double<\/td>\n<td><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/doc.qt.io\/qt-5\/qml-double.html\">double<\/a><\/span><\/td>\n<\/tr>\n<tr class=\"odd\" valign=\"top\">\n<td>float, qreal<\/td>\n<td><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/doc.qt.io\/qt-5\/qml-real.html\">real<\/a><\/span><\/td>\n<\/tr>\n<tr class=\"even\" valign=\"top\">\n<td><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/doc.qt.io\/qt-5\/qstring.html\">QString<\/a><\/span><\/td>\n<td><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/doc.qt.io\/qt-5\/qml-string.html\">string<\/a><\/span><\/td>\n<\/tr>\n<tr class=\"odd\" valign=\"top\">\n<td><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/doc.qt.io\/qt-5\/qurl.html\">QUrl<\/a><\/span><\/td>\n<td><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/doc.qt.io\/qt-5\/qml-url.html\">url<\/a><\/span><\/td>\n<\/tr>\n<tr class=\"even\" valign=\"top\">\n<td><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/doc.qt.io\/qt-5\/qcolor.html\">QColor<\/a><\/span><\/td>\n<td><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/doc.qt.io\/qt-5\/qml-color.html\">color<\/a><\/span><\/td>\n<\/tr>\n<tr class=\"odd\" valign=\"top\">\n<td><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/doc.qt.io\/qt-5\/qfont.html\">QFont<\/a><\/span><\/td>\n<td><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/doc.qt.io\/qt-5\/qml-font.html\">font<\/a><\/span><\/td>\n<\/tr>\n<tr class=\"even\" valign=\"top\">\n<td><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/doc.qt.io\/qt-5\/qdatetime.html\">QDateTime<\/a><\/span><\/td>\n<td><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/doc.qt.io\/qt-5\/qml-date.html\">date<\/a><\/span><\/td>\n<\/tr>\n<tr class=\"odd\" valign=\"top\">\n<td><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/doc.qt.io\/qt-5\/qpoint.html\">QPoint<\/a>,\u00a0<a style=\"color: #008000;\" href=\"https:\/\/doc.qt.io\/qt-5\/qpointf.html\">QPointF<\/a><\/span><\/td>\n<td><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/doc.qt.io\/qt-5\/qml-point.html\">point<\/a><\/span><\/td>\n<\/tr>\n<tr class=\"even\" valign=\"top\">\n<td><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/doc.qt.io\/qt-5\/qsize.html\">QSize<\/a>,\u00a0<a style=\"color: #008000;\" href=\"https:\/\/doc.qt.io\/qt-5\/qsizef.html\">QSizeF<\/a><\/span><\/td>\n<td><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/doc.qt.io\/qt-5\/qml-size.html\">size<\/a><\/span><\/td>\n<\/tr>\n<tr class=\"odd\" valign=\"top\">\n<td><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/doc.qt.io\/qt-5\/qrect.html\">QRect<\/a>,\u00a0<a style=\"color: #008000;\" href=\"https:\/\/doc.qt.io\/qt-5\/qrectf.html\">QRectF<\/a><\/span><\/td>\n<td><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/doc.qt.io\/qt-5\/qml-rect.html\">rect<\/a><\/span><\/td>\n<\/tr>\n<tr class=\"even\" valign=\"top\">\n<td><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/doc.qt.io\/qt-5\/qmatrix4x4.html\">QMatrix4x4<\/a><\/span><\/td>\n<td><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/doc.qt.io\/qt-5\/qml-matrix4x4.html\">matrix4x4<\/a><\/span><\/td>\n<\/tr>\n<tr class=\"odd\" valign=\"top\">\n<td><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/doc.qt.io\/qt-5\/qquaternion.html\">QQuaternion<\/a><\/span><\/td>\n<td><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/doc.qt.io\/qt-5\/qml-quaternion.html\">quaternion<\/a><\/span><\/td>\n<\/tr>\n<tr class=\"even\" valign=\"top\">\n<td><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/doc.qt.io\/qt-5\/qvector2d.html\">QVector2D<\/a>,\u00a0<a style=\"color: #008000;\" href=\"https:\/\/doc.qt.io\/qt-5\/qvector3d.html\">QVector3D<\/a>,\u00a0<a style=\"color: #008000;\" href=\"https:\/\/doc.qt.io\/qt-5\/qvector4d.html\">QVector4D<\/a><\/span><\/td>\n<td><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/doc.qt.io\/qt-5\/qml-vector2d.html\">vector2d<\/a>,\u00a0<a style=\"color: #008000;\" href=\"https:\/\/doc.qt.io\/qt-5\/qml-vector3d.html\">vector3d<\/a>,\u00a0<a style=\"color: #008000;\" href=\"https:\/\/doc.qt.io\/qt-5\/qml-vector4d.html\">vector4d<\/a><\/span><\/td>\n<\/tr>\n<tr class=\"odd\" valign=\"top\">\n<td>Enums declared with\u00a0<span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/doc.qt.io\/qt-5\/qobject.html#Q_ENUM\">Q_ENUM<\/a><\/span>() or Q_ENUMS()<\/td>\n<td><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/doc.qt.io\/qt-5\/qml-enumeration.html\">enumeration<\/a><\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Bunlar yan\u0131nda, s\u0131ral\u0131 veri tipleri\/dizileri de Javascript dizisi olarak kullan\u0131labilmektedir.<\/p>\n<p>Kendi tiplerimizi nas\u0131l kullanaca\u011f\u0131m\u0131za da zaten bakt\u0131k. Bunlar\u0131 \u00f6ncelikle .cpp dosyas\u0131 i\u00e7erisinde kaydettiriyoruz ve daha sonra &#8220;import&#8221; mekanizmas\u0131 ile bunu qml i\u00e7erisinde de kullanabilece\u011fiz.<\/p>\n<h2><span style=\"color: #0000ff;\"><strong>QML\/C++ aras\u0131 etkile\u015fim<\/strong><\/span><\/h2>\n<p>QML ile C++ aras\u0131ndaki etkile\u015fimi bir ka\u00e7 \u015fekilde ger\u00e7ekle\u015ftirebiliyoruz. Temel olarak bu etkile\u015fim tan\u0131mlad\u0131\u011f\u0131m\u0131z C++ s\u0131n\u0131flar\u0131 \u00fczerinden ger\u00e7ekle\u015ftiriliyor. Bu s\u0131n\u0131f\u0131 nas\u0131l tan\u0131mlayaca\u011f\u0131m\u0131za yukar\u0131da bakt\u0131k. QML kodu bu s\u0131n\u0131flardaki a\u015fa\u011f\u0131dakilere eri\u015febilmektedir:<\/p>\n<ul>\n<li>Uygun bir \u015fekilde (bunun nas\u0131l olaca\u011f\u0131na hemen bakaca\u011f\u0131z) tan\u0131mlanan de\u011fi\u015fkenler (&#8220;properties&#8221;),<\/li>\n<li>Uygun bir \u015fekilde (bunun da nas\u0131l olaca\u011f\u0131na hemen bakaca\u011f\u0131z) tan\u0131mlanan metotlar,<\/li>\n<li>Tan\u0131mlanm\u0131\u015f olan slot&#8217;lara ba\u011flant\u0131 kurup\/\u00e7a\u011f\u0131rabiliriz,<\/li>\n<li>Tan\u0131mlanm\u0131\u015f olan sinyalleri tetikleyebiliriz.<\/li>\n<\/ul>\n<p>\u015eimdi gelelim bu &#8220;uygun bir \u015fekilde&#8221; ibarelerini nas\u0131l sa\u011flayaca\u011f\u0131m\u0131za \ud83d\ude42<\/p>\n<p>\u00d6ncelikle de\u011fi\u015fkenlere bakal\u0131m. S\u0131nf\u0131lar\u0131n\u0131za ili\u015fkin de\u011fi\u015fkenlerin QML taraf\u0131ndan kullan\u0131labilmesi i\u00e7in <strong>Q_PROPERTY<\/strong> makrosu ile tan\u0131mlanm\u0131\u015f olmalar\u0131 gerekmektedir. Hemen bir \u00f6rne\u011fe bakal\u0131m:<\/p>\n<pre class=\"lang:c++ decode:true\">\/\/ Our header file\r\n#pragma once\r\n#include &lt;QObject&gt;\r\n#include &lt;QString&gt;\r\n\r\nclass BackEndClass : public QObject {\r\n    Q_OBJECT\r\n    Q_PROPERTY(QString message READ message WRITE setMessage NOTIFY messageChanged)\r\npublic:\r\n    explicit BackEndClass(QObject *parent = nullptr);\r\n\r\n    \/\/ Degiskenimizin \"setter\" metodu\r\n    void setMessage(const QString &amp;msg);\r\n\r\n    \/\/ Degiskenimizin \"getter\" metodu\r\n    QString message() const;\r\n\r\nsignals:\r\n    \/\/ Degiskenimize iliskin sinyal\r\n    void messageChanged();\r\n\r\nprivate:\r\n    \/\/ Degiskenimiz\r\n    QString mMessage;\r\n};\r\n<\/pre>\n<p>Bu tan\u0131mlama ile birlikte QML taraf\u0131ndan\u00a0<em>message\u00a0<\/em>de\u011fi\u015fkenine eri\u015filebilir ve bu de\u011fi\u015fkene ili\u015fkin de\u011fi\u015fiklikler de ilgili\u00a0<em>messageChanged<\/em> sinyali ile QML taraf\u0131na bildirilebilecektir. \u015eimdi gelelim sinyal ve slot&#8217;lar d\u0131\u015f\u0131ndaki metotlar\u0131 QML taraf\u0131ndan kullanabilmek i\u00e7in yapmam\u0131z gerekenlere.<\/p>\n<p>Asl\u0131nda bu da olduk\u00e7a kolay. Bunun i\u00e7in de <strong>Q_INVOKABLE<\/strong> makrosunu kullan\u0131yoruz, basit\u00e7e ilgili <em>public\u00a0<\/em>metodun \u00f6n\u00fcne bunu eklemeniz yeterli. Bunun i\u00e7in de C++ i\u00e7erisinde bir saya\u00e7 de\u011fi\u015fkeni ekliyoruz ve bunun artt\u0131r\u0131lmas\u0131 i\u00e7in bir metot ve s\u0131f\u0131rlanmas\u0131 i\u00e7in bir slot tan\u0131ml\u0131yoruz:<\/p>\n<pre class=\"lang:c++ decode:true \">\/\/ Our header file\r\n#pragma once\r\n#include &lt;QObject&gt;\r\n#include &lt;QString&gt;\r\n#include &lt;QVector&gt;\r\n\r\nclass BackEndClass : public QObject {\r\n    Q_OBJECT\r\n\r\n    \/\/ Ilgili mesaj degiskenine erisim yontemi\r\n    Q_PROPERTY(QString message READ message WRITE setMessage NOTIFY messageChanged)\r\npublic:\r\n    explicit BackEndClass(QObject *parent = nullptr);\r\n\r\n    \/\/ Mevcut sayac degerini don\r\n    Q_INVOKABLE int incrementCounter();\r\n\r\n    \/\/ Degiskenimizin \"setter\" metodu\r\n    void setMessage(const QString &amp;msg);\r\n\r\n    \/\/ Degiskenimizin \"getter\" metodu\r\n    QString message() const;\r\n\r\nsignals:\r\n    \/\/ Degiskenimize iliskin sinyal\r\n    void messageChanged();\r\n\r\npublic slots:\r\n    void resetCounter();\r\n\r\nprivate:\r\n    \/\/ Degiskenimiz\r\n    QString mMessage {\"Hello from BackEndClass!\"};\r\n\r\n    \/\/ Sayac\r\n    int mCounter{0};\r\n};\r\n<\/pre>\n<p>Son olarak QML taraf\u0131n\u0131 da a\u015fa\u011f\u0131daki gibi g\u00fcncelleyerek \u00f6rne\u011fimizi tamaml\u0131yoruz:<\/p>\n<pre class=\"minimize:true lang:c++ decode:true\">import QtQuick 2.7\r\nimport QtQuick.Controls 2.0\r\nimport QtQuick.Layouts 1.0\r\nimport yazilimperver.examples.BackEndClass 1.0\r\n\r\nApplicationWindow\r\n{\r\n    width: 640\r\n    height: 480\r\n    visible: true\r\n\r\n    BackEndClass{\r\n        id: myBackEndClass\r\n    }\r\n\r\n    ColumnLayout{\r\n        spacing: 2\r\n        anchors.fill: parent\r\n        Rectangle {\r\n            color: \"green\"\r\n            Layout.fillWidth: true\r\n            height: 40\r\n            Text {\r\n                text: \"QML\/C++ Integration Example\"\r\n                horizontalAlignment: Text.AlignHCenter\r\n                verticalAlignment: Text.AlignVCenter\r\n                width:parent.width\r\n                height:parent.height\r\n                font.family: \"Helvetica\"\r\n                font.pointSize: 12\r\n                color: \"white\"\r\n            }\r\n        }\r\n        \/\/ Mesaj satirir\r\n        RowLayout{\r\n            Layout.fillWidth: true\r\n            Rectangle {\r\n                color: \"red\"\r\n                width: 200\r\n                height: 40\r\n                Text {\r\n                    text: \"Message: \"\r\n                    horizontalAlignment: Text.AlignHCenter\r\n                    verticalAlignment: Text.AlignVCenter\r\n                    width:parent.width\r\n                    height:parent.height\r\n                    font.family: \"Helvetica\"\r\n                    font.pointSize: 12\r\n                    color: \"white\"\r\n                }\r\n            }\r\n            Rectangle {\r\n                color: \"brown\"\r\n                Layout.fillWidth: true\r\n                height: 40\r\n                Text {\r\n                    text: myBackEndClass.message\r\n                    horizontalAlignment: Text.AlignHCenter\r\n                    verticalAlignment: Text.AlignVCenter\r\n                    width:parent.width\r\n                    height:parent.height\r\n                    font.family: \"Helvetica\"\r\n                    font.pointSize: 12\r\n                    color: \"white\"\r\n                }\r\n            }\r\n        }\r\n        \/\/ Sayac satiri\r\n        RowLayout{\r\n            Layout.fillWidth: true\r\n            Rectangle {\r\n                color: \"red\"\r\n                width: 200\r\n                height: 40\r\n                Text {\r\n                    text: \"Counter: \"\r\n                    horizontalAlignment: Text.AlignHCenter\r\n                    verticalAlignment: Text.AlignVCenter\r\n                    width:parent.width\r\n                    height:parent.height\r\n                    font.family: \"Helvetica\"\r\n                    font.pointSize: 12\r\n                    color: \"white\"\r\n                }\r\n            }\r\n            Rectangle {\r\n                color: \"brown\"\r\n                Layout.fillWidth: true\r\n                height: 40\r\n                Text {\r\n                    id:counterText\r\n                    horizontalAlignment: Text.AlignHCenter\r\n                    verticalAlignment: Text.AlignVCenter\r\n                    width:parent.width\r\n                    height:parent.height\r\n                    font.family: \"Helvetica\"\r\n                    font.pointSize: 12\r\n                    color: \"white\"\r\n                }\r\n            }\r\n            Button{\r\n                text:\"Update Counter\"\r\n                onClicked:{\r\n                    counterText.text = String(myBackEndClass.incrementCounter())\r\n                }\r\n            }\r\n            Button{\r\n                text:\"Reset Counter\"\r\n                onClicked:{\r\n                    myBackEndClass.resetCounter()\r\n                    counterText.text = String(myBackEndClass.incrementCounter())\r\n                }\r\n            }\r\n        }\r\n        Rectangle{\r\n            color:\"blue\"\r\n            Layout.fillHeight: true\r\n            Layout.fillWidth: true\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<p>Evet arkada\u015flar, temel entegrasyon i\u00e7in gerekli olan k\u0131s\u0131mlar\u0131 sizlere aktarmaya \u00e7al\u0131\u015ft\u0131m. A\u00e7\u0131k\u00e7as\u0131 bu zamana kadar, bu basit kullan\u0131m benim i\u015fimi g\u00f6rd\u00fc ama buna ili\u015fkin daha bir \u00e7ok husus var ki burada daha fazla de\u011finmeyece\u011fim. Ama ilgili dostlar <a href=\"https:\/\/doc.qt.io\/qt-5\/qtqml-cppintegration-exposecppattributes.html\"><strong><span style=\"color: #008000;\">https:\/\/doc.qt.io\/qt-5\/qtqml-cppintegration-exposecppattributes.html<\/span><\/strong> <\/a>ba\u011flant\u0131s\u0131na bir g\u00f6z atabilirler.<\/p>\n<p>Bitirmeden \u00f6nce son bir husustan daha bahsetmek istiyorum. Burada takip etti\u011fim etkile\u015fim y\u00f6nteminin yan\u0131nda <a href=\"https:\/\/doc.qt.io\/qt-5\/qtqml-cppintegration-interactqmlfromcpp.html\"><span style=\"color: #008000;\"><strong>https:\/\/doc.qt.io\/qt-5\/qtqml-cppintegration-interactqmlfromcpp.html<\/strong> <\/span><\/a>da da bahsedilen farkl\u0131 y\u00f6ntemler mevcut. Ben burada \u00f6zellikle C++ taraf\u0131ndan, direk QML taraf\u0131na sinyal ve slot mekanizmalar\u0131 d\u0131\u015f\u0131nda, fonksiyon ve benzeri mekanizmalarla \u00e7ok eri\u015fmedim, fakat bunlar m\u00fcmk\u00fcn. A\u00e7\u0131k\u00e7as\u0131 ben, kendi uygulamalar\u0131mda sizler ile payla\u015fm\u0131\u015f oldu\u011fum yakla\u015f\u0131m\u0131 takip ediyorum ama farkl\u0131 kullan\u0131mlar\u0131ndan da haberdar olmakta fayda var.<\/p>\n<p>Bu yaz\u0131m\u0131z\u0131n da sonuna geldik. Kodun son haline <a href=\"https:\/\/github.com\/yazilimperver\/QmlCPlusPlusIntegration\"><span style=\"color: #008000;\"><strong>https:\/\/github.com\/yazilimperver\/QmlCPlusPlusIntegration<\/strong><\/span><\/a> adresinden ula\u015fabilirsiniz.<\/p>\n<p>Umar\u0131m, QML ile C++ kullan\u0131m\u0131na ili\u015fkin sizlere bir yol g\u00f6stermi\u015ftir. Bir sonraki yaz\u0131mda g\u00f6r\u00fc\u015fmek dile\u011fiyle, kendinize iyi bak\u0131n.<\/p>\n<h2><span style=\"color: #0000ff;\"><strong>Kaynaklar<\/strong><\/span><\/h2>\n<ul>\n<li><a href=\"https:\/\/woboq.com\/blog\/qml-vs-cpp-for-application-startup-time.html\"><span style=\"color: #008000;\"><strong>https:\/\/woboq.com\/blog\/qml-vs-cpp-for-application-startup-time.html<\/strong><\/span><\/a><\/li>\n<li><a href=\"https:\/\/doc.qt.io\/qt-5\/qtqml-cppintegration-interactqmlfromcpp.html\"><span style=\"color: #008000;\"><strong>https:\/\/doc.qt.io\/qt-5\/qtqml-cppintegration-interactqmlfromcpp.html<\/strong><\/span><\/a><\/li>\n<li><a href=\"https:\/\/doc.qt.io\/qt-5\/qtqml-cppintegration-topic.html\"><span style=\"color: #008000;\"><strong>https:\/\/doc.qt.io\/qt-5\/qtqml-cppintegration-topic.html<\/strong><\/span><\/a><\/li>\n<li><a href=\"https:\/\/docs.ubuntu.com\/phone\/en\/apps\/qml\/tutorials-add-cpp-backend-your-qml-app\"><span style=\"color: #008000;\"><strong>https:\/\/docs.ubuntu.com\/phone\/en\/apps\/qml\/tutorials-add-cpp-backend-your-qml-app<\/strong><\/span><\/a><\/li>\n<li><span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"https:\/\/www.youtube.com\/watch?v=9BcAYDlpuT8\">https:\/\/www.youtube.com\/watch?v=9BcAYDlpuT8<\/a><\/strong><\/span><\/li>\n<\/ul>\n<p><\/p>","protected":false},"excerpt":{"rendered":"<p>Sizlerin de takip etti\u011fi \u00fczere, bir s\u00fcredir\u00a0 QT ve QML kullan\u0131m\u0131na ili\u015fkin bir \u00e7ok yaz\u0131 ve kod payla\u015f\u0131yorum. Bug\u00fcn de sizlerle QML ile C++&#8217;\u0131 nas\u0131l kullanabilece\u011finize, bu kullan\u0131m s\u0131ras\u0131nda dikkat etmeniz gereken hususlara, bir ka\u00e7 \u00f6rnek \u00fczerinden bakaca\u011f\u0131z. Bu yaz\u0131 ile birlikte, kendi QML ve C++ uygulamar\u0131n\u0131z\u0131 kolay bir \u015fekilde geli\u015ftirebilece\u011finizi umuyorum. Bu yaz\u0131da, QML&#8230; <a class=\"more-link\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2020\/02\/24\/qmlcplusplusintegration\/\">Continue reading <span class=\"meta-nav\">&#8594;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":1308,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[41,685],"tags":[13,686,689,515,687,688,510,471],"class_list":["post-1701","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-modern-c","category-qt","tag-c","tag-integration","tag-javascript","tag-meta-object-system","tag-q_invokable","tag-q_property","tag-qml","tag-qt"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Haftal\u0131k C++ 25 \u2013 QML\/C++ Entegrasyonu - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2020\/02\/24\/qmlcplusplusintegration\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"[:tr]Haftal\u0131k C++ 25 \u2013 QML\/C++ Entegrasyonu[:en]Haftal\u0131k C++ - QML\/C++ Entegrasyon[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"og:description\" content=\"Sizlerin de takip etti\u011fi \u00fczere, bir s\u00fcredir\u00a0 QT ve QML kullan\u0131m\u0131na ili\u015fkin bir \u00e7ok yaz\u0131 ve kod payla\u015f\u0131yorum. Bug\u00fcn de sizlerle QML ile C++&#8217;\u0131 nas\u0131l kullanabilece\u011finize, bu kullan\u0131m s\u0131ras\u0131nda dikkat etmeniz gereken hususlara, bir ka\u00e7 \u00f6rnek \u00fczerinden bakaca\u011f\u0131z. Bu yaz\u0131 ile birlikte, kendi QML ve C++ uygulamar\u0131n\u0131z\u0131 kolay bir \u015fekilde geli\u015ftirebilece\u011finizi umuyorum. Bu yaz\u0131da, QML... Continue reading &#8594;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.yazilimperver.com\/index.php\/2020\/02\/24\/qmlcplusplusintegration\/\" \/>\n<meta property=\"og:site_name\" content=\"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2020-02-24T18:23:01+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-11-21T16:33:49+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/07\/Qt-e1580417103404.png\" \/>\n\t<meta property=\"og:image:width\" content=\"30\" \/>\n\t<meta property=\"og:image:height\" content=\"23\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"yaz\u0131l\u0131mperver\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"yaz\u0131l\u0131mperver\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2020\/02\/24\/qmlcplusplusintegration\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2020\/02\/24\/qmlcplusplusintegration\/\"},\"author\":{\"name\":\"yaz\u0131l\u0131mperver\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"headline\":\"Haftal\u0131k C++ 25 \u2013 QML\/C++ Entegrasyonu\",\"datePublished\":\"2020-02-24T18:23:01+00:00\",\"dateModified\":\"2020-11-21T16:33:49+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2020\/02\/24\/qmlcplusplusintegration\/\"},\"wordCount\":1651,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"keywords\":[\"c++\",\"integration\",\"javascript\",\"meta-object system\",\"Q_INVOKABLE\",\"Q_PROPERTY\",\"qml\",\"Qt\"],\"articleSection\":[\"Modern C++\",\"QT\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2020\/02\/24\/qmlcplusplusintegration\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2020\/02\/24\/qmlcplusplusintegration\/\",\"url\":\"https:\/\/www.yazilimperver.com\/index.php\/2020\/02\/24\/qmlcplusplusintegration\/\",\"name\":\"[:tr]Haftal\u0131k C++ 25 \u2013 QML\/C++ Entegrasyonu[:en]Haftal\u0131k C++ - QML\/C++ Entegrasyon[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#website\"},\"datePublished\":\"2020-02-24T18:23:01+00:00\",\"dateModified\":\"2020-11-21T16:33:49+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2020\/02\/24\/qmlcplusplusintegration\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2020\/02\/24\/qmlcplusplusintegration\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2020\/02\/24\/qmlcplusplusintegration\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Ana sayfa\",\"item\":\"https:\/\/www.yazilimperver.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Haftal\u0131k C++ 25 \u2013 QML\/C++ Entegrasyonu\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.yazilimperver.com\/#website\",\"url\":\"https:\/\/www.yazilimperver.com\/\",\"name\":\"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\",\"description\":\"Payla\u015fmak g\u00fczeldir.\",\"publisher\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.yazilimperver.com\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\",\"name\":\"yaz\u0131l\u0131mperver\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png\",\"contentUrl\":\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png\",\"caption\":\"yaz\u0131l\u0131mperver\"},\"logo\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"[:tr]Haftal\u0131k C++ 25 \u2013 QML\/C++ Entegrasyonu[:en]Haftal\u0131k C++ - QML\/C++ Entegrasyon[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.yazilimperver.com\/index.php\/2020\/02\/24\/qmlcplusplusintegration\/","og_locale":"tr_TR","og_type":"article","og_title":"[:tr]Haftal\u0131k C++ 25 \u2013 QML\/C++ Entegrasyonu[:en]Haftal\u0131k C++ - QML\/C++ Entegrasyon[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","og_description":"Sizlerin de takip etti\u011fi \u00fczere, bir s\u00fcredir\u00a0 QT ve QML kullan\u0131m\u0131na ili\u015fkin bir \u00e7ok yaz\u0131 ve kod payla\u015f\u0131yorum. Bug\u00fcn de sizlerle QML ile C++&#8217;\u0131 nas\u0131l kullanabilece\u011finize, bu kullan\u0131m s\u0131ras\u0131nda dikkat etmeniz gereken hususlara, bir ka\u00e7 \u00f6rnek \u00fczerinden bakaca\u011f\u0131z. Bu yaz\u0131 ile birlikte, kendi QML ve C++ uygulamar\u0131n\u0131z\u0131 kolay bir \u015fekilde geli\u015ftirebilece\u011finizi umuyorum. Bu yaz\u0131da, QML... Continue reading &#8594;","og_url":"https:\/\/www.yazilimperver.com\/index.php\/2020\/02\/24\/qmlcplusplusintegration\/","og_site_name":"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","article_published_time":"2020-02-24T18:23:01+00:00","article_modified_time":"2020-11-21T16:33:49+00:00","og_image":[{"width":30,"height":23,"url":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/07\/Qt-e1580417103404.png","type":"image\/png"}],"author":"yaz\u0131l\u0131mperver","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"yaz\u0131l\u0131mperver","Tahmini okuma s\u00fcresi":"11 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.yazilimperver.com\/index.php\/2020\/02\/24\/qmlcplusplusintegration\/#article","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2020\/02\/24\/qmlcplusplusintegration\/"},"author":{"name":"yaz\u0131l\u0131mperver","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"headline":"Haftal\u0131k C++ 25 \u2013 QML\/C++ Entegrasyonu","datePublished":"2020-02-24T18:23:01+00:00","dateModified":"2020-11-21T16:33:49+00:00","mainEntityOfPage":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2020\/02\/24\/qmlcplusplusintegration\/"},"wordCount":1651,"commentCount":2,"publisher":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"keywords":["c++","integration","javascript","meta-object system","Q_INVOKABLE","Q_PROPERTY","qml","Qt"],"articleSection":["Modern C++","QT"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.yazilimperver.com\/index.php\/2020\/02\/24\/qmlcplusplusintegration\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.yazilimperver.com\/index.php\/2020\/02\/24\/qmlcplusplusintegration\/","url":"https:\/\/www.yazilimperver.com\/index.php\/2020\/02\/24\/qmlcplusplusintegration\/","name":"[:tr]Haftal\u0131k C++ 25 \u2013 QML\/C++ Entegrasyonu[:en]Haftal\u0131k C++ - QML\/C++ Entegrasyon[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/#website"},"datePublished":"2020-02-24T18:23:01+00:00","dateModified":"2020-11-21T16:33:49+00:00","breadcrumb":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2020\/02\/24\/qmlcplusplusintegration\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.yazilimperver.com\/index.php\/2020\/02\/24\/qmlcplusplusintegration\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.yazilimperver.com\/index.php\/2020\/02\/24\/qmlcplusplusintegration\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Ana sayfa","item":"https:\/\/www.yazilimperver.com\/"},{"@type":"ListItem","position":2,"name":"Haftal\u0131k C++ 25 \u2013 QML\/C++ Entegrasyonu"}]},{"@type":"WebSite","@id":"https:\/\/www.yazilimperver.com\/#website","url":"https:\/\/www.yazilimperver.com\/","name":"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","description":"Payla\u015fmak g\u00fczeldir.","publisher":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.yazilimperver.com\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb","name":"yaz\u0131l\u0131mperver","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/","url":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png","contentUrl":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png","caption":"yaz\u0131l\u0131mperver"},"logo":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/1701","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/comments?post=1701"}],"version-history":[{"count":23,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/1701\/revisions"}],"predecessor-version":[{"id":2003,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/1701\/revisions\/2003"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/media\/1308"}],"wp:attachment":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/media?parent=1701"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/categories?post=1701"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/tags?post=1701"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}