آموزش رابط چندین سند در PyQt
آموزش رابط چندین سند در PyQt
در این درس از مجموعه آموزش برنامه نویسی سایت سورس باران، به آموزش رابط چندین سند در PyQt خواهیم پرداخت.
پیشنهاد ویژه : پکیج آموزش پروژه محور پایتون
یک برنامه GUI معمولی ممکن است پنجره های متعددی داشته باشد. ویدجت های جدول بندی شده و انباشته به شما امکان می دهد یک پنجره را در یک زمان فعال کنید. با این حال، بسیاری اوقات این روش ممکن است مفید نباشد زیرا نمای پنجره های دیگر پنهان است.
یک راه برای نمایش همزمان چندین پنجره، ایجاد آنها به عنوان پنجره های مستقل است. این را SDI (رابط تک سند) می نامند. این به منابع حافظه بیشتری نیاز دارد زیرا هر پنجره ممکن است سیستم منو ، نوار ابزار و غیره خود را داشته باشد.
برنامه های کاربردی MDI (Multiple Document Interface) منابع حافظه کمتری مصرف می کنند. پنجره های فرعی در داخل ظرف اصلی به نسبت یکدیگر قرار گرفته اند. ویجت ظرف QMdiArea نام دارد.
ویجت QMdiArea به طور کلی ویجت مرکزی شی QMainWondow را اشغال می کند. پنجره های کودک در این منطقه نمونه هایی از کلاس QMdiSubWindow هستند. امکان تنظیم هر QWidget به عنوان ویجت داخلی شیء subWindow وجود دارد. پنجره های فرعی در ناحیه MDI را می توان بصورت آبشاری یا کاشی مرتب کرد.
جدول زیر روشهای مهم کلاس QMdiArea و کلاس QMdiSubWindow را لیست می کند –
متد و توضیحات | |
---|---|
1 | ()addSubWindow
ویجت را به عنوان زیر پنجره جدید در ناحیه MDI اضافه می کند |
2 | ()removeSubWindow
ویجتی را که ویجت داخلی یک زیر پنجره است حذف می کند |
3 | ()setActiveSubWindow
زیر پنجره را فعال می کند |
4 | ()cascadeSubWindows
زیر پنجره ها را در MDiArea به صورت آبشار مرتب می کند |
5 | ()tileSubWindows
زیر پنجره ها را در MDiArea به صورت کاشی مرتب می کند |
6 | ()closeActiveSubWindow
زیر پنجره فعال را می بندد |
7 | ()subWindowList
لیست زیر پنجره های ناحیه MDI را برمی گرداند |
8 | ()setWidget
QWidget را به عنوان ویجت داخلی نمونه QMdiSubwindow تنظیم می کند |
شی QMdiArea سیگنال subWindowActivated () را منتشر می کند در حالی که سیگنال ()windowStateChanged توسط شی QMdisubWindow منتشر می شود.
مثال
در مثال زیر، پنجره سطح بالا شامل QMainWindow دارای منو و MdiArea است.
1 2 3 4 5 6 7 8 |
self.mdi = QMdiArea() self.setCentralWidget(self.mdi) bar = self.menuBar() file = bar.addMenu("File") file.addAction("New") file.addAction("cascade") file.addAction("Tiled") |
سیگنال ()Triggered منو به تابع ()actionaction وصل شده است.
1 |
file.triggered [QAction] .connect (self.windowaction) |
اکشن جدید منو یک زیر پنجره در ناحیه MDI با عنوان اضافه شده به آن اضافه می کند.
1 2 3 4 5 6 |
MainWindow.count = MainWindow.count+1 sub = QMdiSubWindow() sub.setWidget(QTextEdit()) sub.setWindowTitle("subwindow"+str(MainWindow.count)) self.mdi.addSubWindow(sub) sub.show() |
دکمه های آبشار و کاشی منو ترتیب زیر پنجره های نمایش داده شده را به ترتیب به صورت آبشار و کاشی کاری می کند.
کد کامل به شرح زیر است –
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
import sys from PyQt4.QtCore import * from PyQt4.QtGui import * class MainWindow(QMainWindow): count = 0 def __init__(self, parent = None): super(MainWindow, self).__init__(parent) self.mdi = QMdiArea() self.setCentralWidget(self.mdi) bar = self.menuBar() file = bar.addMenu("File") file.addAction("New") file.addAction("cascade") file.addAction("Tiled") file.triggered[QAction].connect(self.windowaction) self.setWindowTitle("MDI demo") def windowaction(self, q): print "triggered" if q.text() == "New": MainWindow.count = MainWindow.count+1 sub = QMdiSubWindow() sub.setWidget(QTextEdit()) sub.setWindowTitle("subwindow"+str(MainWindow.count)) self.mdi.addSubWindow(sub) sub.show() if q.text() == "cascade": self.mdi.cascadeSubWindows() if q.text() == "Tiled": self.mdi.tileSubWindows() def main(): app = QApplication(sys.argv) ex = MainWindow() ex.show() sys.exit(app.exec_()) if __name__ == '__main__': main() |
کد بالا خروجی زیر را تولید می کند –
دیدگاه شما