Haftalık C++ 29 – QML/C++ Plugin’leri

Evet dostlar, Godot ile ilgili yazıyı bitirdikten sonra hemen QT’ye hızlı bir dönüş yapıyoruz. Hatırlarsanız daha önce QT’de soketlerin kullanımını gösteren uygulamalar geliştirmiştik. Aşağıdaki yazılarda ve Git adresinde bu yazılar/kodları bulabilrsiniz.

Daha sonrasında ise QT ve QML kullanımına bakmış ve son olarak da, QML ve C++ uygulamalarımızı nasıl birlikte kullanabileceğimize göz atmıştık.

Ben bu konular üzerinde biraz daha çalıştım (aferin bana 🙂 ) ve öncelikle ağ kütüphanesini bir elden geçirdim. Aslında bu kütüphaneyi, SocketBox uygulamasında (SocketBox Uygulaması) tecrübe ettiğim bir takım hususlar ışığında güncelledim. Aşağıdaki adreste bulunan SocketLibrary, bu anlamda güncellenmiş olan kodları ve kabiliyetleri içermekte. Ve tabi ki, bu yazımda anlatacaklarımı. Şunu ifade etmek isterim genel yaklaşım veya mimaride bir değişiklik olmadı.

https://github.com/yazilimperver/SocketLibrary

Şimdi diyeceksiniz ki, peki sevgili yazılımperver, bu yazıda ne anlatıcaksın? İki kalemde özetliyorum:

  • C++ kullanan QML bileşenlerini nedir, nasıl oluşturabiliriz,
  • Bunları oluştururken nelere dikkat etmeliyiz.

Daha önce bir kaç QML uygulamasına bakmıştık ve özellikle C++ ile nasıl kullanılabileceğine bakmıştık. Açıkçası bir süre sonra, peki bu QML ve C++ kabiliyetlerini bir kütüphane haline nasıl getirebiliriz sorusu aklımı kurcalar hale geld. C++ ile geliştirilen QT için bu oldukça standart ve kolay. Hem Visual Studio hem de QT Creator ile bu kütüphaneler oluşturulabiliyor. Fakat, C++ ile QML dosyalarını aynı şekile nasıl paketleyeceğiz? Tabi ki, ilk başvuru noktası QT dokümantasyonu oldu. Her ne kadar bu dokümantasyon genel fikri güzel bir şekilde anlatsa da, açıkçası, bazı noktaların net bir şekilde ifade edilmediğini ya da gösterilmediği hissettim. Ben de hem kendim hem de siz yazılımperver dostlarım için bu yazıyı hazırlamaya karar verdim. Bu arada, genel yaklaşım için yine de, https://doc.qt.io/qt-5/qtqml-modules-cppplugins.html sayfası oldukça faydalı, buralara göz atmanız iyi olacaktır.

Aslına bakarsanız, QML dosyalarını direk kopyalayarak ya da QRC dosyaları içerisinde kullanabilirsiniz. Bu yazıda, bunları direk kullanıcıya sunmadan (benim için şu an öncelikli olan bu kodların başkası tarafından görülmesinden ziyade, derli toplu olması), bir kütüphane şeklinde nasıl sunup kullanabileceğimize bakacağız. Bu arada QML jargonunda bu dosyalara modül denilmekte ama plugin demeyi tercih ediyorum.

Burada dikkat edilmesi gerek bir kaç adım var. Bunlara dikkat ettiğiniz müddetçe, çok kolay bir şekilde bu kütüphaneleri oluşturabilirsiniz. Bu arada, ben bu adımları QT Creator kullanarak yaptım. Açıkçası VS ile nasıl yapılır konusunda bir bilgim yok ama QT Creator çıktılarını VS de de bir şekilde kullanabileceğinize inanıyorum.

  • Öncelikle QT Creator içerisinden, Qt Quick 2 Extension Plugin projesi oluşturuyorsunuz. Bu proje size şablon ve örnek teşkil edecek sınıfları oluşturuyor.
  • Deneme ismi ile oluşturduğunuz bir plugin için deneme_plugin.h dosyasına gittiğinizde ilgili sınıfın QQmlExtensionPlugin sınıfından türetildiğini göreceksiniz. QML içerisinde, C++ sınıflarını bu kütüphane aracılığı ile kullanabilmek için bu sınıftan türetmeniz gerekiyor. (bu arada C++ kullanarak Quick Item sınıfını özelleştirebilirsiniz diye ek bir sınıf da oluşturuluyor ama bu yazı için pek anlamı olmadığından ben kullanmadım).
  • Bu sınıfın içerisindeki registerTypes fonksiyonu içerisinde ise, daha önce QML/C++ yazısında da bahsettiğim gibi ilgili sınıfın QML içerisinde kullanıbilmesi için kaydediyorsunuz.
  • Gelelim en önemli noktalardan birisine, o da, qmldir dosyası. Bu dosya, oluşturacağınız QML plugin’ine ilişkin bilgileri adresleyen bir dosya ve içeriği de aşağıdaki gibi oluyor.
    • İlk satır, qml içerisinde import ile bu modülü nasıl ifade edeceğimiz tanımlıyoruz. Her bir qmldir dosyasında sadece bir adet tanımlayıcı olur. Uygulama içerisinde buna tekrar bakıcağız.
    • İkinci satır, bu modül içerisinde, C++ sınıfımız ile birlikte sunmayı planladığımız bir QML tipini ifade ediyor. Bu satırda, qml tipimiz, versiyonu ve bulunduğu kaynak dizinini ifade etmekte.
    • Üçüncü kısım ise, sunulan plugin’in ismini ifade ediyor. Burada birden fazla plugin tanımlaması yapabilirsiniz.
    • Bu dosya içerisinde, aynı tipin farklı sürümlerini farklı dosyalardan çekebilirsiniz (ör. “GlowingLabel 2.0 qrc:///commonControls/GlowingLabelNew.qml” gibi). Bu ve birçok şeyin nasıl yapıldığını görmek için https://doc.qt.io/qt-5/qtqml-modules-qmldir.html adresine göz atabilirsiniz.
    • Son, fakat bir o kadar da önemli nokta ise plugin ile birlikte yukarıda oluşturduğumuz qmldir dosyasını da taşımanız gerekiyor. Bunun için ben .pro dosyasının içerisinde aşağıdaki oluşturma betiğini kullanıyorum:

Yukarıdaki adımlar sonrasında artık elimizde bir plugin dll dosyası ve qmldir dosyamız var. Şimdi bunu uygulamalar içerisinde nasıl kullanacağız, ona bir bakalım. O da çok kolay.

  • main.cpp içerisine aşağıdaki gibi bir satır ekliyorsunuz. Bu dizin plugin dll dosyası ve qml dir dosyalarını içeriyor olmalı.
    • engine.addImportPath(QUrl(QLatin1String(“./../plugins/”)).toString());
  • Daha sonra, qml dosyalarınızda, bu modüldeki tipleri kullanabilmek için de, aşağıdaki satırı eklemeniz gerekiyor. Bütün yapmanız gereken bu kadar.
    • import com.yazilimperver.socketlibrary 1.0

Bu kütüphaneleri android’e nasıl port ederim derseniz, aşağıda da bunun ile ilgili sorulmuş bir soru var size yardım olacağını düşünüyorum:

Yazıyı özellikle çok uzatmak istemedim ki, biraz koda da göz atın, proje (.pro) dosyalarını da incelemenizde fayda var. Düzenlenmiş soket kütüphanesini SocketLibrary, QML kütüphanesini QmlSocketLibrary ve sonra olarak bu kütüphaneyi kullanan test uygulamasını da  QmlSocketLibTest olarak isimlendirdim. Açık olmayan bir nokta olursa, ya da merak ettiğiniz, lütfen yorumlar kısmına ekleyiniz. Umarım sizlere faydalı olur.

Ben yazılımperver, bir sonraki yazımda görüşmek üzere, sağlıklı günler diliyorum hepinize…

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.