الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

أرجو المساعدة في كيفية ربط قاعدة البيانات ب QTreeWidget

بدأه محمـد عواد في 15 فبراير 2010 · 3 رد · 1,029 مشاهدة · في قسم Cross Platform GUI Libraries العام
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

أرجو المساعدة في كيفية ربط قاعدة البيانات بـ QTreeWidget

فقد قمت بإنشاء قاعدة بينات من نوع SQLITE تتكون من جدولين

احد الجدولين به عمود يحتوي على أسماء العناصر الرئيسية

والجدول الثاني به عمود يحتوي على العناصر الفرعية

ويتم ربط بعض العناصر الفرعية بأحد العناصر الرئيسية عن طريق relationaltablemodel

ونكرر ذلك الترابط بين كل عنصر رئيسي ومجموعة من العناصر الفرعية

وأريد أن أعرض كل العناصر الرئيسية والفرعية في شكل شجرة منطقية عن طريق TreeWidget

الأمثلة التي وجدتها مرفقة مع Qt تتكلم عن ربط ملفات xml بالـ TreeWidget

حاولت استخدام QDataWidgetMapp وربطها بالـ model

لكن الذي فهمته من خلال المطالعة أنه لابد من وجود العناصر في قائمة QList أو QString

حاولت استخدام الدوال QtreeWidgetItem و insertChild فلم أفلح أيضا

الموضوع اتخلبط معاي وتعبت كثيرا ولم أعرف كيف ابني هذا الكود

فلو أمكن الحصول على مثال متكامل فأكون لكم من الشاكرين

وإن لم يكن المثال موجودا فأرجو شرح ذلك بشيء من التفصيل

وإلا فأرجو إرشادي إلى الخطوط العريضة التي أحاول بناء الكود تحت ضوئها

وجزاكم الله عنا خير الجزاء

تم تعديل هذه المشاركة بواسطة محمـد عواد في 15 فبراير 2010 في 12:51

#2

الآن أقوم بدراسة الفئة QAbstractItemModel

فقد فهمت أنها الأساس في عرض البيانات في شكل سلسلة هرمية

وما زلت انتظر مساعدتكم

بارك الله فيكم جميعا

#3

وعليكم السلام ورحمة الله وبركاته ،

اقتباس
فقد قمت بإنشاء قاعدة بينات من نوع SQLITE تتكون من جدولين

احد الجدولين به عمود يحتوي على أسماء العناصر الرئيسية

والجدول الثاني به عمود يحتوي على العناصر الفرعية

ويتم ربط بعض العناصر الفرعية بأحد العناصر الرئيسية عن طريق relationaltablemodel

ونكرر ذلك الترابط بين كل عنصر رئيسي ومجموعة من العناصر الفرعية

لماذا لا تستخدم QTableView اذا ؟

هنا ستجد مثال للتوضيح باستخدام QTableView

http://qt-ar.org/community/viewtopic.php?f=15&t=123

وأريد أن أعرض كل العناصر الرئيسية والفرعية في شكل شجرة منطقية عن طريق TreeWidget

هل هذا يعني أن العناصر الرئيسة ستكون parent للعناصر الفرعية ؟

اذا كان نعم فما الحاجة لاستخدام ال QSqlRelationalTableModel؟

انظر هذا المثال:

post-60254-12666263957251_thumb.png

يوجد جدولين ، الاول للموظفين ويحوي معلوماتهم والفرع الذي يعمل به الموظف.

والجدول الثاني هو جدول الفروع ويحوي معلومات عن الفرع وبيانات الاتصال به.

جدول الفروع في هذه الحالة سيكون هو الرئيسي وجدول الموظفين هو الفرعي .

لذلك ظهر في الصورة السابقة الفروع ك parents ، وتحت كل فرع ظهر الموظف الذي يعمل فيه.

اذا كان هذا ما تريده فلن تحتاج الى QSqlRelationalTableModel ولا QDataWidgetMapper .

وهذا كود يوضح الفكرة

#include <QtGui>
#include <QtSql>

int main(int argc,char* argv[])
{
    QApplication app(argc,argv);

    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName("localhost");
    db.setDatabaseName("tst");
    db.setUserName("root");
    db.setPassword("");

    if (!db.open()) {
        QMessageBox::warning(0,"Error",QString("Cannot connect to MySQL:\n%1").arg(db.lastError().text()));
		return 0;
    }

هنا تم الاتصال مع قاعدة MySQL ، ويمكنك الاتصال مع SQLite .

وبخصوص QSqlRelationalTableModel فسابقا كانت لا تعمل مع SQLite بسبب ان الاخيرة كانت لا تدعم الحقل الغريب Foreign Key ، لكن في الاصدارات الحديثة أصبحت تدعمها .(نسخ SQLite الموجودة مع اصدارات كيوتي القديمة < Qt 4.6 لا تدعم الحقل الغريب).

    QSqlQuery query;

    //query.exec("PRAGMA foreign_keys = ON;");  // with SQLITE.

    query.exec("create table Branches(NO varchar(5) PRIMARY KEY,name varchar(10),address varchar(10),fax varchar(10))");
    query.exec("insert into Branches values('1', 'Sudan', 'Khartoum', '0999')");
    query.exec("insert into Branches values('2', 'KSA', 'Jeddah', '-')");
    query.exec("insert into Branches values('3', 'Syria', 'aleppo', '535')");

    query.exec("CREATE TABLE Employees(ID varchar(5) PRIMARY KEY,name varchar(10),salary int,mobile varchar(10),NO varchar(5) not null,foreign key (NO) references Branches(NO))");
    query.exec("insert into Employees values('99-1', 'Ahmad', '2000', '25255560', '1')");
    query.exec("insert into Employees values('99-2', 'Mohammed', '3000', '0555555', '2')");
    query.exec("insert into Employees values('99-3', 'Saleh', '6000', '07575', '2')");
    query.exec("insert into Employees values('99-4', 'Ali', '1000', '8686', '3')");

انشاء القاعدة وبعض السجلات.

لاحظ السطر الثاني وهو ضروري لدعم الحقل الغريب في حالة استخدام SQLite حيث أن الوضع الافتراضي لها هو disable لاغراض التوافقية.

	QTreeWidget treeWidget;
	treeWidget.setColumnCount(4);

	QStringList header;
	header << "ID" << "Name" << "Salary" << "Mobile" ;
	treeWidget.setHeaderLabels(header);

	QList<QPair<QString,QString> > branches;		// hold all branches (number and name).

	query.exec("select No,name from Branches");

	while(query.next()) {
		QString no = query.value(0).toString();
		QString name = query.value(1).toString();

		branches << QPair<QString,QString> (no,name);
	}

هنا تم انشاء الشجرة باربع أعمدة، ومن ثم قراءة بيانات الفروع من قاعدة البيانات وحفظها في القائمة branches

QPair<QString,QString> p;

	foreach(p,branches) {

		QTreeWidgetItem* item = new QTreeWidgetItem(&treeWidget,QStringList() <<p.second);
		item->setBackground(0,QBrush(Qt::gray));
		treeWidget.addTopLevelItem(item);

		QList<QTreeWidgetItem*> childs;

		query.prepare("select * from Employees where NO=?");
		query.addBindValue(p.first);
		query.exec();

		while(query.next()) {
			QStringList str;
			str << query.value(0).toString();
			str << query.value(1).toString();
			str << query.value(2).toString();
			str << query.value(3).toString();

			childs << new QTreeWidgetItem(item,str);
		}

		item->addChildren(childs);

		childs.clear();
	}

هنا تم المرور على كل الفروع واحد تلو الاخر ، وفي كل تكرار يتم اضافة كل ابناء هذا الفرع (كل الموظفين الذين يعملون في الفرع).

	treeWidget.show();	

    return app.exec();

}

النهاية :)

الكود في المرفق

main.rar

وأي سؤال يرحب به.

الى اللقاء.

2
#4

جاري قراءة الرد

واشكرك مقدما

وأسأل الله أن يتقبل منك ويجزيك خير الجزاء

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…