Qt dersleri etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Qt dersleri etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

1 Nisan 2020 Çarşamba

Qt Android Kurulumu

Qt Android Kurulumu


Qt, birden çok platformu destekleyen (cross-platform) masaüstü, gömülü sistem ve mobil ortamlar için grafiksel kullanıcı arayüzü geliştirmemizi sağlayan bir araçtır.
Aslında Qt'yi sadece arayüz hazırlama programı olarak nitelendirmek Qt'ye yapılmış büyük haksızlıktır. Qt içerisinde çok gelişmiş C++ modülleri, sınıfları vardır. Qt ile kullanıcı arayüzü geliştirmek için C++ programlama dili kullanılmaktadır. Qt'nin bana göre en önemli avantajı birçok işletim sisteminde (Windows, Linux, Mac) kullanılabiliyor olmasıdır (cross-platform özelliği).
Qt'nin ticari ve açık kaynak (open source) olmak üzere 2 çeşit lisansı mevcuttur. Hobi amaçlı kullanım ücretsizdir.
Algoritma geliştirirken veya test ederken bir arayüz hazırlayarak onun üzerinde çalışmanın işleri kolaylaştırdığını, zaman kazandırdığını ve sonuçları daha iyi yorumlama fırsatı sunduğunu düşünüyorum. Ben genelde bu sebeple Qt'yi kullanıyorum. Ayrıca ağ bağlantısı olan cihazların uzaktan kullanılması için Qt ile Android işletim sisteminde çalışan mobil uygulamalar geliştiriyorum.
Bu kurulum ile amacımız masaüstü için daha önceden hazırladığımız programların android işletim sistemine sahip cep telefonunda çalıştırmaktır. Tamamiyle Android uygulama geliştirmek değildir. Zaten Qt'yi biliyorsanız ve mobil uygulama geliştirme ihtiyacınız varsa sıfırdan başka bir programlama dili veya program öğrenmeden mevcut bilgimizi kullanarak geliştirdiğimiz masaüstü uygulamaları Android işletim sisteminde çalıştırılabilir hale getirmektir.
Bu yazımızda Android işletim sisteminde çalışacak mobil uygulamalar için Qt kurulumunu gerçekleştireceğiz. Kurulumu yaptıktan sonra hazırlamış olduğum Ücretsiz Qt Derslerini izleyerek Qt ile ihtiyacınız olan mobil uygulamaları geliştirebilirsiniz.


1. Qt'yi Tanıyalım

Qt ile birlikte sıklıkla kullanılan Qt Creator ve Qt Designer araçları bu bölümde kısaca tanıtılacaktır.

1.1. Qt Creator Nedir ?

Qt Creator, Qt ile daha rahat ve daha kolay arayüz geliştirmenizi sağlayan Bütünleşik Geliştirme Ortamı (Integrated Development Environment, ide) olarak adlandırılır. Qt Creator ile içerisinde barındırdığı araçlar sayesinde proje oluşturmak ve burada saymakla bitiremeyeceğim bir çok ayarı yapmanız çok kolaydır. Qt Creator, içerisinde aynı zamanda Qt Designer'ı da içermektedir. Qt Designer ise sürükle-bırak tekniği ile arayüz tasarımı yapmanızı sağlayan tasarım aracıdır. Qt'de arayüz tasarımı için 2 seçenek vardır. Qt Designer aracında sürükle-bırak kolaylığı ile tasarım yapılabildiği gibi kod yazarak da tasarım yapılabilir.


Zaman içerisinde farklı logolar kullanılsa da genelde Qt Creator için aşağıdaki logo kullanılmaktadır.


1.2. Qt Designer Nedir ?

Qt Designer, tek başına da kurulup kullanılabildiği gibi Qt Creator içerisinde de kullanılabilmektedir. Eğer Qt Creator kullanıyorsanız Qt Creator içerisindeki Qt Designer işinizi görecektir. Ayrıca Qt Designer kurmanıza gerek yok. Genel olarak aşağıdaki ikon Qt Designer ikonu olarak kullanılmaktadır.


Qt Designer'da arayüz elemanları widget box olarak adlandırılan ekranın sol bölümünde yer almaktadır. Buradan seçilen arayüz elemanı aşağıda gösterildiği gibi sürükle-bırak tekniği ile arayüz tasarımına eklenmektedir. Daha detaylı bilgilere Ücretsiz Qt Derslerini izleyerek ulaşabilirsiniz.


2. Qt Android Kurulumu

Qt Android kurulumunu aşağıdaki adımları takip ederek gerçekleştireceğiz.

2.1. Mevcut Qt Kurulumunun Kontrol Edilmesi

Bu adımda eğer daha önceden bilgisayarınıza Qt kurulumu gerçekleştirdiyseniz ( Windows için Qt Kurulumu , Ubuntu (Linux) için Qt Kurulumu ), bu kurulumun Android için mobil uygulama geliştirmeye yeterli olup olmadığı kontrol edilecektir.
Bunun için öncelikle Qt Creator açılır ve üst bölümde yer alan Tools sekmesinde Options seçeneğine tıklanır.


Açılan pencerede sol bölümde yer alan Build & Run seçilir. Bu bölümde yer alan Kits ve Qt Versions sekmelerinde aşağıdaki ekran görüntüsünde yer alan Android ile alakalı bölümler yoksa mevcut kurulumunuz ile Android işletim sistemi için mobil uygulama geliştiremezsiniz.



Android kurulumu olmayan MinGW32 kurulumu olan Qt kurulumu için Kits ve Qt Versions sekmelerinde aşağıdaki ekran görüntüsüne benzer bir sonuç elde edersiniz.



2.2. Qt Android Kurulumu

Qt Android kurulumu için elimizde aşağıdaki şemada gösterildiği gibi 2 seçenek mevcuttur. Eğer Android konfigürasyonu olmayan mevcut Qt kurulumumuz varsa bu kuruluma sonradan MaintenanceTool ile Android konfigurasyonu ekleyebiliriz. 2. seçenek ise sıfırdan içerisinde Android konfigürasyonu barındıracak şekilde Qt kurulumunu gerçekleştirmektir.


Bu 2 farklı kurulum yöntemi detaylı olarak yazının sonunda yer alan videoda açıklanmıştır ve kurulumlar adım adım gerçekleştirilmiştir. Her 2 yöntem için ortak olan Qt kurulumu sırasında yer alan Android konfigürasyon ekleme adımı aşağıdaki ekran görüntüsünde gösterilmiştir. Bu adıma ulaşmak için önceki yazılarımı inceleyebilirsiniz ( Windows için Qt Kurulumu , Ubuntu (Linux) için Qt Kurulumu ).


2.3. JDK - NDK - SDK Kurulumları

Bir önceki adımda yapmış olduğumuz işlem ile Qt'ye dedik ki "Ben Android ile mobil uygulama geliştirmek istiyorum kendini buna göre ayarla" ve Qt kendisini Android ile çalışacak şekilde ayarladı. Şimdi Qt bize diyor ki "Ben kendimi Android ile çalışacak şekilde ayarladım şimdi benim ihtiyaç duyduğum dış kaynaklı araçları kurman gerekiyor".
Biz de Qt'nin sözlerini dikkate alarak onun ihtiyaç duyduğu dış kaynaklı araçları kurma işlemine geçiyoruz. Bunun için öncelikle daha önce yaptığımız gibi Qt Creator açılır ve üst bölümde yer alan Tools sekmesinde Options seçeneğine tıklanır.


Açılan pencerede sol bölümde yer alan Devices seçilir ve bu seçimle birlikte güncellenen pencerede üst bölümde yer alan Android sekmesi seçilir. Açılan ekran hem Qt nin ihtiyaç duyduğu araçları JDK (Java Development Kit), NDK (Native Development Kit), SDK (Software Development Kit) hem de bu araçları yüklemeniz için ihtiyaç duyduğunuz kaynaklara yönlendirmeler içermektedir.


Bu araçların yüklenme işlemi detaylı olduğu ve yazı ile anlatmak zahmetli olduğu için burada anlatılmayacaktır. Yazının sonunda yer alan videoda detaylar ve kurulumlar mevcuttur.
Qt Android kurulumunda en zahmetli olan şey burada yer alan paketlerin ve Qt versiyonunun birbirleriyle uyumlu olarak çalışan versiyonlarını denk getirmektir.
Aşağıdaki tabloda birbirleriyle uyumlu çalışan paket versiyonları gösterilmektedir.

Qt Creator 4.6.2
Qt 5.11.1 veya 5.12.0
JDK (Java Development Kit) 8u241
NDK (Native Development Kit) r10e
SDK (Software Development Kit) 26.1.1


2.4. Qt ile Mobil Uygulama Geliştirme

Qt Android kurulumunu ve birbiri ile uyumlu olarak çalışan ihtiyaç duyulan paket kurulumlarını başarılı bir şekilde yaptıktan sonra Qt ile mobil uygulama geliştirme aşamasına geçebiliriz. Qt ile aşağıdaki şemadan da görüleceği gibi Qt Widgets ve Qt Quick olmak üzere 2 farklı yapıda uygulama geliştirebilmektedir.


Qt Quick yapısı, Qt içerisine sonradan dahil olan ve daha çok mobil (cep telefonu, tablet) uygulama geliştirmek için kullanılan ve içerisinde Javascript sözdizimine (syntax) benzeyen QML (Qt Modeling Language) dili kullanılan yapıdır. Qt Widgets, Qt içerisinde Qt Quick yapısından önce var olan ve daha çok Masaüstü uygulama geliştirmek için kullanılan C++ programlama dilini kullanan yapıdır. Qt Widgets daha çok masaüstü uygulamalar için kullanılsa da Qt Widgets ile geliştirmiş olduğunuz uygulamayı mobil platformlarda herhangi bir sıkıntı ile karşılaşmadan rahatça kullanabilirsiniz.


27 Aralık 2018 Perşembe

Qt'de Signal-Slot Kavramı

Qt Signal - Slot (İşaret - İşlev) Kavramı


Qt birden çok platformu destekleyen (cross-platform) masaüstü, gömülü sistem ve mobil ortamlar için grafiksel kullanıcı arayüzü geliştirmemizi sağlayan bir araçtır. Qt ile kullanıcı arayüzü geliştirmek için C++ programlama dili kullanılmaktadır. Qt'nin bana göre en önemli avantajı birçok işletim sisteminde (Windows, Linux, Mac) kullanılabiliyor olmasıdır (cross-platform özelliği). Bu özelliğe ek olarak ticari yazılımlar dışında hobi amaçlı yazılımlar için lisanslama sorunu yoktur. Ayrıca Qt ile arayüz geliştirmek Qt nin sunmuş olduğu sınıflar, fonksiyonlar ve signal-slot mekanizması sayesinde çok kolaydır. Diğer arayüz geliştirme ve programlama dillerinde olmayan signal-slot kavramı Qt de karşımıza çıkmaktadır. Bu yazıda
  • Signal-slot nedir ?
  • Signal-slot mekanizması nasıl çalışır ?
  • Öntanımlı (Default) işaretler (signal) nedir, nasıl kullanılır ?
  • Qt Designer ile signal-slot bağlantısı nasıl yapılır ?
  • Kod yazarak signal-slot bağlantısı nasıl yapılır ?
  • Kendimiz işaret (signal) tanımlayabilir miyiz ?
  • Signal-slot bağlantısı nasıl kaldırılır (iptal edilir)?
  • sorularına cevap bulacağız.


1. Signal - Slot Nedir ? Signal - Slot Mekanizması Nasıl Çalışır ?

Signal çok yabancı olmadığımız bir kelime Türkçeye de sinyal olarak geçmiştir. Slot kelimesinin ise yuva anlamı vardır. Aslında slot programlama dili açısından düşünüldüğünde fonksiyon olarak kullanılabilir. Fonksiyon da dilimizde yaygın olarak kullanılan bir kelime olmasına karşın Türkçe karşılığı işlev'dir. Signal-Slot yerine işaret-işlev diyebiliriz ancak bu kavram Qt'ye özgü bir kavram olduğu için signal-slot kavramından işaret-işlev olarak bahsedildiğinde kimse anlamayacaktır. Bu sebeple yazının geri kalan bölümünde signal-slot olarak orijinal hali ile kullanmayı planlıyorum.


Signal-slot kavramını yukarıda yer alan animasyon üzerinden anlatmaya çalışalım. Animasyonun sol üst köşesinde bir kullanıcı yer alıyor, sağ üst köşede ise bizim hazırlamış olduğumuz bir kullanıcı arayüzü olduğunu varsayalım. Kullanıcı, hazırlamış olduğumuz arayüz üzerinde bir eylemde bulunduğunda örneğin bir tuşa bastığında bir sinyal yayınlanır ve bu sinyal bir fonksiyona bağlı ise o fonksiyon çağrılır ve fonksiyon içerisinde yer alan işlem gerçekleştirilir. Arayüzü hazırlayan kişi arayüz elemanları ve fonksiyonlar arasında signal-slot bağlantıları yapar ve kullanıcı arayüz üzerinde bir işlem yaptığında ilgili fonksiyon çağrılır. Signal-slot mekanizması bu şekilde çalışır. Örneklerle birlikte bu kavramı daha iyi anlayacaksınız.

2. Öntanımlı (Default) İşaretler (Signals) Nedir? Öntanımlı İşaretler Nasıl Kullanılır ?

Öntanımlı (default) işaretler Qt tarafından önceden tanımlanmış parçacığa özgü işaretlerdir. Bu hazır işaretler çok rahatlıkla kullanılabilir. Yazının ilerleyen bölümlerinde öntanımlı işaretlerin kullanımını örneklerle daha iyi anlayacaksınız. Örneğin basılabilir tuşun (QPushButton) tıklandı (clicked), basıldı (pressed), bırakıldı (released) gibi öntanımlı işaretleri bulunmaktadır. Bu işaretleri fonksiyonlara bağladığınızda ve kullanıcı bu tuş üzerinde bir eylemde bulunduğunda ilgili fonksiyonlar çalıştırılır.


3. Qt Designer ile Signal - Slot Bağlantısı Nasıl Yapılır ?

Qt Designer ile signal-slot bağlantısı yapmak için öncelikle Qt Creator açılır ve yeni bir proje oluşturduktan sonra Qt Designer açılır. Qt Creator kullanımı, proje oluşturma, Qt Designer kullanımı hakkında bilgi edinmek için hazırlamış olduğum Qt Dersleri ücretsiz video serisini izleyebilirsiniz. Qt Creator'de Design Modunda yukarıda yer alan menüde bulunan Edit sekmesine tıklanır ve bu sekmede yer alan Edit Signals/Slots seçeneğine tıklanır.


Aynı işlemi F4 tuşuna basarak ya da aşağıdaki şekilde belirtilen tuşa basarak gerçekleştirebilirsiniz.


Signals-slots moduna geçmeden önce arayüz tasarımını tamamlamış olmalısınız ve arayüz üzerinde yer alan parçacıkların hangi işlevleri yapacağını belirlemiş olmanız gerekir. Signal-slot kavramını anlatabilmek için yatay kaydırma butonu (QHorizontalSlider) ve etiket (QLabel) parçacıklarından oluşan aşağıdaki tasarım yapıldı. Burada kaydırma butonunun konumu değiştirtirildiğinde o anki pozisyonunun değeri QLabel da gösterilecektir. Arayüz tasarımını tamamladık ve arayüzde yer alan parçacıkların ne iş yapacakları tanımlandıktan sonra yukarıda anlatıldığı gibi Signals/Slots moduna geçiş yapılır.


Signals-slots modunda iken Yatay Kaydırıcıya (HorizontalSlider) farenin sol tuşu ile tıklanır ve bu tuşa basılı tutularak etiketin (Label) üzerine getirilir ve burada tuş bırakılır. Tuşu bırakır bırakmaz Configure Connection adında yeni bir pencere açılacaktır. Bu pencerenin sol bölümünde yatay kaydırıcıya ait öntanımlı (default) işaretler bulunmaktadır. Biz burada değer değişti (valueChanged(int)) işaretini seçiyoruz. Bu işaret kaydırıcının değeri değiştiğinde işaret yayar. Biz bu işareti bir slot'a yani fonksiyona bağladığımızda kaydırıcının her değeri değiştiğinde bu fonksiyon çağrılacaktır.


İşaret seçimini yaptıktan sonra pencerenin sağ bölümü aktif hale gelir ve burada öntanımlı (default) slot'lar yani fonksiyonlar bulunmaktadır. Hem işaretler için hem de slot'lar için öntanımlı işaret ve slotları kullanabildiğimiz gibi kendi işaret ve fonksiyonlarımızı da Edit butonuna basarak tanımlayabiliriz. Biz burada etiket (Label) için setNum(int) fonksiyonunu seçiyoruz.





Yukarıda yer alan ekran görüntüsünde gördüğünüz gibi yatay kaydırıcının (HorizontalSlider) değeri değiştirildiğinde bu değer etikete (Label) yazdırılmaktadır. Burada basit bir şekilde herhangi bir kod yazmadan Qt Designer ile signal-slot bağlantısı gerçekleştirmiş olduk. Bu yöntem benim tercih ettiğim bir yöntem değil bu yüzden örnek sayısını arttırmadan ve daha fazla detaya girmeden konunun bu kadar yeterli olduğunu düşünüyorum. Kod yazarak signal-slot bağlantısının nasıl yapıldığını bir sonraki bölümde inceleyeceğiz.

4. Kod Yazarak Signal-Slot Bağlantısı Nasıl Yapılır ?

Bu bölümü Qt Designer'dan Go to slot özelliği ile kod yazarak signal-slot bağlantısı yapma ve connect() fonksiyonu ile signal-slot bağlantısı yapma olarak kendi içinde 2 alt başlık halinde inceleyeceğiz.

4.1. "Go to slot" ile Signal-Slot Bağlantısı

Qt Designer ile aşağıdaki ekran görüntüsünde yer alan bir buton (QPushButton) ve etiketten (QLabel) oluşan bir tasarım yapıyoruz. Bu tasarımda butona basınca etikette "butona basıldı" yazısı yazacak ve buton bırakıldığında "buton bırakıldı" yazacak.


Arayüz tasarımı ve arayüzde yer alan parçacıkların işlevleri tanımlandıktan sonra signal-slot bağlantısı için butonun üzerine farenin sağ tuşu ile tıklıyoruz ve açılan seçeneklerden Go to slot... seçeneğine tıklanır ve yeni bir pencere açılır.



Bu yeni pencerede QPushButton için öntanımlı (default) işaretler yer almaktadır. Burada "basıldı (pressed)" sinyalini seçip "OK" butonuna basıyoruz. Qt otomatik olarak bizim yerimize başlık dosyasında (mainwindow.h) ve kaynak dosyasında (mainwindow.cpp) slot yazmaktadır. Bizim tek yapmamız gereken kaynak dosyasında istediğimiz kodları yazmak.



Kaynak dosya içerisinde slot'un içerisinde etikete (QLabel) setText() fonksiyonu ile yazı yazdırıyoruz.


Aynı işlemleri "bırakıldı (released)" işareti için tekrar ediyoruz.





Qt Designer'da parçacığın üzerine farenin sağ tuşu ile tıklayarak "Go to slot" özelliğini kullandık ve signal-slot bağlantısının nasıl yapıldığını öğrendik. Bu yöntem öntanımlı (default) işaretler ile kullanılabilir ve benim arayüz geliştirirken sıklıkla kullandığım bir yöntem, sizin de kullanmanızı tavsiye ederim.

4.2. "connect()" fonksiyonu ile Signal-Slot Bağlantısı

Yazının başında kendimiz işaret (signal) tanımlayabilir miyiz diye sormuştuk, cevabımız evet. Qt'de öntanımlı (default) işaretler dışında istediğimiz işareti tanımlayabiliriz. Kendi tanımladığımız işareti slot'a bağlamak için connect() fonksiyonu kullanılır. Fonksiyonun kullanımı aşağıda belirtildiği gibidir.

connect( gönderen, SIGNAL(işaret_adı()), alıcı, SLOT(slot_adı()) )

  • Bir İşaret birden fazla Slot'a bağlanabilir


  • Birden fazla İşaret bir Slot'a bağlanabilir


  • Bir İşaret başka bir İşaret'e bağlanabilir


connect() fonksiyonunun kullanımını anlama ve yukarıda bahsedilen signal-slot özelliklerinin kullanımını öğrenebilmek için Qt Designer'da aşağıdaki ekran görüntüsünde yer alan tasarım yapılır.


mainwindow.h başlık dosyasında butona_basildi(), butona_basildi_2() ve butona_basildi_3() adında 3 tane işaret tanımlıyoruz. Bunlar Qt de varolan öntanımlı işaretler değil kendi tanımladığımız işaretler. Bir önceki bölümde Go to slot... özelliği ile tanımladığımız 2 tane slot'a ek olarak label_1_slot(), label_2_slot() ve label_3_slot() adında 3 tane slot tanımlıyoruz.


mainwindow.cpp kaynak dosyasında tanımladığımız işaretler ve slotları Yapıcı'da (constructor) connect() fonksiyonu ile birbirine bağlıyoruz. butona_basildi() işaretini label_1_slot(), label_2_slot() ve label_3_slot() adındaki slotlara bağlıyoruz ve bu bağlantı ile bir sinyalin birden fazla slot'a bağlanabildiğini görmüş olduk.


14 nolu satırda butona_basildi_2() işaretini label_1_slot() slotuna bağlıyoruz. Bu bağlantı ile birden fazla sinyalin aynı slot'a bağlanabildiğini görmüş olduk.

16 nolu satırda butona_basildi_3() işaretini butona_basildi() işaretine bağlıyoruz. Bu bağlantı ile bir sinyalin bir başka sinyale bağlanabildiğini görmüş olduk.

Kullanıcı arayüzde butona bastığında on_pushButton_pressed() slotu çalıştırılır. Bu slot içerisinde butona_basildi_3() işareti yayınlanır. İşaret yayınlamak için işaret adından önce emit ifadesi kullanılır. butona_basildi_3() işareti butona_basildi() işaretine bağlı olduğundan aynı zamanda butona_basildi() işareti de yayınlanmış olur. butona_basildi() işareti label_1_slot(), label_2_slot() ve label_3_slot() slotlarına bağlı olduğundan bu slotlar içerisinde yer alan kodlar çalıştırılır ve Etiketlere ilgili yazılar yazılır. Buton bırakıldığında on_pushButton_released() slotu içerisinde yer alan kodlar çalıştırılır ve etiketler üzerine hiçbir şey yazılmaz yani içerisinde önceden yazan yazılar silinir.

Son olarak belirtmem gereken konu işaretler ve slotlar parametre alabilir. Birbirlerine bağlanan işaret ve slotlar aynı sayıda ve tipte parametre alacak şekilde tanımlanmalıdır. Örneğin işarette 3 tane değişken tanımlanır ama slot'ta 2 tane değişken tanımlanırsa slot son parametreyi ihmal eder alamaz. Aynı türde olmayan değişkenler ise signal-slot arasındaki veri alışverişinde hataya sebep olacaktır.


5. Signal-slot bağlantısı nasıl kaldırılır (iptal edilir)?

Signal-slot bağlantısı yaparken connect() fonksiyonunu kullanarak yazmış olduğumuz ifadenin aynısını disconnect() ifadesiyle yazıyoruz.

disconnect( gönderen, SIGNAL(işaret_adı()), alıcı, SLOT(slot_adı()) )

Signal-slot bağlantısının iptal edilmesi çok sık kullanılan bir yöntem değildir ama arayüz geliştirirken ihtiyaç duyacağınız durumlar olabilir.


Signal-slot mekanizması kolay ve esnek kod yazmamızı sağlayan Qt nin sağlamış olduğu en önemli özelliklerden biridir. Bu yazıda signal-slot kavramını, signal-slot mekanizmasının nasıl çalıştığını, nasıl signal-slot bağlantısının yapıldığını elimden geldiğince anlatmaya çalıştım.