أداة QTableWidget في PyQt تسمح لك بإنشاء جداول بيانات داخل واجهة البرنامج لعرض البيانات على شكل صفوف وأعمدة، كما يمكنك تعديلها وإضافة الخلايا برمجيًا.
تستخدم بكثرة في برامج إدارة البيانات، أو الجداول المحاسبية، أو أي تطبيق يتطلب عرض بيانات بشكل منظم.
أهم الخصائص والوظائف
- setRowCount() – تحديد عدد الصفوف.
- setColumnCount() – تحديد عدد الأعمدة.
- setHorizontalHeaderLabels() – إضافة عناوين الأعمدة.
- setItem(row, col, QTableWidgetItem) – إضافة بيانات داخل الخلايا.
- item(row, col) – قراءة البيانات من الخلية.
- insertRow() / insertColumn() – إضافة صفوف أو أعمدة جديدة.
مثال عملي
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItem, QVBoxLayout, QWidget
class TableExample(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("مثال جدول البيانات - QTableWidget")
self.setGeometry(200, 200, 500, 300)
# إنشاء الجدول
self.table = QTableWidget()
self.table.setRowCount(3) # عدد الصفوف
self.table.setColumnCount(3) # عدد الأعمدة
self.table.setHorizontalHeaderLabels(["الاسم", "العمر", "المدينة"])
# إضافة بيانات
data = [
["أحمد", "25", "القاهرة"],
["منى", "30", "الإسكندرية"],
["سعيد", "28", "المنصورة"]
]
for row, rowData in enumerate(data):
for col, value in enumerate(rowData):
self.table.setItem(row, col, QTableWidgetItem(value))
# تصميم الواجهة
layout = QVBoxLayout()
layout.addWidget(self.table)
container = QWidget()
container.setLayout(layout)
self.setCentralWidget(container)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = TableExample()
window.show()
sys.exit(app.exec_())
شرح الكود
- قمنا بإنشاء QTableWidget مع 3 صفوف و3 أعمدة.
- أضفنا عناوين الأعمدة باستخدام setHorizontalHeaderLabels.
- ملأنا الخلايا باستخدام setItem مع QTableWidgetItem.
تمرين: إنشاء جدول بيانات مع إمكانية الإضافة
المطلوب:
- أنشئ واجهة تحتوي على جدول بيانات بثلاثة أعمدة: "الاسم" – "العمر" – "المدينة".
- أضف ثلاث صفوف بيانات افتراضية.
- ضع أزرارًا أسفل الجدول:
- زر "إضافة صف" لإضافة صف جديد فارغ.
- زر "قراءة البيانات" لعرض جميع البيانات الموجودة في الجدول في نافذة منبثقة (QMessageBox).
الحل
import sys
from PyQt5.QtWidgets import (
QApplication, QMainWindow, QTableWidget, QTableWidgetItem,
QVBoxLayout, QWidget, QPushButton, QHBoxLayout, QMessageBox
)
class TableExercise(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("تمرين QTableWidget")
self.setGeometry(200, 200, 600, 400)
# إنشاء الجدول
self.table = QTableWidget()
self.table.setColumnCount(3)
self.table.setHorizontalHeaderLabels(["الاسم", "العمر", "المدينة"])
# بيانات افتراضية
data = [
["أحمد", "25", "القاهرة"],
["منى", "30", "الإسكندرية"],
["سعيد", "28", "المنصورة"]
]
self.table.setRowCount(len(data))
for row, rowData in enumerate(data):
for col, value in enumerate(rowData):
self.table.setItem(row, col, QTableWidgetItem(value))
# الأزرار
btn_add = QPushButton("إضافة صف")
btn_read = QPushButton("قراءة البيانات")
btn_add.clicked.connect(self.add_row)
btn_read.clicked.connect(self.read_data)
# تصميم الأزرار
button_layout = QHBoxLayout()
button_layout.addWidget(btn_add)
button_layout.addWidget(btn_read)
# تصميم الواجهة
layout = QVBoxLayout()
layout.addWidget(self.table)
layout.addLayout(button_layout)
container = QWidget()
container.setLayout(layout)
self.setCentralWidget(container)
def add_row(self):
"""إضافة صف جديد فارغ في الجدول"""
row_count = self.table.rowCount()
self.table.insertRow(row_count)
def read_data(self):
"""قراءة البيانات من الجدول وعرضها"""
rows = self.table.rowCount()
cols = self.table.columnCount()
all_data = ""
for row in range(rows):
row_data = []
for col in range(cols):
item = self.table.item(row, col)
if item:
row_data.append(item.text())
else:
row_data.append("")
all_data += " | ".join(row_data) + "\n"
QMessageBox.information(self, "بيانات الجدول", all_data)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = TableExercise()
window.show()
sys.exit(app.exec_())
شرح التمرين
- أضفنا زر لإضافة صف جديد فارغ باستخدام
insertRow
. - أضفنا زر لقراءة البيانات من جميع الخلايا وعرضها في
QMessageBox
. - يمكن للمستخدم تعديل الخلايا يدويًا بعد الإضافة.