في هذا الدرس سنتعلم كيفية إنشاء واستخدام مربعات الحوار (Dialogs) في PyQt Designer، وهي النوافذ الصغيرة التي تظهر للمستخدم لعرض رسالة، أو طلب إدخال، أو تأكيد إجراء معين.
ما هي مربعات الحوار؟
- Dialog: نافذة صغيرة تظهر فوق النافذة الرئيسية.
- تُستخدم عادةً لعرض تنبيهات، أو للحصول على مدخلات من المستخدم، أو لتأكيد أو إلغاء أمر ما.
أنواع مربعات الحوار في PyQt
- QMessageBox: لعرض رسائل معلومات، تحذير، أو خطأ.
- QInputDialog: لطلب قيمة نصية أو رقمية من المستخدم.
- QFileDialog: لفتح أو حفظ الملفات.
- QColorDialog: لاختيار الألوان.
- QFontDialog: لاختيار الخطوط.
إنشاء Dialog باستخدام Designer
1-افتح Qt Designer.2- عند اختيار نوع الواجهة الجديدة، اختر Dialog without Buttons.
3- أضف عناصر مثل:
- QLabel لعرض النص.
- QLineEdit لإدخال قيمة.
- زرين (موافق – إلغاء).
4- احفظ الملف باسم:
dialog_sample.ui
الكود لفتح الـ Dialog
import sys
from PyQt5 import QtWidgets, uic
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
uic.loadUi("mainwindow.ui", self)
# ربط زر لفتح نافذة الحوار
self.pushButton.clicked.connect(self.open_dialog)
def open_dialog(self):
dialog = QtWidgets.QDialog()
uic.loadUi("dialog_sample.ui", dialog)
dialog.exec_()
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
النتيجة
- عند الضغط على زر "فتح الحوار"، ستظهر نافذة صغيرة (Dialog) مصممة في Qt Designer.
- يمكن أن تحتوي هذه النافذة على أي عناصر إدخال أو رسائل حسب رغبتك.
📌 التمرين
1-نافذة رئيسية تحتوي على زر بعنوان "إدخال بيانات".2-عند الضغط على الزر تظهر نافذة Dialog تحتوي على:
- حقل إدخال الاسم.
- حقل إدخال البريد الإلكتروني.
- زر "حفظ" يقوم بإغلاق النافذة بعد إدخال البيانات.
✅ الحل
1. تصميم النوافذ في Qt Designer
النافذة الرئيسية (mainwindow.ui):- أضف زر QPushButton بعنوان "إدخال بيانات".
- QLabel: "الاسم"
- QLineEdit: لإدخال الاسم (نسميه
lineEditName
) - QLabel: "البريد الإلكتروني"
- QLineEdit: لإدخال البريد (نسميه
lineEditEmail
) - QPushButton: "حفظ" (نسميه
btnSave
)
2. الكود بايثون
import sys
from PyQt5 import QtWidgets, uic
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
uic.loadUi("mainwindow.ui", self)
# ربط زر فتح نافذة الحوار
self.pushButton.clicked.connect(self.open_dialog)
def open_dialog(self):
dialog = DataDialog()
if dialog.exec_() == QtWidgets.QDialog.Accepted:
name, email = dialog.get_data()
QtWidgets.QMessageBox.information(self, "البيانات المدخلة", f"الاسم: {name}\nالبريد: {email}")
class DataDialog(QtWidgets.QDialog):
def __init__(self):
super().__init__()
uic.loadUi("dialog_sample.ui", self)
# ربط زر الحفظ
self.btnSave.clicked.connect(self.save_and_close)
def save_and_close(self):
self.accept() # إغلاق النافذة مع إرجاع Accepted
def get_data(self):
return self.lineEditName.text(), self.lineEditEmail.text()
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
🎯 النتيجة
- عند تشغيل البرنامج تظهر نافذة رئيسية بها زر "إدخال بيانات".
- عند الضغط على الزر يظهر Dialog لإدخال الاسم والبريد الإلكتروني.
- عند الضغط على زر "حفظ"، تُغلق النافذة ويظهر مربع رسالة يحتوي على البيانات المدخلة.
✅ النسخة المطورة — الحفظ التلقائي في Excel
1. المتطلبات
قبل البداية، لازم تثبّت مكتبة openpyxl إذا ما كانت موجودة:
pip install openpyxl
2. الكود بايثون
import sys
import os
from PyQt5 import QtWidgets, uic
from openpyxl import Workbook, load_workbook
EXCEL_FILE = "data.xlsx"
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
uic.loadUi("mainwindow.ui", self)
# ربط زر فتح نافذة الحوار
self.pushButton.clicked.connect(self.open_dialog)
def open_dialog(self):
dialog = DataDialog()
if dialog.exec_() == QtWidgets.QDialog.Accepted:
name, email = dialog.get_data()
self.save_to_excel(name, email)
QtWidgets.QMessageBox.information(self, "تم الحفظ", f"تم حفظ البيانات:\nالاسم: {name}\nالبريد: {email}")
def save_to_excel(self, name, email):
# إذا الملف غير موجود، ننشئه مع عناوين الأعمدة
if not os.path.exists(EXCEL_FILE):
workbook = Workbook()
sheet = workbook.active
sheet.title = "Users"
sheet.append(["الاسم", "البريد الإلكتروني"])
workbook.save(EXCEL_FILE)
# نفتح الملف ونضيف البيانات
workbook = load_workbook(EXCEL_FILE)
sheet = workbook.active
sheet.append([name, email])
workbook.save(EXCEL_FILE)
class DataDialog(QtWidgets.QDialog):
def __init__(self):
super().__init__()
uic.loadUi("dialog_sample.ui", self)
# ربط زر الحفظ
self.btnSave.clicked.connect(self.save_and_close)
def save_and_close(self):
if not self.lineEditName.text() or not self.lineEditEmail.text():
QtWidgets.QMessageBox.warning(self, "خطأ", "الرجاء إدخال جميع البيانات")
else:
self.accept() # إغلاق النافذة مع إرجاع Accepted
def get_data(self):
return self.lineEditName.text(), self.lineEditEmail.text()
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
🎯 النتيجة
عند إدخال الاسم والبريد في نافذة الـ Dialog والضغط على "حفظ"، يتم:- إغلاق النافذة.
- إضافة البيانات مباشرة داخل ملف data.xlsx.
- إظهار رسالة "تم الحفظ".
🔜 في الدرس الثامن سنتعلم كيف نضيف مربعات اختيار (Checkboxes) وأزرار التحديد (Radio Buttons) ونربطها بالأحداث.