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

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.

30 Eylül 2018 Pazar

OpenCV (C++) Kütüphanesinin Ubuntu'ya Kurulumu ve Qt ile Kullanılması

OpenCV (C++) Kütüphanesinin (Extra Modülü - Contrib ve CUDA-cuDNN ile) Ubuntu'ya Kurulumu ve Qt ile Kullanılması


OpenCV (Open Source Computer Vision Library) açık kaynak kodlu Bilgisayarla Görme kütüphanesidir. Hem akademik hem de ticari amaç için kullanımı ücretsizdir. C++, Python ve Java programlama dilleriyle Windows, Linux, Mac OS, iOS ve Android işletim sistemlerinde kullanılabilmektedir. OpenCV ile görüntü işleme (image processing), makine öğrenmesi (machine learning), bilgisayarla görme (computer vision), derin öğrenme (deep learning) alanlarında algoritma, uygulama geliştirebilirsiniz. Bunun için OpenCV size çok sayıda algoritmayı fonksiyon şeklinde kullanmanızı sağlayan imkanlar sunmaktadır. Yapmanız gereken tek şey dökümanlardan ilgili fonksiyonun aldığı parametre ve girdileri doğru vererek sonuçlarını doğru bir şekilde almak. Burada OpenCV'nin C++ programlama dili ile kullanılması için yapılması gereken derleme işlemi (kurulum) gerçekleştirilecektir ve Qt ile kullanımından bahsedilecektir. Ubuntu'ya Qt kurulumu için önceki yazımı inceleyebilirsiniz. Derleme için Cmake-gui programından faydalanılacaktır ve GCC derleyicisi derleme işleminde kullanılacaktır. Ayrıca bu kurulum (derleme) esnasında OpenCV'nin extra modülü olarak anılan contrib modülü de derleme işlemine dahil edilecektir. OpenCV contrib içerisinde yer alan modüllere buradan bakabilirsiniz.


Adım 1. OpenCV kütüphanesinin sitesinde ki releases sayfasından istediğiniz versiyonunun "Sources" linkinde yer alan kaynak kodlarını indiriniz. (Bu kurulum (derleme) için OpenCV 3.4.3 versiyonu kullanılacaktır, aşağıdaki ekran görüntüsünden de göreceğiniz gibi aslında son versiyon olarak 4.0.0-alpha çıkmış bulunmaktadır ancak son çıkan versiyonlarda bir takım hatalar çıkmaktadır bu hatalar zamanla düzeltilerek daha kararlı bir hale geldikten sonra kullanılmasını tavsiye ederim.)


Adım 2. İndirilen sıkıştırılmış dosya (opencv-3.4.3.zip) çıkarılır. opencv-3.4.3 klasörü içerisinde "source" ve "build" adında 2 yeni boş klasörler oluşturulur ve opencv-3.4.3 klasörü içerisinde yer alan diğer tüm dosyalar "source" klasörü içerisine taşınır.






Adım 3. OpenCV ekstra modüllerinin yer aldığı Contrib dosyası github sayfasından indirilir. Burada dikkat etmeniz gereken nokta kurulumunu yapacağınız OpenCV versiyonuyla aynı versiyondaki contrib dosyasını indirmek olacaktır. Burada OpenCV-3.4.3 kurulumu yapacağımız için opencv_contrib-3.4.3 klasörü indirildi ve sıkıştırılmış dosya çıkartıldı.



Adım 4. Kurulum için cmake-gui'den faydalanacağız. Eğer cmake-gui kurulu değilse aşağıdaki kodu çalıştırarak cmake-gui'nin kurulumunu gerçekleştirebilirsiniz.


sudo apt install cmake-gui


Adım 5.
cmake-gui açılır ve
  • "Where is the source code:" yazan bölümde opencv-3.4.3 klasöründe oluşturduğumuz "source" klasörü "Browse Source ..." butonuna basılarak seçilir.
  • "Where to build the binaries:" yazan bölümde opencv-3.4.3 klasöründe oluşturduğumuz "build" klasörü "Browse Build ..." butonuna basılarak seçilir.

ve aşağıda yer alan "Configure" butonuna basılır.


Adım 6. "Configure" butonuna bastıktan sonra yeni bir pencere açılacaktır. Bu pencerede derleme işlemi için kullanılacak derleyicinin seçilmesi istenmektedir. Burada tanımlı yerel (default native compiler) derleyici seçilir.


Adım 7.1.
Derleyiciyi seçtikten sonra konfigürasyon işlemi başlayacaktır. "Configuration done" mesajını görene kadar bekleyiniz. Konfigurasyon işlemi sırasında OpenCV kütüphanesi ile kullanılabilecek diğer araçların bilgisayarınızda kurulu olup olmadığına bakılır ve sonunda size bunlar hakkında bilgiler verir. Bu kısım aslında çok detaylı bilgiler içermektedir ve hepsini tek tek açıklamak mümkün değildir. Şu an konfigurasyona dahil edilmeyen ancak ileride OpenCV'nin bir modülünü kullanmak istediğinizde bir takım eksik araçlardan kaynaklanan hatalar aldıkça hangi araçlara nerede ne zaman ihtiyaç duyacağınızı daha iyi anlayacaksınız. Biz burada Qt ile kullanmak istediğimizden WITH_QT özelliğini aktif duruma getiriyoruz.


Adım 7.2.
OpenCV'nin extra modüllerini (opencv contrib) yüklemek için OPENCV_EXTRA_MODULES_PATH özelliğinde indirmiş olduğumuz opencv_contrib-3.4.3 klasörü içerisinde yer alan modules klasörünün yolu tanımlanır.


Adım 7.3.
OpenCV algoritmalarını özellikle Derin Öğrenme (Deep Neural Network) algoritmalarını GPU üzerinde çalıştırmak için işletim sisteminize CUDA ve cuDNN kurulumlarının yapılmış olması gerekmektedir. Ubuntu'ya CUDA Kurulumu ve Ubuntu'ya cuDNN Kurulumu yazılarımı inceleyebilirsiniz. Eğer kurulumlar işletim sisteminizde mevcut ise WITH_CUDA özelliğini aktif hale getiriniz.


Adım 7.4.
Eğer tüm OpenCV modüllerini tek bir kütüphane şeklinde kullanmak istiyorsanız BUILD_opencv_world özelliğini seçmelisiniz. Bunun hem artısı hem de eksisi vardır. Avantajı tek tek her bir modülü eklemek yerine sadece tek bir modülü eklemenin daha kolay olmasıdır. Ancak kullanılmayacak olan bir çok modül koda eklenmiş olur hem de tüm modüller bir arada olduğu için dosya boyutu yüksektir. Derleme esnasında hata alma ihtimalini arttırdığı için ben bu özelliği kullanmayacağım. Şimdilik bu seçimler basit bir kurulum için yeterli. Siz ihtiyaç duyduğunuz araçları yükleyip ekleyip çıkarmakta özgürsünüz. Dediğim gibi bu ihtiyaçlar OpenCV kütüphanesini kullandıkça ortaya çıkacaktır. Bende bundan sonraki yazılarımda ihtiyaç duyduğum durumlarda bu konfigurasyonlarda yapılması gereken değişiklikleri belirtmeyi düşünüyorum.

Tüm bu işlemlerden sonra "Configure" butonuna birkez daha basılır "Configuring done" mesajını gördükten sonra "Generate" butonuna basılır.


Not.
Aşağıdaki gibi Qt klasörlerinin yolunun bulunamaması ya da Qt kurulu olmamasından kaynaklanan hata alabilirsiniz.


Bu hatayı gidermek için aşağıdaki kod parçası çalıştırılır.


sudo apt-get install qt5-default


Adım 8.
Kurulumu tamamlamak için "build" klasörü içerisinde terminal açılır ya da terminal'de "build" klasörüne geçilir ve aşağıdaki kod parçası yazılır.


sudo make install




Adım 9.
Bu aşamada OpenCV'nin Qt ile kullanılmasından bahsedilecektir. Windows işletim sisteminde ".dll" uzantılı derlenen opencv kütüphanelerinin Qt'de tanımlanması gerekmektedir, Ubuntu'da ise ".dll" uzantılı kütüphaneler yoktur. Shared Objects (*.so) ve Archive libraries (*.a) uzantılı kütüphaneler vardır. Archive libraries (*.a) statik bağlı kütüphanelerdir, Shared objects (*.so) çalışma anında bağlanırlar. Bu kütüphaneleri /home/eyyup/Downloads/opencv-3.4.3/build/lib klasöründe görebilirsiniz. OpenCV'nin ekstra kütüphanelerini ve CUDA derleme esnasında kullanıldığından derlenen kütüphane sayısı bir hayli fazladır. Qt'de OpenCV kütüphanesini kullanmamız için 2 farklı yöntem mevcuttur.


(1.yol)
Qt açılır sonra (.pro uzantılı) proje dosyası açılır ve aşağıda belirtildiği gibi OpenCV kütüphaneleri eklenir. Qt proje dosyasında (.pro) '\' simgesi bir alt satırdan devam et anlamında kullanılır. Klasör yolu tanımlanırken ya '/' simgesi ya da '\\' simgesi kullanılır. Ayrıca Qt proje dosyasında (.pro) kütüphane tanımlanırken -L(kütüphane yolu), -l(kütüphane) şeklinde önekleri kullanılmaktadır.

INCLUDEPATH += /home/eyyup/Downloads/opencv-3.4.3/build/include
LIBS += -L"/home/eyyup/Downloads/opencv-3.4.3/build/lib"
LIBS += -lopencv_aruco
LIBS += -lopencv_bgsegm
LIBS += -lopencv_bioinspired
LIBS += -lopencv_calib3d
LIBS += -lopencv_ccalib
LIBS += -lopencv_core
LIBS += -lopencv_cudaarithm
LIBS += -lopencv_cudabgsegm
LIBS += -lopencv_cudacodec
LIBS += -lopencv_cudafeatures2d
LIBS += -lopencv_cudafilters
LIBS += -lopencv_cudaimgproc
LIBS += -lopencv_cudalegacy
LIBS += -lopencv_cudaobjdetect
LIBS += -lopencv_cudaoptflow
LIBS += -lopencv_cudastereo
LIBS += -lopencv_cudawarping
LIBS += -lopencv_cudev
LIBS += -lopencv_cvv
LIBS += -lopencv_datasets
LIBS += -lopencv_dnn_objdetect
LIBS += -lopencv_dnn
LIBS += -lopencv_dpm
LIBS += -lopencv_face
LIBS += -lopencv_features2d
LIBS += -lopencv_flann
LIBS += -lopencv_freetype
LIBS += -lopencv_fuzzy
LIBS += -lopencv_hfs
LIBS += -lopencv_highgui
LIBS += -lopencv_img_hash
LIBS += -lopencv_imgcodecs
LIBS += -lopencv_imgproc
LIBS += -lopencv_line_descriptor
LIBS += -lopencv_ml
LIBS += -lopencv_objdetect
LIBS += -lopencv_optflow
LIBS += -lopencv_phase_unwrapping
LIBS += -lopencv_photo
LIBS += -lopencv_plot
LIBS += -lopencv_reg
LIBS += -lopencv_rgbd
LIBS += -lopencv_saliency
LIBS += -lopencv_shape
LIBS += -lopencv_stereo
LIBS += -lopencv_stitching
LIBS += -lopencv_structured_light
LIBS += -lopencv_superres
LIBS += -lopencv_surface_matching
LIBS += -lopencv_text
LIBS += -lopencv_tracking
LIBS += -lopencv_video
LIBS += -lopencv_videoio
LIBS += -lopencv_videostab
LIBS += -lopencv_xfeatures2d
LIBS += -lopencv_ximgproc
LIBS += -lopencv_xobjdetect
LIBS += -lopencv_xphoto


(2.yol)
Yukarıda anlatılan yöntemle proje dosyasına OpenCV kütüphanesinin derlendiği klasör yolunu tanımladığınızı ve bu şekilde onlarca proje oluşturduğunuzu düşünün. Yeni bir OpenCV versiyonu çıktığında ya da klasörü farklı bir yere taşıdığınızda oluşturduğunuz onlarca projeyi tek tek açarak bu tanımlamaları düzeltmeniz gerekecektir. Bu sıkıntılı durumu yaşamamak için yukarıda yapılan tanımlar bir text dosyası açılarak buraya yazılır. Daha sonra ".txt" olan dosya uzantısı ".pri" olarak değiştirilir ve bu dosya aşağıda tanımlandığı gibi Qt proje dosyasına (.pro) eklenir.

include(/home/eyyup/Downloads/opencv-3.4.3/opencv_library_path.pri)