PyQt harikaları

Merhaba PyQt harikaları yazı dizimize hoş geldiniz, bu arada başlık iddialı olmuş biraz ama hak ediyor bence. Bu ara fırsat buldukça bir dizi halinde PyQt ile yapabileceğiniz “değişik” ve “işlevsel” şeylerden bahsedeceğim. İlki bu yazı, gelen tepkileri beğenirsem diğerlerini de yazarım, +rep’lerinizi bekliyorum :) Hemen senaryomuza geçelim. Bir resim gösterici uygulaması geliştiriyorsunuz ama uygulamanızın normal pencere şeklinde görünmesini istemiyorsunuz, formunuzun çerçeve şeklinde olmasını ve içinde resimlerinizin görünmesini istiyorsunuz. PyQt ile çok kolay. Pencerenizi herhangi bir çizim programıyla çizin ve gerisini PyQt’ye bırakın.

Örnek uygulamayı vermeden önce içeriğinden bahsedeyim, örneğimizde ana formumuz, kapatma ve minimize butonları ile ileri – geri butonlarını gösteren toplam 5 adet resim bulunmakta. Amacım pencere dekorasyonunu göstermek olduğu için resim gösterme kısmını yazmadım.

Anlatımı kodun içerisinde uygun yerlerde açıklama satırları ile yaptım. Kafanıza takılan, anlamadığınız bir kısım olursa sormaktan çekinmeyiniz.
Kodumuz şöyle:

# -*- coding: utf-8 -*-
 
# Form implementation generated from reading ui file 'widget.ui'
#
# Created: Thu Jan 19 21:53:03 2009
#      by: PyQt4 UI code generator 4.4.4
#
# Yazan : Aydın Şen
 
from PyQt4 import QtCore, QtGui
import sys
class Ui_Form(QtGui.QWidget):
 
    def __init__(self, parent=None):
 
        QtGui.QWidget.__init__(self, parent)
	self.setObjectName("Picture Viewer")
	"""
	# Pencereyi olusturacagimiz ana resmimizi yukluyoruz.
	# Penceremiz once bu resme göre kesilip-biciliyor,
	# daha sonra aynı resim kesili-bicilen pencereye arkaplan olarak label'in icine yerlestiriliyor
	"""
	self.pixMap = QtGui.QPixmap("pict_frame.jpg")
	# Ana pencerenin enini ve boyunu yukledigimiz resme gore ayarliyoruz
	self.w = self.pixMap.width()
	self.h = self.pixMap.height()
	# Ana penceremizi yeni boyutuna resize ediyoruz
        self.resize(self.w, self.h)
	# Kestigimiz pencereye arkaplan olarak doseyecegimiz label'imizi tanimliyoruz
        self.labelBackground = QtGui.QLabel(self)
        self.labelBackground.setObjectName("labelBackground")
        self.labelBackground.setPixmap(self.pixMap)
	# Penceremize title ve icon verilerini giriyoruz
        self.setWindowTitle("Picture Viewer")
	self.setWindowIcon(QtGui.QIcon("windowIcon.png"))
	"""
	# Penceremizi ozellestirdigimiz icin kendi kapatma ve minimize butonlari yok
	# elimizde bulunan buton resimlerini butonlara atiyoruz
	# burada paletteButImage adinda bir palet nesnesi olusturduk
	# bu nesne ile resmin kendisinin buton olarak gorunebilmesi icin ayarlamalar yaptik
	# flat olmasi, focus ozelligi olmamasi gibi.
	# bu palet nesnesini resim olarak kullanacagimiz butun butonlara aktardik"""
	self.butClose = QtGui.QPushButton(self)
        self.butClose.setGeometry(QtCore.QRect(365, 4, 25, 25))
        paletteButImage = QtGui.QPalette()
        brush = QtGui.QBrush(QtGui.QColor(239, 239, 239, 0))
        brush.setStyle(QtCore.Qt.SolidPattern)
        paletteButImage.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Button, brush)
        brush = QtGui.QBrush(QtGui.QColor(0, 0, 0, 0))
        brush.setStyle(QtCore.Qt.SolidPattern)
        paletteButImage.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Shadow, brush)
        brush = QtGui.QBrush(QtGui.QColor(239, 239, 239, 0))
        brush.setStyle(QtCore.Qt.SolidPattern)
        paletteButImage.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Button, brush)
        brush = QtGui.QBrush(QtGui.QColor(0, 0, 0, 0))
        brush.setStyle(QtCore.Qt.SolidPattern)
        paletteButImage.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Shadow, brush)
        brush = QtGui.QBrush(QtGui.QColor(239, 239, 239, 0))
        brush.setStyle(QtCore.Qt.SolidPattern)
        paletteButImage.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Button, brush)
        brush = QtGui.QBrush(QtGui.QColor(0, 0, 0, 0))
        brush.setStyle(QtCore.Qt.SolidPattern)
        paletteButImage.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Shadow, brush)
        self.butClose.setPalette(paletteButImage)
        self.butClose.setFocusPolicy(QtCore.Qt.NoFocus)
	# butona koyacagimiz resmi yukledik
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap("btn_close.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.butClose.setIcon(icon)
        self.butClose.setIconSize(QtCore.QSize(21, 21))
        self.butClose.setFlat(True)
        self.butClose.setObjectName("butClose")
 
	self.butMinimize = QtGui.QPushButton(self)
        self.butMinimize.setGeometry(QtCore.QRect(340, 4, 25, 25))
        self.butMinimize.setPalette(paletteButImage)
        self.butMinimize.setFocusPolicy(QtCore.Qt.NoFocus)
        icon1 = QtGui.QIcon()
        icon1.addPixmap(QtGui.QPixmap("btn_min.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.butMinimize.setIcon(icon1)
        self.butMinimize.setIconSize(QtCore.QSize(21, 21))
        self.butMinimize.setFlat(True)
        self.butMinimize.setObjectName("butMinimize")
 
	self.butNext = QtGui.QPushButton(self)
        self.butNext.setGeometry(QtCore.QRect(230, 300, 50, 35))
        self.butNext.setPalette(paletteButImage)
        self.butNext.setFocusPolicy(QtCore.Qt.NoFocus)
        icon2 = QtGui.QIcon()
        icon2.addPixmap(QtGui.QPixmap("btn_right_arrow.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.butNext.setIcon(icon2)
        self.butNext.setIconSize(QtCore.QSize(45, 28))
        self.butNext.setFlat(True)
        self.butNext.setObjectName("butNext")
 
	self.butPrevious = QtGui.QPushButton(self)
        self.butPrevious.setGeometry(QtCore.QRect(140, 300, 50, 35))
        self.butPrevious.setPalette(paletteButImage)
        self.butPrevious.setFocusPolicy(QtCore.Qt.NoFocus)
        icon3 = QtGui.QIcon()
        icon3.addPixmap(QtGui.QPixmap("btn_left_arrow.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.butPrevious.setIcon(icon3)
        self.butPrevious.setIconSize(QtCore.QSize(45, 28))
        self.butPrevious.setFlat(True)
        self.butPrevious.setObjectName("butPrevious")
 
	"""
	# Butonlar icin toolTip girdik
	# Kapat ve Minimize butonlarinin actionlarini belirledik
	# ileri ve geri butonlarina herhangi bir action atamadik
	"""
	self.butClose.setToolTip(QtGui.QApplication.translate("Form", "Kapat", None, QtGui.QApplication.UnicodeUTF8))
        self.butMinimize.setToolTip(QtGui.QApplication.translate("Form", "Simge durumuna küçült", None, QtGui.QApplication.UnicodeUTF8))
	self.butNext.setToolTip(QtGui.QApplication.translate("Form", "Sonraki", None, QtGui.QApplication.UnicodeUTF8))
	self.butPrevious.setToolTip(QtGui.QApplication.translate("Form", "Önceki", None, QtGui.QApplication.UnicodeUTF8))
	QtCore.QObject.connect(self.butClose, QtCore.SIGNAL("clicked()"), self.close)
        QtCore.QObject.connect(self.butMinimize, QtCore.SIGNAL("clicked()"), self.showMinimized)
	self.setWindowTitle(QtGui.QApplication.translate("Form", "Picture Viewer", None, QtGui.QApplication.UnicodeUTF8))
 
	self.ortala()
 
    def ortala(self):
	    """
	    # Bu fonksiyon uygulama calistiginda pencerenin ekranin
	    # ortasine yerlesmesini sagliyor
	    """
	    screen = QtGui.QDesktopWidget().screenGeometry()
	    size =  self.geometry()
	    self.move((screen.width()-size.width())/2, (screen.height()-size.height())/2)
 
    def mousePressEvent(self, event):
	 """
	 # Kendimize ozel pencere belirledigimiz icin mouse eventlarini override ediyoruz
	 """
         if event.button() == QtCore.Qt.LeftButton:
 
             self.dragPosition = event.globalPos() - self.frameGeometry().topLeft()
             event.accept()
 
    def mouseMoveEvent(self, event):
 
         if event.buttons() == QtCore.Qt.LeftButton:
 
             self.move(event.globalPos() - self.dragPosition)
             event.accept()
 
    def resizeEvent(self, event):
	 """
	 # Eveeeet, uygulamamizin esas oglani!!!!!
	 # Pencereyi "kesip-bictigimiz" kisim
	 # hatirlarsaniz programin basinda self.pixMap icerisine pencere olarak
	 # kullanmak istedigimiz resmi yuklemistik.
	 # Burada yukledigimiz resmi kullanarak bir maske uretiyoruz
	 # ve Pencerenin (self) setMask metoduna maske nesnemizi gondererek
	 # penceremizin resimdeki gibi olmasini sagliyoruz.
	 # Kendisi kucuk ama islevi buyuk..
	 """
	 maske = self.pixMap.createMaskFromColor(QtGui.QColor(0,0,0,0))
         self.setMask(maske)
 
def main():
 
    app=QtGui.QApplication(sys.argv)
    form = Ui_Form()
    form.show()
    sys.exit(app.exec_())
 
if __name__ == "__main__":
 
     main()

Yok ben indirip denemeyeyim çalışan halini görsem yeter derseniz buyrun.
Uygulamayı kullanılan resimlerle birlikte buradan indirebilirsiniz.

 

5 thoughts on “PyQt harikaları”

  1. Umarım yarar, yabancı kaynaklar bile tatmin edici seviyede değil. Pek kullanan yok açıkçası o yüzden bugün değil belki ama ileride yarayabilir. O yüzden paylaşım sağlamak adına ingilizce yazılar yazacağım “pythonturk.com/eng” açmayı da düşünüyorum. 2 tarafa da aynı özeni göstermeyi istiyorum ama yapabilirmiyim bilmiyorum açıkçası.

  2. Harika bir çalışma olmuş, ellerinize sağlık. Bu çalışma aynı zamanda arayüz değişmenin temeli olabilir mi? (Skin dedikleri oluyor galiba)Ya da öyle bir örnek yapabilir misiniz?

  3. Merhaba,
    Farklı arayüzler oluşturmak istiyorsanız maskeleme yöntemini skin ile birlikte kullanabilirsiniz. Skin ile ilgili bir çalışmam olmadı ancak bildiğim kadarıyla kullanılan yöntem şöyle; skinleri xml dosya olarak tutuyorsunuz, arayüzde kullandığınız nesnelerin tüm özelliklerini yükleme anında bu xml dosyalardan okuyarak belirliyorsunuz.

    İşim dolayısıyla PyQt ile pek ilgilenemiyorum bu ara, web programlamayla uğraşıyorum daha çok. O yüzden bu konuyu öğrenip-örneklemem vakit alabilir, ama yapılacaklar listeme ekliyorum, ilk fırsatta böyle bir örnek hazırlamaya çalışırım.

  4. mrb arkadaşlar python ve qt ile ilgili bi proje aldım python oğrendim fakat qt ile ilgili fazla bi bilgim yok bana yardımcı olabilme imkanınız varmı…. qt gui kutuphaesi nasıl eklenir??? qt nasıl kullanılır??? bunlar hakkında bilgi alabilrisem projemi tamamlayacağım fakat qt ile ilgili hiç bi bilgim yok şu anda

Leave a Reply

Your email address will not be published. Required fields are marked *