🎯 الهدف من الدرس
في هذا الدرس سنتعلم:
- كيفية إنشاء نافذة رئيسية (Main Window).
- كيفية فتح نافذة ثانوية (Dialog / Child Window).
- تمرير البيانات من نافذة إلى أخرى.
- إغلاق النوافذ والتعامل مع العودة للنافذة السابقة.
📝 المثال التطبيقي
سننشئ تطبيق بسيط فيه:
- نافذة رئيسية فيها زر "فتح نافذة ثانية".
- النافذة الثانية تحتوي على حقل إدخال (QLineEdit) وزر "إرسال".
- عند كتابة نص في النافذة الثانية والضغط على إرسال، سيعود النص للنافذة الأولى ويُعرض في Label.
💻 الكود
import sys
from PyQt5.QtWidgets import (
QApplication, QMainWindow, QPushButton, QLabel,
QDialog, QVBoxLayout, QLineEdit, QWidget
)
# النافذة الثانوية
class SecondWindow(QDialog):
def __init__(self, parent=None):
super().__init__(parent)
self.setWindowTitle("النافذة الثانية")
self.setGeometry(300, 300, 300, 150)
layout = QVBoxLayout()
# إدخال النص
self.input_field = QLineEdit(self)
self.input_field.setPlaceholderText("اكتب شيئًا هنا...")
layout.addWidget(self.input_field)
# زر الإرسال
self.btn_send = QPushButton("إرسال", self)
self.btn_send.clicked.connect(self.send_data)
layout.addWidget(self.btn_send)
self.setLayout(layout)
def send_data(self):
text = self.input_field.text()
if text:
# إرسال النص للنافذة الرئيسية
self.parent().update_label(text)
self.close()
# النافذة الرئيسية
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("النافذة الرئيسية")
self.setGeometry(200, 200, 400, 200)
# الواجهة
self.central_widget = QWidget()
self.setCentralWidget(self.central_widget)
self.layout = QVBoxLayout(self.central_widget)
# Label لعرض البيانات
self.label = QLabel("لم يتم استلام بيانات بعد", self)
self.layout.addWidget(self.label)
# زر فتح النافذة الثانية
self.btn_open = QPushButton("فتح النافذة الثانية", self)
self.btn_open.clicked.connect(self.open_second_window)
self.layout.addWidget(self.btn_open)
def open_second_window(self):
self.second_window = SecondWindow(self)
self.second_window.exec_() # فتح كـ Dialog (ينتظر الإغلاق)
def update_label(self, text):
self.label.setText(f"النص المستلم: {text}")
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
✅ شرح الكود
1- أنشأنا نافذة رئيسية (MainWindow) فيها زر يفتح نافذة ثانية.2- النافذة الثانية (SecondWindow) تحتوي على إدخال نص وزر إرسال.
عند الضغط على "إرسال":
- يتم إرسال النص إلى النافذة الرئيسية عبر
update_label
. - يتم إغلاق النافذة الثانية.
📝 التمرين: إنشاء نافذة تسجيل دخول
المطلوب:
1- إنشاء نافذة تسجيل دخول تحتوي على:
- حقل اسم المستخدم (QLineEdit).
- حقل كلمة المرور (QLineEdit مع خاصية إخفاء النص).
- زر تسجيل الدخول.
2- إذا كانت البيانات صحيحة (مثلاً: اسم المستخدم = admin
وكلمة المرور = 1234
) → تفتح نافذة جديدة بعنوان "النافذة الرئيسية".
3- إذا كانت البيانات خاطئة → يظهر تنبيه (QMessageBox).
💻 الحل
import sys
from PyQt5.QtWidgets import (
QApplication, QMainWindow, QDialog, QLabel, QPushButton,
QLineEdit, QVBoxLayout, QWidget, QMessageBox
)
# النافذة الرئيسية بعد تسجيل الدخول
class MainApp(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("النافذة الرئيسية")
self.setGeometry(200, 200, 400, 200)
central_widget = QWidget()
self.setCentralWidget(central_widget)
layout = QVBoxLayout(central_widget)
label = QLabel("مرحبًا بك في التطبيق 🎉")
layout.addWidget(label)
# نافذة تسجيل الدخول
class LoginWindow(QDialog):
def __init__(self):
super().__init__()
self.setWindowTitle("تسجيل الدخول")
self.setGeometry(300, 300, 300, 150)
layout = QVBoxLayout()
# إدخال اسم المستخدم
self.username_input = QLineEdit(self)
self.username_input.setPlaceholderText("اسم المستخدم")
layout.addWidget(self.username_input)
# إدخال كلمة المرور
self.password_input = QLineEdit(self)
self.password_input.setPlaceholderText("كلمة المرور")
self.password_input.setEchoMode(QLineEdit.Password) # إخفاء النص
layout.addWidget(self.password_input)
# زر تسجيل الدخول
self.login_button = QPushButton("تسجيل الدخول", self)
self.login_button.clicked.connect(self.check_login)
layout.addWidget(self.login_button)
self.setLayout(layout)
def check_login(self):
username = self.username_input.text()
password = self.password_input.text()
if username == "admin" and password == "1234":
self.accept() # إغلاق نافذة تسجيل الدخول بنجاح
else:
QMessageBox.warning(self, "خطأ", "اسم المستخدم أو كلمة المرور غير صحيحة")
if __name__ == "__main__":
app = QApplication(sys.argv)
login = LoginWindow()
if login.exec_() == QDialog.Accepted:
window = MainApp()
window.show()
sys.exit(app.exec_())
✅ شرح الفكرة
1- نافذة تسجيل الدخول (LoginWindow):
- إذا كان الإدخال صحيح (
admin
/1234
) → يتم استدعاءself.accept()
لإغلاق النافذة بنجاح. - إذا كان خاطئ → يظهر
QMessageBox.warning
.
2- MainApp:
- نافذة رئيسية تظهر فقط إذا كان تسجيل الدخول ناجح.
3- في main
:
- يتم فتح نافذة تسجيل الدخول أولاً.
- إذا أغلق المستخدم النافذة بدون نجاح → التطبيق ينتهي.
- إذا كانت صحيحة → يتم فتح النافذة الرئيسية.