آموزش پای کیوت ( مقدماتی )

در مقدمه آموزش پای کیوت شما با این فرم ورک نحوه آن اشنا شدید حالا در بخش اول اموزش پای کیوت می خوام شمارو با ماژول های رابط گرافیکی کیوتی و سپس عناصر یک رابط گرافیکی  اشنا کنم  و بعد از اشنایی با چارچوب اصلی کد کیوتی  یک برنامه ساده رو کد بزنم

ساختار کتابخانه ای Qt4

QtCore:

  • انواع مقادیر پایه:QByteArray,QString,QDate,QTime,QSize,QPoint
  • آبجکت ها و متا آبجکت ها: QObject, QMetaObect
  • سیستم فایل:QFile,QDire,QIODivice,QTextStream,QDateStream
  • پشتیبانی اپلیکشن پایه:QCoreApplication,QEvent,QTimer

QtGui:

  • ویدجتها:QCheckBox,QComboBox,QDateTimeEdit,QLineEdit,QPushButton,QRadioButton,QLabel,QSlider,etc
  • انواع مقادیر پایه:QColor,QFont,QBrush,QPen
  • پشتیبانی اپلیکشن:QApplication
  • جعبه متنی پیشرفته:QTextEdit,QTextDocument,QTextCursor

 

چهارچوب اصلی یک اپلیکشن:

 

from PyQt4 import QtGui
import sys

class MainWindow(QtGui.QMainWindow):
    def __init__(self): super(MainWindow, self).__init__()
    # QMainWindow.__init__(self)

if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())

در کد بالا که معمولا چهارچوب ثابت کد یک اپلیکشن هست ابتدا یک کلاس MainWindow با وراثت از QMainWindow  موجود در کتابخانه ی پای کیوت می سازیم . سپس شی ای بنام window  از روی این کلاس ایجاد کرده و با دستور show  انرا اجرا  می کنیم . حلا کد بالا توسط پایتون اجرا کنید و نتیجه کاز را می توانید در تصویر پایین ببینید. توجه کنید کامنت سبز رنگ مشخص شده در کد عیارتی را نشان می دهد که می تواند بجای عبارت سوپر دز خط بالایش جایگزین شود . در واقع این دو خط باهم مترادف هستند و به ما می گن که کلاس MainWindow تمام صفات تعریف شده در QMainWindowای که در کتابخانه کیوتی قرار دارد را دارا می باشد.

استفاده از ویدجت ها:

در بخش پیش ما یک پنجره ایجاد کردیم ولی حالا قراره که درون این پنجره رو با ویدجت ها پر کنیم و یه برنامه ساده بسازیم . ما به یاد داریم که تمام ویدجت های گرافیکی در QtGui  قرار دارند پس برای چینش ویدجت ها باید انها رو از این کتابخونه فرا بخونیم و توسط لای اوت ها یا لایه ها در مکان مناسب خودشون در صفحه قرار بدیم .

لای اوت ها اغلب در سه شکل زیر می باشند البته لای اوت دیگه ای هم بنام FormLayout  داریم که اگر خودتون مثال های همرا بسته پای کیوت را مطالعه کنین حتما بیشتر می تونین اطلاعات دقیق تری پیدا کنین:


حالا باید نقشه چینش ویذجت های برنامه یمان را طراحی کنیم و سپس با استفاده از لایه ها، ویذجت هارو در جای مناسبشون قرار بدیم مقلا در برنامه ای کوچیک که من می خوام بنویسیم برنامه اسم مون رو می گیره و بهمون سلام می کنه. پس یه طرح و نقشه ای توی مایه های زیر توی ذهن منه

الان من می خام دیگه کد اصلی رو بنویسم پس ویدجت هایی که برای کار لازم دارم رو مشخص می کنم:

self.label = QtGui.QLabel("Please enter your name:")
self.nameLabel = QtGui.QLabel("Name")
self.nameEdit = QtGui.QLineEdit()
self.okButton = QtGui.QPushButton("ok")

حالا باید این ویدجت هارو توسط لایه ها در جای مناسبشون قرار بدم:

widget = QtGui.QWidget()
self.setCentralWidget(widget)

vLayout = QtGui.QVBoxLayout() #vertical Layout
hLayout = QtGui.QHBoxLayout() #Horizontal Layout
hLayout.addWidget(self.nameLabel)
hLayout.addWidget(self.nameEdit)

vLayout.addWidget(self.label)
vLayout.addLayout(hLayout)
vLayout.addWidget(self.okButton)

widget.setLayout(vLayout)

در این بخش از کد با ابتدا یک ویدجت ایجاد کرده و آن رو در مرکز MainWindow قرار می دیم سپس لایه ها رو ایجاد کرده و با متد setLayout  در آخر لایه اصلی رو درون این ویدجت قرار می دهیم . لایه ها  شامل یک لایه ی Horizontal(افقی) و یک لایه ی Vertical (عمودی) هستش که در لایه افقی nameLabel و nameEdit  قرار می گیره  سپس این لایه نیز در کنار ۲ ویدجت label و okButton در وسط قرار می گیرد  و لایه عمودی به ویدجت داده می شود.  سادس . فقط باید کمی کار کنین و مثال های بیشتری رو ببینین تا راه بیافتین . برای شروع مثال های همراه پای کیوت بسیار جالب و مفید و آموزنده هستند. خب من در اینجا گرافیک یه برنامه رو ایجاد کردم :

from PyQt4 import QtGui

class MainWindow(QtGui.QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        # QMainWindow.__init__(self)
        self.label = QtGui.QLabel("Please Enter Your Name:")
        self.nameLabel = QtGui.QLabel("Name")
        self.nameEdit = QtGui.QLineEdit()
        self.okButton = QtGui.QPushButton("ok")

        widget = QtGui.QWidget()
        self.setCentralWidget(widget)

        vLayout = QtGui.QVBoxLayout() #vertical Layout
        hLayout = QtGui.QHBoxLayout() #Horizontal Layout
        hLayout.addWidget(self.nameLabel)
        hLayout.addWidget(self.nameEdit)

        vLayout.addWidget(self.label)
        vLayout.addLayout(hLayout)
        vLayout.addWidget(self.okButton)

        widget.setLayout(vLayout)

if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

حالا باید روحی در این کالبد بدمیم تا عملگرا باشه

    self.connect(self.okButton,QtCore.SIGNAL("clicked()"),
self.WriteMyName)
    # self.okButton.clicked.connect(self.WriteMyName)

    def WriteMyName(self):
        name = self.nameEdit.text()
        text = "Hello dear <font size='3' color='blue'>%s</font> welcome to <font size='3' color='red'>'www.dotPy.ir'</font>"%name
        self.label.setText(text)

در خط اول  یک سیگنال کلیکی( دستور مترادف دیگر نیز در خط زیر درج شده) برای دکمه ی ok  ایجاد کردم . زمانی که این دکمه فشرده شد سیگنال تابع مربوط به عملیات لازم را (WriteMyName) فرا خوانی می کند و کار انجام می شود . کد کامل شده برنامه ما بصورت زیر می باشد:

from PyQt4 import QtGui , QtCore

class MainWindow(QtGui.QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        # QMainWindow.__init__(self)
        self.label = QtGui.QLabel("Please Enter Your Name:")
        self.nameLabel = QtGui.QLabel("Name")
        self.nameEdit = QtGui.QLineEdit()
        self.okButton = QtGui.QPushButton("ok")

        widget = QtGui.QWidget()
        self.setCentralWidget(widget)

        vLayout = QtGui.QVBoxLayout() #vertical Layout
        hLayout = QtGui.QHBoxLayout() #Horizontal Layout
        hLayout.addWidget(self.nameLabel)
        hLayout.addWidget(self.nameEdit)

        vLayout.addWidget(self.label)
        vLayout.addLayout(hLayout)
        vLayout.addWidget(self.okButton)

        widget.setLayout(vLayout)
        self.connect(self.okButton, QtCore.SIGNAL("clicked()"), self.WriteMyName)
        #self.okButton.clicked.connect(self.WriteMyName)

    def WriteMyName(self):
        name = self.nameEdit.text()
        text = "Hello dear <font size='3' color='blue'>%s</font> welcome to <font size='3' color='red'>'www.dotPy.ir'</font>"%name
        self.label.setText(text)

if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

خب کد نویسی در اینجا تموم شد ولی باید دوباره یادآوری کنم که پای کیوت و کیوتی دنیایی بسیار بزرگی و وسیع می باشد که شاید بیش از یک سال طول بکشه  تا به در حد متوسط-خوب بشه اون رو فرا گرفت این آموزش تنها شمارو  گام هایی در ورود به  این دنیا پیش می بره ولی پیشروی در قلمروی این فریم ورک زیبا و جذاب و حرفه ای بر عهده خود شما می باشه و همه چیز بستگی به تلاش ها و زمانی داره که خود شما صرف این دنیای زیبا و حرفه ای می کنید 🙂

 

17 دیدگاه برای «آموزش پای کیوت ( مقدماتی )»

    1. اتفاقا پروژه درس آزمایشگاه پایگاه داده من در ترم دوم ۹۱ همین برنامه نویسی حسابداری با پایتون و پای کیوت بود که یه چیز ساده ای به استاد ارائه دادم . برنامه این جوری هستش که کالاها و مشحصات اون رو نعریف می کردیم و و با ثبت مشخصات خریدار برای هربار خرید فاکتور می زنم و همه چیز رو ثبت می کنم . بخش جستجو که می شه از روی شماره فاکتور یا نام خریدار کلیه خریدهای اون شخص رو لیست کرد . بخش دیگه هم پشتیبان گیری از دیتا بیسه . . فکر کنم مثال بسیار خوبی برای اشنایی با کار با پایگاه داده و جدول باشه ولی حجم کد و همچنین بعضی از تکنیک های کد نویسی ایش مشکل هستش که که اینجا شرح بدم ولی خب سعی می کنم مثالایی رو اینجا قرار بدم که نیاز ها رو رفع کنه 😉

  1. من قصد دارم پایتون رو یاد بگیرم اما سوالی در این زمینه دارم برای طراحی برنامه از pyqt استفاده میشه؟ میشه کلا از pyqt designer استفاده کرد و سراغ pyqt نرفت؟ کلا اگه میشه یه توضیحی در این این دو مورد بدین؟ حقیقتش گیج شدم کدوم برای طراحی محیط برنامه هستش؟!

    1. درود بر شما دوست عزیز. در پاسخ به سوال شما باید عرض کنم که که pyqt designer در واقع یه ابزار برای فریم ورک پای کیوت هستش که طراحی زابط گرافیکی کاربر رو ساده تر مبی کنه و نیاز کمتری به کد نویسی دستی ای هست که من در این اموزش ها از روش کد نویسی دستی استفاده کردم. خب از مزایای کد نویسی دستی نسبت به استفاده از دیزاینر می شه به اشنایی بیشتر با کلاس ها و متد های پای کیوت و کلا معماری پای کیوت و کار دقیقتر روی زیبایی طراحی برنامه اشاره کرد البته من قصد دارم که روش طراحی با دیزاینر رو در پست های بعدی مفصل شرح بدم . کلا کار با دیزاینر به این صورت هستش که وقتی گرافیک برنامه تون رو طراحی کردید اون رو با پسوند ui ذخیره می کنید و سپس این فایل رو به پایتون ترجمه می کنید و برنامه رو توسعه می دهیم

    1. بنظر من پای کیوت هم راحتره و هم اپلیکشن های زیباتری می شه با اون طراحی کرد چون پشتیبان بزرگی مثل نوکیا رو همراهش داره باید ازش انتظار ویژگی های حزفه ای تر و بروزتری رو داشت .۲ نمونه اپلیکشن های بزرگی که توسط این فرم ورک طراحی می شن می شه به نیمباز و ovi nokia اشاره کرد که من بشخصه از ovi بسیار لذت بردم تقریبا از تمام ویژگی های زیبای گرافیکی در این نرم افزار توسط متخصصین نوکیا استفاده شده که پیشنهاد می کنم حتما یک بار نسخه جدید این نزم افزار رو نصب کنین تا اشنا بشین. در پاسخ به سوال استفاده از py2exe برای wx بایذ بگم که از این ابزار های تبدیل به فایل اجرایی برای تمامی فرم ورکی هایی که با پایتون نوشته شدن می شه استفاده کرد که wx زو هم دربر می گیره

  2. سلام
    از سایت خوبتون ممنون
    ولی من از کدهایی که نوشتید در ساختار کیوت سر در نیاوردم
    من پایتون رو بلدم
    ولی نمیدونم چکار باید بکنم تا کیوتی رو یاد بگیرم
    من روح دمیدن رو توی کالبد رو بلدم ولی خود کالبد ساختن رو بلد نیستم
    درحقیقت qt desiner رو بلد نیستم اگه میشه فایل تصویری هم بدید
    ممنون

    1. به عقیده بنده دیزاینر زیاد مهم نیست . من خودمم با دیزاینر زیاد کار نمی کنم . تمرین تمرین تمرین . شروع کنین به برنامه های ساده نوشتن .کد های بقیه برنامه نویسان رو ببنین 🙂

  3. سلام ممنون از توضیحاتتون
    فقط یه مشکلی وجود داره تو قسمتی که برای کلید ok سیگنال به وجود اوردید برای من ارور میگیره ارور زیر . در حالی که من همه ی کتابخونه ها رو import کردم.
    AttributeError: ‘MainWindow’ object has no attribute ‘connect’
    البته یه مساله ی دیگه اینکه من با ورژن ۵ pyqt برنامه نوشتم.
    ممنون میشم راهنمایی کنید

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *