آموزش مقدماتی برنامه نویسی GUI با PyQt - بخش دوم
چه روز خوبی برای کار با PyQt ــست :-)
در بخش قبل ( آموزش مقدماتی طراحی رابط کاربری با PyQt ) کمی آشناشدیم،
حال با روشی منطقی ادامه میدهیم.
در بخش قبل یک اینستنس از کلاس QMainWindow ساختیم اما در دنیای واقعی این درست نیست!
ٌٌQMainWindow در واقع به عنوان فریم ورکی است برای ساختن پنجره ها. در واقع پنجره ها اینستنس هایی از فرزندان این کلاس اند. بیایید مثال بخش قبل را اصلاح کنیم:
import sys
from PyQt4 import QtGui
class myCustomWindow(QtGui.QMainWindow):
def __init__(self):
super(myCustomWindow,self).__init__()
self.setWindowTitle("Python In Depth")
window_icon = QtGui.QIcon("pythonindepth.png") # Adress file ra vared mikonim
self.setWindowIcon(window_icon)
self.resize(300,200) # arz va ertefa bar hasbe pixel
self.move(400,200) # arz va tool bar hasbe pixel
def main():
app = QtGui.QApplication(sys.argv)
my_window = myCustomWindow()
my_window.show()
app.exec_()
if __name__ == "__main__":
main()
حال چگونه به برنامه خود دکمه ، منو ، نوشته ، جدول و ... اضافه کنیم؟
بسیار خوب! پای کیوتی (PyQt) همه اینها را با عنوان Widget میشناسد! در نمودار زیر ویدجت های مختلف را میبینیم که همگی فرزندی از کلاس QWidget اند :
برای استفاده از این ویدجت ها لازم است از کلاسشان اینستنس بسازیم.
جهت خوانایی بهتر کد، این ویدجت ها را در متدی با نام createWidget در کلاس myCustomWindow وارد کنیم:
def createWidgets(self):
self.label = QtGui.QLabel("Esmetun?") # anche ke mikhahim in widget nemayesh dahadra be onvan parametr midahim
self.lineEdit = QtGui.QLineEdit()
self.button = QtGui.QPushButton("Vurud")
اما این کافی نیست! باید نحوه چینش ویدجت ها را هم مشخص کنیم!
برای این منظور باید میان طراحی ایستا(ثابت) یا طراحی پویا (relative - وابسته - Dynamic) یکی را برگزینیم.
برای اطلاعات بیشتر مراجعه کنید به [ بعدا تکمیل خواهد شد ]
برای طراحی دینامیکی میتوانیم از کلاس های QHBoxLayout یا QVBoxLayout یا QGridLayout ویا QFormLayout استفاده کنیم.
برای مثال:
- QHBoxLayout : ویدجت ها را به طور افقی میچیند.
- QVBoxLayout : ویدجت ها را به طور عمودی میچیند.
فی الحال از QHBoxLayout برای چینش افقی ویدجت هایی که ساخته بودیم استفاده میکنیم، به این شکل که:
h_box = QtGui.QHBoxLayout()
h_box.addWidget(self.label)
h_box.addWidget(self.lineEdit)
h_box.addWidget(self.button)
myCentralWidget = QtGui.QWidget()
myCentralWidget.setLayout(h_box)
self.setCentralWidget(myCentralWidget)
import sys
from PyQt4 import QtGui
class myCustomWindow(QtGui.QMainWindow):
def __init__(self):
super(myCustomWindow,self).__init__()
self.setWindowTitle("Python In Depth")
window_icon = QtGui.QIcon("pythonindepth.png") # Adress file ra vared mikonim
self.setWindowIcon(window_icon)
self.resize(300,200) # arz va ertefa bar hasbe pixel
self.move(400,200) # arz va tool bar hasbe pixel
self.createWidgets()
self.initUI()
def initUI(self):
h_box = QtGui.QHBoxLayout()
h_box.addWidget(self.label)
h_box.addWidget(self.lineEdit)
h_box.addWidget(self.button)
myCentralWidget = QtGui.QWidget()
myCentralWidget.setLayout(h_box)
self.setCentralWidget(myCentralWidget)
def createWidgets(self):
self.label = QtGui.QLabel("Esmetun?")
self.lineEdit = QtGui.QLineEdit()
self.button = QtGui.QPushButton("Vurud")
def main():
app = QtGui.QApplication(sys.argv)
my_window = myCustomWindow()
my_window.show()
app.exec_()
if __name__ == "__main__":
main()