تقنيات نور التعليمية تقنيات نور التعليمية
في الوقت الحالي

جاري صيانة و تحديث للمدونة

في الوقت الحالي
جاري التحميل ...

الدرس 18: إدارة المستخدمين (إضافة – تعديل – حذف) في واجهة المسؤول

📌 الفكرة

في هذا الدرس هنطوّر واجهة المسؤول (Admin UI) بحيث يقدر:

  1. عرض جميع المستخدمين في جدول.
  2. إضافة مستخدم جديد.
  3. تعديل بيانات مستخدم موجود.
  4. حذف مستخدم.

كل هذا مع ربط مباشر بقاعدة بيانات SQLite.

Admin UI

🖌️ خطوات التصميم في Qt Designer

1- افتح admin.ui في Qt Designer.

2- أضف العناصر التالية:

  • QTableWidget (لعرض المستخدمين).
  • QLineEdit لإدخال اسم المستخدم الجديد.
  • QLineEdit لإدخال كلمة المرور.
  • QComboBox لاختيار الدور (Admin / User).

3 - أزرار:

  • "إضافة مستخدم"
  • "تعديل مستخدم"
  • "حذف مستخدم"

4- احفظ التعديلات.

💻 الكود

import sys
import sqlite3
from PyQt5 import uic
from PyQt5.QtWidgets import (
    QApplication, QMainWindow, QMessageBox, QTableWidgetItem
)


class AdminWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        uic.loadUi("admin.ui", self)

        # ربط العناصر
        self.table = self.findChild(type(self.findChild(object, "QTableWidget")), "usersTable")
        self.username_input = self.findChild(type(self.findChild(object, "QLineEdit")), "usernameLineEdit")
        self.password_input = self.findChild(type(self.findChild(object, "QLineEdit")), "passwordLineEdit")
        self.role_combo = self.findChild(type(self.findChild(object, "QComboBox")), "roleComboBox")

        self.add_button = self.findChild(type(self.findChild(object, "QPushButton")), "addButton")
        self.edit_button = self.findChild(type(self.findChild(object, "QPushButton")), "editButton")
        self.delete_button = self.findChild(type(self.findChild(object, "QPushButton")), "deleteButton")

        # ربط الأزرار بالدوال
        self.add_button.clicked.connect(self.add_user)
        self.edit_button.clicked.connect(self.edit_user)
        self.delete_button.clicked.connect(self.delete_user)

        # تحميل المستخدمين عند بدء التشغيل
        self.load_users()

    def load_users(self):
        """تحميل المستخدمين من قاعدة البيانات وعرضهم في الجدول"""
        conn = sqlite3.connect("users.db")
        cursor = conn.cursor()
        cursor.execute("SELECT id, username, role FROM users")
        users = cursor.fetchall()
        conn.close()

        self.table.setRowCount(0)
        for row_number, row_data in enumerate(users):
            self.table.insertRow(row_number)
            for column_number, data in enumerate(row_data):
                self.table.setItem(row_number, column_number, QTableWidgetItem(str(data)))

    def add_user(self):
        username = self.username_input.text()
        password = self.password_input.text()
        role = self.role_combo.currentText()

        if not username or not password:
            QMessageBox.warning(self, "خطأ", "يرجى إدخال جميع البيانات")
            return

        try:
            conn = sqlite3.connect("users.db")
            cursor = conn.cursor()
            cursor.execute("INSERT INTO users (username, password, role) VALUES (?, ?, ?)",
                           (username, password, role))
            conn.commit()
            conn.close()
            QMessageBox.information(self, "نجاح", "تمت إضافة المستخدم بنجاح")
            self.load_users()
        except sqlite3.IntegrityError:
            QMessageBox.warning(self, "خطأ", "اسم المستخدم موجود بالفعل")

    def edit_user(self):
        selected_row = self.table.currentRow()
        if selected_row == -1:
            QMessageBox.warning(self, "خطأ", "يرجى اختيار مستخدم للتعديل")
            return

        user_id = self.table.item(selected_row, 0).text()
        username = self.username_input.text()
        password = self.password_input.text()
        role = self.role_combo.currentText()

        conn = sqlite3.connect("users.db")
        cursor = conn.cursor()
        if password:  # تعديل مع كلمة المرور
            cursor.execute("UPDATE users SET username=?, password=?, role=? WHERE id=?",
                           (username, password, role, user_id))
        else:  # تعديل بدون تغيير كلمة المرور
            cursor.execute("UPDATE users SET username=?, role=? WHERE id=?",
                           (username, role, user_id))
        conn.commit()
        conn.close()

        QMessageBox.information(self, "نجاح", "تم تعديل بيانات المستخدم")
        self.load_users()

    def delete_user(self):
        selected_row = self.table.currentRow()
        if selected_row == -1:
            QMessageBox.warning(self, "خطأ", "يرجى اختيار مستخدم للحذف")
            return

        user_id = self.table.item(selected_row, 0).text()

        conn = sqlite3.connect("users.db")
        cursor = conn.cursor()
        cursor.execute("DELETE FROM users WHERE id=?", (user_id,))
        conn.commit()
        conn.close()

        QMessageBox.information(self, "نجاح", "تم حذف المستخدم")
        self.load_users()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = AdminWindow()
    window.show()
    sys.exit(app.exec_())

✅ شرح

  • الجدول QTableWidget يعرض المستخدمين مع الأعمدة (ID – اسم المستخدم – الدور).
  • عند إدخال البيانات والضغط على إضافة → يضاف المستخدم لقاعدة البيانات.
  • عند تحديد مستخدم من الجدول → يمكن تعديله أو حذفه.
  • النظام مرتبط مباشرة بـ users.db من الدرس السابق.


📌 بهذا أصبح عندك واجهة إدارة مستخدمين كاملة في PyQt Designer.

عن الكاتب

Tamer Ahmed

التعليقات


اتصل بنا

إذا أعجبك محتوى مدونتنا نتمنى البقاء على تواصل دائم ، فقط قم بإدخال بريدك الإلكتروني للإشتراك في بريد المدونة السريع ليصلك جديد المدونة أولاً بأول ، كما يمكنك إرسال رساله بالضغط على الزر المجاور ...

جميع الحقوق محفوظة

تقنيات نور التعليمية