intranet-qt-de-gui

QT'de GUI
 
QT, GUI'lerdeki widgetlari düzenlemede layout'ları kullanır.

Ancak GUI'deki layoutların düzgün bir şekilde işlevlerini sürdürebilmesi için kesinlikle widgetların da fixed olmadan layout la beraber resize edilebilmesi lazımdır. Aksi takdirde fixed olacağından layout'un ne kadar resize olacağının bir önemi yoktur. Layoutlar fixed widgetlara müdahale edemez. Bu da layout ların düzgün çalışmamasına ve ekrandaki görüntünün farklı çözünürlük veya ekranlarda bozulmasına neden olacaktir.

 
Fixed Widget: Designer'da widget için maximumsize ve minimumsize eşitse bu widget fixed widgettir.
 
Ama bu fixed widgetlara ihtiyaç duymayacağımız anlamına gelmiyor. Böyle bir durumdan bir kaç şekilde kurtulabiliriz. Öncelikle design'ı değiştirip fixed widget kullanmayız. Çok ihtiyaç duyuyorsak da yapmamız gereken, sadece ihtiyaç duyduğumuz widgetları fixed yapıp geri kalanlari expanding yapmak ve en azından resize anındaki bozulmayı minimum seviyeye düşürerek düşük çözünürlüklerde de düzgün görülebilmesini sağlamaktır.
 
Öncelikle Qt designer da gui tasarlarken kullanabileceklerimize bakalım.
 
Qt designeri açıp 'Property Editor' bakalım. Bu editor genel olarak widgetların özelliklerini tutar.
 
Bu pencerede önce 'geometry' adlı satırı expand edelim. Bunun child ozellikleri sırasıyla 'X', 'Y', 'width' ve 'height' dır. X ve Y widgetin parenti üzerinde bulunduğu noktanın koordinatlarını tutar. Width ve height ise sırasıyla genişlik ve yüksekliği tutar. Bu kısma genelde ihtiyaç duymayacağız çünkü amacımız her ekranda düzgün görülebilen GUI ler tasarlamak olduğundan bu değerleri otomatik olarak o anki ekrana göre layoutlar ya da kodlarla biz atayacağız.

Sonrasında ise 'SizePolicy' i inceleyelim. Burası layoutlarda widgetların güzel görünebilmesi açısından önemlidir. Ancak dikkat; bu özellikler layoutlar içinde geçerli olmaya başlar. Bu yüzden layout içerisinde olmayan bir widget ın burdaki değişiklerden etkilenmesi beklenemez.


Bu da geomerty gibi dört child özellik barındırır. Sırasıyla 'Horizontal Policy','Vertical Policy','Horizontal Stretch','Vertical Stretch'. Horizontal ve Vertical Policy widgetların sırasıyla yatay ve dikey de layout tarafından alan verildiklerinde nasıl bir davranış izleyeceklerini tutar. Bu seçenekleri inceleyelim;
 
Not:Bir widget'ı layouta koyduğumuzda Qt tarafından önerilen bir boyut oluşturulur. Bu sizeHint()'dir. Kısaca sizeHint Qt in widget'larımız için ekranımızdaki en ideal boyuttur. Bu boyutu  kullanmayıp kendi boyutlarımızı tanımlamak için setMinimunSize ve setMaximunSize fonksiyonlarını kullanabiliriz.
 
Fixed:  sizeHint() değerlerine göre widget'ı sabitler. Layout genişlese de daralsa da aynen boyutunu sürdürmeye devam eder.
 
Minimum: sizeHint()'ti minimum a çeker ve o değerleri kabul eder. O değerlerin altına düşmez. Ancak layout genişlediğinde düzene uyabilmek için genişleyebilir.
 
Maximum: sizeHint()'ti maximum a çeker ve o değerlerin üstüne çıkamaz ama diğer widgetlar'ın daha fazla yer ihtiyacı veya layout küçülmeye başlarsa boyutunda azalma olabilir.
 
Preffered:  sizeHint() normal değerlerini kabul eder. Daralabilir veya  genişleyebilir. Ancak kesinlikle genişlerken vermiş olduğumuz değerlerin üstüne çıkamaz. QWidget lar default olarak seçili gelir.
 
Expanding: sizeHint() sınırları doğrultusunda widget'ta layout tarafından ne kadar alan verilirse tamamını kullanır ve genişleyebildiği kadar genişler. Alan daraltılırsa da küçülebilir.
 
MinimumExpanding: Genişler ancak daralması için daraltılabilecek başka widget olmamalıdır. Aksi takdirde bu widget sabit kalırken daratılabilecek başka widgetlar varsa o widgetlar daraltılır.
 
Ignored: Widget için hiçbir şey sınır değildir. Genişleyebileceği kadar genişler. Daralabileceği kadar da daralır.
 
Sonrasında ise horizontal strecth ve vertical stretch gelir. Bu değerler widgetların diğer widgetlara ne kadar yer bırakacağı ile ilgili bilgileri tutar. Mesela default  0 gelir. Eğer layouttan birden fazla widget varsa ve değerler 0 dan farklı ise değeri fazla olan daha fazla yer kaplarken değeri az daha az yer kaplar. (Detaylı bilgileri Stretch Kullanımı adlı dökümanda bulabilirsiniz.)
 
Size Policy den sonra ise minimumSize ve maximumSize gelir.
 
minimumSize ve maximumSize bunlar ise pencerenin max ve min size'larını atamak için kullanırız. Eğer bir penceremizde MaximumSize ve MinimumSize değerlerini eşit atarsak o pencere resize edilemez. Bu fonksiyonları kullanmanın tek dezavantajı normalde Qt nin widgetların size'larını atamak için kullanmış olduğu değerlerin(sizeHint) üzerine yazar ve bizim atamış olduğumuz değerler default değer olarak kabul edilir.
 
SizeIncrement: Bu ise normalde resize etmeye basladığımız da widget'ların size'ı vermiş olduğumuz değer oranında aşağıdaki formüllere göre artırır. Bu fonksiyondan uzak durmalıyız. Hem windows da hem linux da sorunlara neden olan, her zaman çalışacağının garantisi olmayan bir fonksiyondur.
     width = baseSize().width() + i * sizeIncrement().width();
     height = baseSize().height() + j * sizeIncrement().height();
 
Şimdi gelelim layout property lerini eğer herhangi bir dialog yada widget a layout eklerseniz bunları o widget'ın property editorunde Qlayout sekmesi adı altında bulabilirsiniz. Direk eklemiş iseniz layoutu designerın tasarım alanından ya da object inspector den seçebilirsiniz.
 
Sırasıyla bu özellikleri inceleyelim;
 
Layout(left, right, up, down)margin: Bu widgetların layout içinde sol, sağ, üst ve altından ne kadar boşluk bırakacağını tutar.
 
LayoutSpacing: Layout arası widgetların arasındaki mesafeyi tutar. Burda -1 default olarak atanmış bir değerdir. Eğer elle atamak istersek 0 dan büyük değerler girebiliriz. -1 ve altı değerler geçersiz değerlerdir.
 
LayoutStrecth: Layout widgetlar için ne kadar oranda alan tutacağını setleyebiliriz. Normalde 0 dır. Fazla değere sahip olan daha geniş yer kaplar.
 
LayoutSizeConstraint: Bu Qt tarafindan layoutlarin aşırı daraltılması veya genişlemesini engellemek amaçlı boyuta sınır koyan özelliktir. Mesela bu özellik aktifken pencerimizi daraltmak istedik. QT, widgetlarin üst üste gelmeye başlıyacağı boyutu minimum kabul edip en fazla o kadar daralmasına izin verecektir. Bu özellik aktifse pencerelerimiz widgetların üst üste gelmeye başladığı anda resize'ı durdurur.
 
Ancak bunu aktif etmek çok düşük çözünürlüklerde sorunlar yaratacaktır. Aynı zamanda layout çakışmasını bile minimum kabul edeceğinden widget'lar çok daha fazla darabilecekken bile, daralmasına engel olabilir. Bu da minumum size belli olduğundan belki pencere daha fazla küçülemeyeğinden kullanıcı widgetları göremeyecektir. Yani widgetları görememesi yerine widget'ların az da olsa üst üste gelmesi bazen avantaj sağlayabilir. Bu yüzden bu özelliği setNoConstraintle kapatmamız gerekir. Şimdi bu özellikle ilgili seçenekleri inceleyelim.
 
SetDefaultConstraint: Default gelir. QT tarafindan minimum belirlenen size'ın altına düşemez. Ama direk bu size ile de başlamaz.
 
SetFixedSize: QT tarafından belirlenen size'da sabitlenir, altı veya üstü olamaz.
 
SetMinimumSize: QT tarafindan belirlenen minumum size'da kendini setler.
 
SetMaximumSize: QT tarafindan belirlenen maximum size'da kendini setler.
 
SetMinandMaxSize: QT default değerlerine gore minimum size minumuma, maximumsize da maximuna atanir. Bu aralık içinde her size resize edilebilir.
 
SetNoConstraint: Tamamen değişken olabilen her size getirilebilen bir pencere oluşturulur.
 
Şimdi biraz daha karmaşık bir durumu inceleyelim. Mesela aşağıdaki gibi bir durum olsun.

Tüm bu widgetları şeçip Layout in a Grid ile hizalayalım.
 

Şimdi dikkat ederseniz yukarda ki gibi bir görüntü oluştu ve burda toplamda 5 column var. Widget sayısına göre column sayısı oluşturulur. Daha fazla column için spacer kullanılabilir. Column sayısı önemlidir. Çünkü her bir column'ı belli oranlara bölüp widgetlarımızın kaç columnda bulunmasını istiyorsak ona göre ayarlayacağız.
 
Boş Column veya row silmek için içine spacer atıldıktan sonra delete tuşuna basılır.
 
Layout'u seçelim;

Şimdi yukardaki örneği inceleyelim. Columnların tamamını eşit dağılması amacıyla tüm strecth değerleri aynı olmalıdır. 0 da olabilirdi ama örnekte 10 yapılmıştır. Columnlardan birinin büyük olmasını istersek mesela 2 katı kadar, o column'ı 20 yapmalıyız. Columnlarımızı ayarladıktan sonra widgetlarımızın bu columnlardan kaç tanesine yayılmasını istiyorsak o columnın üzerine doğru boyutunu genişleterek o columnuda kaplamasını sağlarız. Aşağıdaki gibi;
 
 
 
Böylelikle tüm widget'larımızın dağılımını eşit oranlarda yapmış oluruz.