اد و تحضيــر إعدلبنــــــا / أحمـد ا م كيـــــــــــــــوت أساسيـــــــاتلغويــةراجعــة ال احمـد الدسوقــى ا / م

Qt in Arabic

  • Upload
    pic2007

  • View
    97

  • Download
    11

Embed Size (px)

Citation preview

Page 1: Qt in Arabic

إعداد و تحضيــر

م / أحمـد البنــــــا

Qtأساسيـــــــاتكيـــــــــــــــوت

املراجعــة اللغويــة

ا / محمـد الدسوقــى

Page 2: Qt in Arabic

1

بسم الله الرحمن الرحيم

اقرأ باسم ربك الذي خلق )١( خلق النسان من علق )٢( اقرأ وربك

الكرم )٣( الذي علم بالقلم )٤( علم النسان ما لم يعلم )٥(سورة العلق

Page 3: Qt in Arabic

2

مقدمــــــــــــــــة

كيوت هى بنية تطوير عرب النظم ) Cross-Platform ( لصناعة وتطوير الربامج ذات مثل تشغيل نظام من أكرث عىل تشغيلها ميكن النظم متعددة أداة وهي الرسومية، الواجهة

األجهزة أنظمه وبعض ،) Linux ( ولينوكس ،) Mac OSX ( وماك ،) windows ويندوز)

،)Windows Mobile( ويندوز موبايل ،) Symbian ( املحموله مثل أنظمة أجهزة نوكيا سيمبيان

.) Embedded Linux ( واميبيدد لينوكس

وبشكل أساىس تعتمد كيوت ىف برمجتها عيل لغة يس++ ، حيث أن جميع فصائل كيوت

التطبيق مكتوبة باليس ++ ،وتأىت ميزة تعدد النظم كأداة تيرس عىل املربمج أو املطور تشغيل

عىل أكرث من نظام، وهذا ما يعطيه فرصة جيدة ىف تقليل تكلفة التشغيل وزيادة قاعدة التسويق

للتطبيق، حيث يتم كتابة الكود مرة واحدة ثم ترجمته ) Compiling ( عىل أى نظام تشغيل

بدون الحاجة إىل تعديل، وكلام تبحر املربمج داخل كيوت سوف يكتشف مدى قابلية هذه األداة

للتطوير والهيكلة عىل حسب ما يريده .

ما الهدف من كيوت ؟

الهدف الرئيىس هو إمكانية بناء تطبيق عابر للنظم بكتابة الكود مرة واحدة وتشغيله

عىل أى نظام.

فكرة و محتوى هذا الكتاب :

هذا الكتاب يتم التعامل معه عىل أساس أنه أداة تعليميه ذات منهج متسلسل يسهل

عىل الدارس التعامل معه والتعلم منه، ويجب مالحظة أن هذا الكتاب ال يعترب مرجع شامل أو

كامل لكيوت، ألن أداة املساعدة من كيوت هى بالفعل مرجع كامل وشامل، ولكن كيف تبدأ وما

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

وقت ممكن، هذا ما سوف نتناوله بالدراسة ىف هذا الكتاب.

مقدمــــــة

Page 4: Qt in Arabic

3

ملاذا هذا الكتاب؟

نظرا إلستحواذ رشكة مايكروسوفت وهيمنة تطبيقاتها عىل معظم السوق العربية،

ونظرا لرؤيتنا أن كيوت هى إحدى وسائل الخالص من هذه الهيمنة،

ونظرا لعدم وجود كتاب أو رشح واىف لهذه األداة باللغة العربية،

فقد قمنا بإعداد هذا الكتاب والذى يعترب مبثابة البوابة الرئيسية للدخول إىل عامل كيوت،

والذى يتناول بداخله التعريف باملبادىء األساسية التى قامت عليها كيوت، كام سيتم أيضا رشح

جميع إمكانيات كيوت رشحا يسريا مع أمثلة بسيطة .

ماذا بعد الكتاب؟

عند اإلنتهاء من هذا الكتاب سوف تكون قادرا عىل بدأ الربمجة املحرتفة بإستخدام كيوت،

وسيتكون لديك اإلحساس املطلوب ىك تستطيع التعامل بسالسة مع الجديد من إصدارات كيوت

أو مع املشاكل التى قد تواجهك.

تذكر أن هناك أكرث من طريق للوصول إىل املطلوب بالربمجة، ولكن هناك دامئا الطريق

األفضل أو األمثل، وهذا ما سرناه كثريا داخل كيوت.

ما يتطلب للدخول إىل عامل كيوت :

C++ Object Oriented Programming معرفه جيدة بـ

الحصول عىل Qt Nokia SDK Software ) مرفق مع هذا الكتاب (

................................................................................

مقدمــــــة

Page 5: Qt in Arabic

4

فهرس الكتاب

2مقدمة ..............................................................................................................

8بنية وتكوين كيوت .............................................................................................

............... ) QtCore Module ( 9وحدة الفصائل الساسية غري الرسومية

............................................................................................ QDebug فصيلة 12

........................................................................................ QBitArray فصيلة 14

..................................................................................... QByteArray 17 فصيلة

............................................................................................. QString 20 فصيلة

...................................................... ) Container Classes ( الفصائل الحاوية 23

..................................................................................... QList فصيلة 24

................................................................................ QVector فصيلة 27

................................................................................ QQueue فصيلة 28

.................................................................................. QStack فصيلة 30

.......................................................................... QStringList فصيلة 32

...................................................................................... QSet فصيلة 34

.................................................................................... QMap فصيلة 36

.......................................................................... QMultiMap فصيلة 39

.............................................................. ) Iterator Classes ( فصائل التكرار 41

.......................................................................... Java Style Iterator 43

.......................................................................... STL Style Iterator 44

........................................................................... foreach Keyword 50

................................................................................................. QDir فصيلة 52

.......................................................................................... QFileInfo فصيلة 53

................................................................................................. QFile فصيلة 56

.................................................................................... QTextStream فصيلة 58

................................................................................... QDataStream فصيلة 60

.......................................................................................... QVariant فصيلة 62

........................................................................................... QObject فصيلة 65

الفهــــــرس

Page 6: Qt in Arabic

5

فهرس الكتاب

........... ) QtGui Module ( 83وحدة مكونات واجهة املستخدم الرسومية

........................................................................................... QWidget فصيلة 86

........................................................................................... QPainter فصيلة 103

............................................................................................ QDialog فصيلة 104

............................................................................... QMainWindow فصيلة 108

..................................................... ) Layout Managment ( إدارة التخطيط 113

...................................................... ) Drag and Drop ( السحب و السقاط 121

.................................................... ) Model / View ( عرض البيانات - طريقة 131

عرض البيانات كقامئة .......................................................................... 138

عرض البيانات داخل جدول ................................................................. 141

عرض البيانات عىل شكل شجرى .......................................................... 144

....................................... ) Graphics View Framework ( الرسم ىف كيوت 149

.................................................................. QGraphicsScene فصيلة 152

................................................................... QGraphicsView فصيلة 153

.................................................................... QGraphicsItem فصيلة 154

............................................. ) Animation Gui ( واجهة املستخدم املتحركة 161

......................... ) QNetwork Module ( 169وحدة فصائل برمجة الشبكات

................................................................................. QHostAddress فصيلة 172

........................................................................................ QHostInfo فصيلة 173

...................................................................................... QTcpServer فصيلة 177

...................................................................................... QTcpSocket فصيلة 187

.................................................................................... QUdpSocket فصيلة 195

................. ) QtSql Module( 205وحدة فصائل التعامل مع قواعد البيانات

............................ ) Multithreaded Programming ( 217الربمجة املوازية

................................................................................

الفهــــــرس

Page 7: Qt in Arabic

6

فهرس امللحقات

امللحقـــــــات .................................... ) Memory Managment ( إدارة الذاكرة ) ملحق ) 1 228

......................................................... C++ ملحق ) 2 ( هيكل بنية الفصائل ىف 229

ملحق ) 3 ( كيفية تنصيب كيوت .................................................................... 231

................................ QtCreator ملحق ) 4 ( كيفية بدء تطبيق بواسطة األداة 235

................................................... QObject ملحق ) 5 ( مناذج فارغة لفصائل 236

................................................................................

الفهــــــرس

Page 8: Qt in Arabic

7

فهرس األمثلة

EX:NoPageExamples NameEX:NoPageExamples NameEX_27116Layout ExampleEX_113QDebug Example

EX_28125Drag_Drop ExampleEX_215QBitArray Example

EX_29138ListView ExampleEX_318QByteArray Example

EX_30141TableView ExampleEX_421QString Example

EX_31144TreeView ExampleEX_525QList Example

EX_32155Graphics ExampleEX_627QVector Example

EX_33164Animation GUI ExampleEX_729QQueue Example

EX_34174QHostInfo ExampleEX_831QStack Example

EX_34174QHostAddress ExampleEX_933QStringList Example

EX_35179QTcpServer ExampleEX_1035QSet Example

EX_36189QTcpSocket ExampleEX_1137QMap Example

EX_37196QUdpSender ExampleEX_1240QMultiMap Example

EX_38200QUdpReceiver ExampleEX_1346Java_Iterator Example

EX_39211Databse ExampleEX_1448STL_Iterator Example

EX_40222QThread ExampleEX_1550foreach Example

EX_1654QFileInfo Example

EX_1757QFile Example

EX_1858QTextStream Example

EX_1960QDataStream Example

EX_2062QVariant Example

EX_2173QObject Example

EX_2287QWidget Example

EX_2394Car GUI Example

EX_24101QPainter Example

EX_25105QDialog Example

EX_26109QMainWindow Example

الفهــــــرس

Page 9: Qt in Arabic

8

بنية وتكوين كيوتتتكون كيوت من مجموعه من الوحدات ) Modules (، وهذه الوحدات صممت للتعامل

) Classes ( مع معظم أنواع التطبيقات، ويندرج تحت كل وحدة مجموعة كبرية من الفصائل

لخدمة متطلبات هذه الوحدة.

ونوضح هذه الوحدات ) Modules ( ىف الجدول التاىل:

الوظيفـــــــــــــــــــــــــــــــــــة Module

وحدات لتطوير التطبيقات العامة

وحدة الفصائل األساسية الغري رسومية. QtCore

. GUI وحدة مكونات واجهة املستخدم الرسومية QtGui

.MultiMedia وحدة الفصائل الخاصة بوظائف الوسائط املتعددة QtMultimedia

وحدة فصائل برمجة الشبكات. QtNetwork

.OpenGL وحدة فصائل دعم QtOpenGL

.OpenVG وحدة فصائل دعم QtOpenVG

.Qt Scripts وحدة فصائل تقييم وثائق كيوت QtScript

.DataBases وحدة الفصائل الخاصة بالتعامل مع قواعد البيانات QtSql

.SVG وحدة فصائل لعرض محتوى ملفات ال QtSvg

.Web content وحدة فصائل لعرض وتحرير محتوى صفحات الويب QtWebKit

.XML وحدة فصائل للتعامل مع ملفات QtXml

وحدة فصائل للتعامل مع الوسائط املتعددة. Phonon

Windows OS وحدات خاصة بتطبيقات نظام ويندوز

.Windows ActiveX Control وحدة للتحكم ب QAxContainer

.Windows ActiveX ل Server وحدة لكتابة خادم QAxServer

UNIX OS وحدات خاصة بتطبيقات نظام يونكس

.Inter-Process Communication وحدة الفصائل الخاصة ب QtDBus

كيف نستخدم هذه الوحدات السابقة ؟ وما هى الوحدات التى يحتاجها املربمج لتطبيقه؟

مثال : ما هى الوحدات املطلوبة إلنشاء تطبيق ذو واجهة رسومية و يتعامل مع قواعد البيانات و الشبكات؟

.QtNetwork Module , QtSql Module , QtGui Module : الوحدات املطلوبة

بنية وتكوين كيوت

Page 10: Qt in Arabic

9

QtCore Module

وحدة

الفصائل الساسية

غري الرسومية

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 11: Qt in Arabic

10

إدراج

#include <QtCore>

داخل ملفات الكود

متطلبات هذه الوحدة

إدراج

QT += core

. project.pro داخل ملف املرشوعQtCore Module وحدة الفصائل األساسية غري الرسومية

Page 12: Qt in Arabic

11

،) Qt Modules ( تعترب وحدة الفصائل األساسية الغري رسومية واحدة من أهم وحدات كيوت

حيث تحتوى عىل معظم الفصائل الالزمة للبنية التحتية ألى تطبيق.

أمثلة الفصائل األساسية الغري رسومية :

فصائل معالجة البيانات:

هى فصائل تتعامل مع النصوص و تحوى البيانات ويتم التعديل فيها وتحويلها من صيغة

ألخرى.

فصائل التعامل مع امللفات:

هى فصائل تتعامل مع امللفات من حيث اإلنشاء والفتح واإلغالق بجانب كتابة و قراءة

البيانات من امللفات.

:QObject فصيلة

هى تعترب أهم فصيلة ىف كيوت بل هى ما متيز كيوت.

................................................................................

وسوف نقوم اآلن بعرض مجموعة من أهم فصائل كيوت وبعض تطبيقات عليها.

ملحوظة :

إذا كنت تستخدم كيوت ألول مرة فيجب عليك أوال اإلطالع عىل اآلىت:

- امللحق رقم ) 3 ( : كيفية تنصيب كيوت صــ 223.

- امللحق رقم ) 4 ( : كيفية بدء تطبيق بواسطة األداة QtCreator صــ 227.

................................................................................

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 13: Qt in Arabic

12

نسب الفصيلة :

فصيلة مستقلة

تعريف الفصيلة :

.) Console ( هى فصيلة تستخدم إلخراج البيانات إىل ملف أو وحدة أو شاشة العرض

: ) Declaration ( طريقة العـــالن

يتم شحن البيانات املراد إخراجها كالتاىل :

qDebug)“ Value To Print ”(;

أو

qDebug)( << ”value = “ << 10;

وظائف الفصيلة :

يتم مترير البيانات إىل qDebug عن طريق العامل ) << ( كام ىف طريقة الشحن الثانية

و نذكر بأنه ميكن مترير أى بيانات إىل qDebug سواء كانت تلك البيانات نصية أو رقمية .

وتعترب qDebug من الفصائل الهامة، وذلك إلستخدامها أثناء كتابة الكود للتأكد من صحة البيانات

املراد التعامل معها.

................................................................................

QDebug Class

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 14: Qt in Arabic

13

#include >QtCore>

int main)(

{

qDebug) “Hi Qt Developers !” ( ;

qDebug)( >> “Hi Qt Developers !! again” ;

qDebug)( >> ”10+20 = “ >> 10+20 ;

}

QDebug Example

رشح الكود السابق :

) Console ( مخرجات هذا الكود تظهر عىل الشاشة

qDebug) “Hi Qt Developers !” (;

) Console ( إىل الشاشة Hi Qt Developers ! طباعة

qDebug)( >> “Hi Qt Developers !! again”;

. Hi Qt Developers !! again طباعة

qDebug)( >> ”10+20 = “ >> 10+20;

طباعة 10+20 = 30 .

................................................................................

EXAmpleNO 1

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 15: Qt in Arabic

14

نسب الفصيلة :

فصيلة مستقلة

تعريف الفصيلة :

هى فصيلة تقوم بإنشاء مصفوفة عنارصها من نوع البت ) Bits (،حيث كل عنرص يحتوى

.True or False 0،1 عىل أحد القيمتني

: ) Declaration ( طريقة العـــالن

يتم اإلعالن عن املصفوفة بأكرث من طريقة منها:

QBitArray x)8(;

تم اإلعالن عن املتغري x إلدارة مصفوفة حجمها 8 عنارص من نوع البت ) Bits (، ويشحن كل

عنرص بالقيمة 0 أو False كقيمة إفرتاضية، وميكن إنشاء مصفوفة تشحن عنارصها بالقيمة 1 أو

True كقيمة إبتدائية إذا تم اإلعالن عن املصفوفة بالطريقة التالية:

QBitArray x)8,true(;

وظائف الفصيلة :

مثال عىل الدالتني isNull , isEmpty لتوضيح الفرق بينهام :

QBitArray x;

x.isNull)( ---> will return true.

x.isEmpty)( ---> will return true.

QBitArray x)0(;

x.isNull)( ---> will return false.

x.isEmpty)( ---> will return true.

الوظيفــــــــــــــــــــــــةالدالــــــة

at)int x(.true or false إذا كانت x تقوم الدالة بإرجاع قيمة العنرص

isNull)(.إذا أعلنت املصفوفة دون أى عنارص true ترجع القيمة

isEmpty)(.0 إذا كانت عدد عنارص املصفوفة true ترجع القيمة

setBit)int x(.true القيمة x تحول قيمة العنرص رقم

setBit)int x, bool t(.true or false ميكن أن تكون t حيث t القيمة x تحول قيمة العنرص رقم

QBitArray Class

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 16: Qt in Arabic

15

#include >QtCore>

int main)(

{

QBitArray x) 8 (;

QBitArray y) 8 , true (;

QBitArray r) 8 (;

x.setBit) 0 (;

x.setBit) 1 (;

x.setBit) 2 (;

x.setBit) 3 (;

x.setBit) 4 (;

y.setBit) 0 , false (;

y.setBit) 1 , false (;

y.setBit) 2 , false (;

r = x & y;

r = x | y;

r = x ^ y;

r = ~x;

r = y;

}

QBitArray Example

رشح الكود السابق :

QBitArray x) 8(;

اإلعالن عن املتغري x إلدارة مصفوفة حجم 8 بت

QBitArray y) 8 , true (;

اإلعالن عن املتغري y إلدارة مصفوفة حجم 8 بت

QBitArray r) 8 (;

اإلعالن عن املتغري r إلدارة مصفوفة حجم 8 بت

x.setBit) 0 (;

True إىل القيمة x تحول العنرص رقم 0 مصفوفة

x.setBit) 1 (;

True إىل القيمة x تحول العنرص رقم 1 مصفوفة

0 | 0 | 0 | 0 | 0 | 0 | 0 | 0

1 | 1 | 1 | 1 | 1 | 1 | 1 | 1

0 | 0 | 0 | 0 | 0 | 0 | 0 | 0

1 | 0 | 0 | 0 | 0 | 0 | 0 | 0

1 | 1 | 0 | 0 | 0 | 0 | 0 | 0

EXAmpleNO 2

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 17: Qt in Arabic

16

x.setBit) 2 (;

True إىل القيمة x تحول العنرص رقم 2 مصفوفة

x.setBit) 3 (;

True إىل القيمة x تحول العنرص رقم 3 مصفوفة

x.setBit) 4 (;

True إىل القيمة x تحول العنرص رقم 4 مصفوفة

y.setBit) 0 , false (;

False إىل القيمة y تحول العنرص رقم 0 مصفوفة

y.setBit) 1 , false (;

False إىل القيمة y تحول العنرص رقم 1 مصفوفة

y.setBit) 2 , false (;

False إىل القيمة y تحول العنرص رقم 2 مصفوفة

اآلن أصبحت املصفوفتني x , y كاآلىت:

Y X

r = x & y; >-- AND Operator

= r املصفوفة

r = x | y; >-- OR Operator

= r املصفوفة

r = x ^ y; >-- XOR Operator

= r املصفوفة

r = ~x; >-- NOT Operator

= r املصفوفة

r = y; >-- Equal Operator

= r املصفوفة

1 | 1 | 1 | 0 | 0 | 0 | 0 | 0

1 | 1 | 1 | 1 | 0 | 0 | 0 | 0

0 | 0 | 1 | 1 | 1 | 1 | 1 | 1

1 | 1 | 1 | 1 | 1 | 0 | 0 | 0

0 | 1 | 1 | 1 | 1 | 1 | 1 | 1

0 | 0 | 0 | 1 | 1 | 1 | 1 | 1

1 | 1 | 1 | 1 | 1 | 0 | 0 | 00 | 0 | 0 | 1 | 1 | 1 | 1 | 1

0 | 0 | 0 | 1 | 1 | 0 | 0 | 0

1 | 1 | 1 | 1 | 1 | 1 | 1 | 1

1 | 1 | 1 | 0 | 0 | 1 | 1 | 1

0 | 0 | 0 | 0 | 0 | 1 | 1 | 1

0 | 0 | 0 | 1 | 1 | 1 | 1 | 1

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 18: Qt in Arabic

17

نسب الفصيلة :

فصيلة مستقلة

تعريف الفصيلة :

هى فصيلة تقوم بإنشاء مصفوفة عنارصها من نوع البايت ) Bytes (، حيث كل عنرص

يحتوى عىل قيمة من 0 إىل 256 ، وهى إختيار جيد لتخزين مصفوفة حروف.

: ) Declaration ( طريقة العـــالن

يتم اإلعالن عن املصفوفة بأكرث من طريقة منها:

QBitArray x) “Test“ (;

. T,E,S,T إلدارة مصفوفة حجمها 4 عنارص هم x تم اإلعالن عن املتغري

QBitArray x) 5 , ’T’ (;

. T,T,T,T,T إلدارة مصفوفة حجمها 5 عنارص هم x تم اإلعالن عن املتغري

وظائف الفصيلة :

................................................................................

الوظيفــــــــــــــــــــــــةالدالــــــة

at)int x(.x تقوم الدالة بإرجاع قيمة العنرص

left)int x(.بداية من أول املصفوفة x تقوم بإرجاع مصفوفة من الحروف عددها

right)int x(.بداية من آخر املصفوفة x تقوم بإرجاع مصفوفة من الحروف عددها

mid)int P , int L(.P بداية من العنرص رقم L تقوم بإرجاع مصفوفة من الحروف عددها

trimmed)(.تقوم بإرجاع مصفوفة الحروف وتقوم بإلغاء العنارص البيضاء إذا كانت ىف آخر املصفوفة

chop)int L(.عنرص من آخر املصفوفة L تقوم بإلغاء عدد

truncate)int L(.عنرص من أول املصفوفة و تلغى باقى العنارص و تكون هى املصفوفة الجديدة L تأخذ عدد

QByteArray Class

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 19: Qt in Arabic

18

#include >QtCore>

int main)(

{

QByteArray ar) “Hello “ (;

QByteArray br) 5 , ’Q’ (;

qDebug)( >> ar.trimmed)(;

ar = ar.trimmed)( + br;

qDebug)( >> ar[ 0 ];

qDebug)( >> ar.at) 1 (;

qDebug)( >> ar.left) 2 (;

qDebug)( >> ar.right) 7 (;

qDebug)( >> ar.mid) 3 , 4 (;

ar.chop) 7 (;

ar.truncate) 2 (;

}

QByteArray Example

رشح الكود السابق :

QByteArray ar) “Hello “ (;

اإلعالن عن املتغري ar إلدارة مصفوفة حجم 10 بايت

QByteArray br) 5 , ’Q’ (;

اإلعالن عن املتغري br إلدارة مصفوفة حجم 5 بايت

qDebug)( >> ar.trimmed)(;

طباعة ”Hello“ بدون العنارص البيضاء

ar = ar.trimmed)( + br;

= ar املصفوفة

qDebug)( >> ar[ 0 ];

طباعة H هو العنرص 0 ىف املصفوفة.

Q | Q | Q | Q | Q

H | e | l | l | o | Q | Q | Q | Q | Q

H | e | l | l | o | | | | |

EXAmpleNO 3

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 20: Qt in Arabic

19

qDebug)( >> ar.at) 1 (;

طباعة e هو العنرص رقم 1 ىف املصفوفة.

qDebug)( >> ar.left) 2 (;

طباعة He هام أول 2 عنرص من بداية املصفوفة.

qDebug)( >> ar.right) 7 (;

طباعة loQQQQQ هم أول 7 عنارص من نهاية املصفوفة.

qDebug)( >> ar.mid) 3 , 4 (;

طباعة loQQ هم أول 4 عنارص بداية من العنرص رقم 3 من بداية املصفوفة.

ar.chop) 7 (;

املصفوفة ar = بعد مسح آخر 7 عنارص.

ar.truncate) 2 (;

بعد أخذ أول 2 عنرص و إعتبارهم املصفوفة الجديدة. = ar املصفوفة

................................................................................

H | e | l

H | e

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 21: Qt in Arabic

20

QString Class نسب الفصيلة :

فصيلة مستقلة

تعريف الفصيلة :

الرئيسية الفصيلة أنها الرسومية، حيث كيوت غري فصائل أهم الفصيلة من تعد هذه

للتعامل مع النصوص ) Strings ( سواء الثابت منها أو املتغري، كام تقوم هذه الفصيلة بتخزين

الحروف كنص مستخدمة الحروف من نوع 16 بت ترميز ) UniCode (، وهى حاليا طريقة ترميز

الحروف القياسية و املستخدمة عىل أوسع نطاق ىف كل التطبيقات الحديثة.

: ) Declaration ( طريقة العـــالن

ميكن شحنها بالنص مبارشة

QString str) “string” (;

أو اإلعالن عن الفصيلة ثم شحنها بعد ذلك

QString str;

str = “string”;

وظائف الفصيلة :

متتلك هذه الفصيلة عدد كبري من الدوال كدوال للبحث داخل النص و دوال للتحويل بني

أنواع البيانات من رقمي إىل حريف أو العكس، ومن رقم عرشي إىل سدايس عرش أو العكس. وميكننا

القول أنها متتلك كل مايلزم من دوال للتعامل مع جميع أشكال و أنواع النصوص.

وسوف نقوم بعرض بعض الدوال الرئيسية.

هذه بعض الدوال البسيطة كبداية للتعارف عىل QString، ولكن املرجع الشامل يأىت مع مجموعة

أدوات كيوت.

الوظيفــــــــــــــــــــــــةالدالــــــة

append)str(.ىف آخر نص الفصيلة str تقوم بإضافة النص

insert)int p , str(.p إىل نص الفصيلة بعد عنرص رقم str تقوم بإضافة النص

remove)int P ,int L (.p حرف من نص الفصيلة بعد عنرص رقم L تقوم مبسح عدد

replace)str1,str2(.str1 مكان str2 تقوم بإستبدال

contains)str(.str ىف حالة إحتواء نص الفصيلة عىل النص True تقوم بإرجاع

startsWith)str(.str ىف حالة بدء نص الفصيلة بالنص True تقوم بإرجاع

endsWith)str(.str ىف حالة إنتهاء نص الفصيلة بالنص True تقوم بإرجاع

setNum)number(.إىل نص number تقوم بتحويل الرقم

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 22: Qt in Arabic

21

#include <QtCore>

int main(){ QString str( “Hello Qt” ); str += “ Developer”; str.append( “ 2010” ); str.insert( 0 , “Hello !! “ ); str.remove( 6 , 3 ); str.replace( “2010” , “2011” ); qDebug() << str.contains( “Dev” ); qDebug() << str.startsWith( “Hello” ); qDebug() << str.startsWith( “Hi” ); qDebug() << str.endsWith( “10” ); qDebug() << str.endsWith( “11” ); qDebug() << str.setNum( 2010.11 ); qDebug() << QString::number( 10 , 2 ); qDebug() << QString::number( 10 , 16 ); QString strarg( “Hi %1 %2” ); qDebug() << strarg.arg( “Qt” , ”Developer” );}

QString Example

رشح الكود السابق :

QString str) “Hello Qt” (;

.Hello Qt يحوى QString من النوع str إعالن عن املتغري

str += “ Developer”;

.Hello Qt Developer يحوى str املتغري

str.append) “ 2010” (;

.Hello Qt Developer 2010 يحوى str املتغري

str.insert) 0 , “Hello !! “ (;

.Hello !! Hello Qt Developer 2010 يحوى str املتغري

str.remove) 6 , 3 (;

.Hello Hello Qt Developer 2010 يحوى str املتغري

EXAmpleNO 4

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 23: Qt in Arabic

22

str.replace) “2010” , “2011” (;

.Hello Hello Qt Developer 2011 يحوى str املتغري

qDebug)( >> str.contains) “Dev” (;

.Dev عىل النص str نتيجة إلحتواء املتغري True طباعة

qDebug)( >> str.startsWith) “Hello” (;

.Hello بالنص str نتيجة لبدء املتغري True طباعة

qDebug)( >> str.startsWith) “Hi” (;

.Hi بالنص str نتيجة لعدم بدء املتغري False طباعة

qDebug)( >> str.endsWith) “10” (;

طباعة False نتيجة لعدم إنتهاء املتغري str بالنص 10.

qDebug)( >> str.endsWith) “11” (;

طباعة True نتيجة إلنتهاء املتغري str بالنص 11.

qDebug)( >> str.setNum) 2010.11 (;

تحويل 2010.11 إىل نص و طباعتها.

qDebug)( >> QString::number) 10 , 2 (;

.)Binary طباعة 1010 و هى تساوى القيمة 10 بالنظام 2 )الثناىئ

qDebug)( >> QString::number) 10 , 16 (;

.)Hexadecimal و هى تساوى القيمة 10 بالنظام 16 )السداىس عرش a طباعة

QString strarg) “Hi %1 %2” (;

qDebug)( >> strarg.arg) “Qt” , ”Developer” (;

Developer و Qt حيث يتم التعويض عن 1% , 2% عيل الرتتيب ب Hi Qt Developer طباعة

.Function Arguments بنظام

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 24: Qt in Arabic

23

:)Container Classes( الفصائل الحاوية هى مجموعة من الفصائل التى تقوم بتخزين البيانات كعنارص داخل قوائم، ولقد صممت

هذه الفصائل لتصبح رسيعة و آمنة ىف حفظ و إستدعاء البيانات.

التكرار فصائل إستخدام يتم والتعديل( اإلستدعاء و بالحفظ ( القوائم عنارص مع وللتعامل

)Iterator Classes(، والتى سيتم رشحها بعد اإلنتهاء من رشح الفصائل الحاوية.

ملخص عام للفصائل الحاوية:

................................................................................

التعريــــــف بالفصيلــــــــةالفصيلــــــة

QList>T> ،لتصبح البيانات مفهرسة و مرتبة T هى أكرث الفصائل إستخداما، والتى تقوم بتخزين البيانات من النوع

وتتعامل تلك الفصيلة مع مؤرشات )Pointers( العنارص، وليس مع بياناتها ) Data ( فتصبح أكرث رسعة

ىف اإلضافة والحذف و التبديل.

QVector>T> وليس ،) Data ( تقوم بتخزين البيانات بشكل متتابع ىف الذاكرة، وتتعامل تلك الفصيلة مع بيانات العنارص

مع مؤرشاتها ) Pointers (، و بالتاىل فعند إضافة أو مسح عنرص يتم إزاحة جميع بيانات القامئة التى

تتبعه فتسبب بطئ مالحظ إذا كانت القوائم كبرية الحجم.

QQueue>T>.FIFO و تعمل بنظام QList هى فصيلة ترث فصيلة

QStack>T>.LIFO و تعمل بنظام QVector هى فصيلة ترث فصيلة

QSet>T> هى فصيلة تخزن البيانات بنظرية املجموعات وبالتاىل فال يوجد ترتيب، وال ميكن تكرار عنرص، وميكن

إجراء العمليات عليها كالتقاطع و اإلتحاد.

QMap>Key,T>. )T( قيمة تقابله )Key( تقوم بتخزين البيانات ىف مصفوفة قاموس حيث أن لكل مفتاح

و)key,T( ميكن أن تأخذ أى شكل من أنواع البيانات نصية كانت أو رقمية، وترتب البيانات تبعا للمفتاح،

وال ميكن تكرار مفتاح مرتني.

QMultiMap>Key,T>.)T( أكرث من قيمة )Key( وتسمح بتكرار املفاتيح، حيث ميكن إعطاء املفتاح QMap هى فصيلة ترث

QHash>Key,T> تخزن البيانات QHash متاما و لكنها أرسع ىف الوصول إىل البيانات، ولكن QMap هى فصيلة تشبه فصيلة

بصور غري مرتبة أو مفهرسة.

QMultiHash>Key,T>.وتسمح بتكرار املفاتيح QHash هى فصيلة ترث

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 25: Qt in Arabic

24

QList Class نسب الفصيلة :

فصيلة مستقلة

تعريف الفصيلة :

هذه الفصيلة هى الفصيلة األساسية للفصائل الحاوية ) Container Classes (، والتى

تقوم بتخزين قامئة من العنارص) ميكن أن تكون رقمية ، نصية أو مؤرشات لفصائل أخرى (.

: ) Declaration ( طريقة العـــالن

يتم اإلعالن عن نوع القامئة و اسمها بالطريقة التالية:

QList<data type> name;

EX: QList<QString> strlist;

تم اإلعالن عن قامئة من النوع النيص) QString ( واسمها strlist وميكن شحن هذه القامئة بقامئة

من النصوص ) قامئة أسامء مثال(. و يتم شحن عنارص القامئة بواسطة العامل )<<(.

EX: strlist << “name1” << “name2” << “name2”;

.name1,nam2,nam3 سوف نحصل عىل strlist وبالتاىل فعند طباعة القامئة

وظائف الفصيلة :

الوظيفــــــــــــــــــــــــةالدالــــــة

append) val (.إىل نهاية القامئة val تقوم بإضافة عنرص جديد قيمته

insert)int p , val(.p إىل القامئة بعد العنرص رقم val تقوم بإضافة عنرص جديد قيمته

swap)int v1 ,int v2(.v1 و v2 تقوم بتبديل أماكن عنرصين

removeAt) int p (.p تقوم مبسح العنرص رقم

pop_back)(.تقوم مبسح عنرص من نهاية القامئة

pop_front)(.تقوم مبسح عنرص من بداية القامئة

push_back) val (.إىل نهاية القامئة val تقوم بإضافة عنرص جديد قيمته

push_front) val (.إىل بداية القامئة val تقوم بإضافة عنرص جديد قيمته

indexOf) val (.val أول عنرص يساوى القيمة ) تقوم بإرجاع مكان ) رقم املسلسل

value) int p (.p تقوم بإرجاع قيمة العنرص رقم

move)int v1,int v2(.v2 إىل املكان v1 تقوم بتحريك العنرص

prepend) val (.إىل بداية القامئة val تقوم بإضافة عنرص جديد قيمته

size)(.تقوم بإرجاع عدد عنارص القامئة

count) val (. val تقوم بإرجاع عدد مرات تكرار العنرص ذو القيمة

removeAll) val (. val تقوم مبسح جميع العنارص ذات القيمة

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 26: Qt in Arabic

25

#include <QtCore>

int main(){ QList<int> mylist; mylist << 0 << 1 << 2 << 3 << 5 << 7 << 6; mylist.append( 8 ); mylist.insert( 4 , 4 ); mylist.swap( 7 , 6 ); mylist.removeAt( 8 ); mylist.pop_back(); mylist.pop_front(); mylist.push_back( 7 ); mylist.push_front( 0 ); qDebug() << mylist.indexOf( 1 ); qDebug() << mylist.value( 3 ); mylist.move( 1, 5 ); mylist.prepend( 0 ); qDebug() << mylist.size(); qDebug() << mylist.count( 0 );}

QList Example

رشح الكود السابق :

QList>int> mylist;

mylist >> 0 >> 1 >> 2 >> 3 >> 5 >> 7 >> 6;

.)int( إلدارة قامئة عنارصها من النوع mylist اإلعالن عن املتغري

و شحنها بالعنارص.

mylist.append) 8 (;

إضافة عنرص قيمته 8 إىل نهاية القامئة.

mylist.insert) 4 , 4 (;

إضافة عنرص قيمته 4 بعد العنرص رقم 4.

mylist.swap) 7 , 6 (;

التبديل بني عنرص رقم 7 و 6.

0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 0 | 1 | 2 | 3 | 5 | 7 | 6 | 8

NoValue

0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 0 | 1 | 2 | 3 | 4 | 5 | 7 | 6 | 8

NoValue

0 | 1 | 2 | 3 | 4 | 5 | 6 0 | 1 | 2 | 3 | 5 | 7 | 6

NoValue

0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8

NoValue

EXAmpleNO 5

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 27: Qt in Arabic

26

mylist.removeAt) 8 (;

مسح العنرص رقم 8.

mylist.pop_back)(;

مسح آخر عنرص ىف القامئة.

mylist.pop_front)(;

مسح أول عنرص ىف القامئة.

mylist.push_back) 7 (;

إضافة عنرص قيمته 7 إىل آخر القامئة.

qDebug)( >> mylist.indexOf) 1 (;

طباعة 0 حيث أن أول مكان لعنرص يساوى القيمة 1 هو عنرص رقم 0.

qDebug)( >> mylist.value) 3 (;

طباعة 4 وهى قيمة العنرص رقم 3.

mylist.move) 1 , 5 (;

تحريك العنرص رقم 1 إىل املكان رقم 5.

mylist.prepend) 0 (;

إضافة عنرص قيمته 0 إىل أول القامئة.

qDebug)( >> mylist.size)(;

طباعة 8 وهى عدد عنارص القامئة.

qDebug)( >> mylist.count) 0 (;

طباعة 1 و هى عدد مرات تكرار القيمة 0 داخل القامئة.

0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7

NoValue

0 | 1 | 2 | 3 | 4 | 5 | 6 0 | 1 | 2 | 3 | 4 | 5 | 6

NoValue

0 | 1 | 2 | 3 | 4 | 5 1 | 2 | 3 | 4 | 5 | 6

NoValue

0 | 1 | 2 | 3 | 4 | 5 | 6 1 | 2 | 3 | 4 | 5 | 6 | 7

NoValue

0 | 1 | 2 | 3 | 4 | 5 | 6 1 | 3 | 4 | 5 | 6 | 2 | 7

NoValue

0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 0 | 1 | 3 | 4 | 5 | 6 | 2 | 7

NoValue

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 28: Qt in Arabic

27

QVector Class نسب الفصيلة :

فصيلة مستقلة

تعريف الفصيلة :

هذه الفصيلة مثل الفصيلة QList متاما، ولكن اإلختالف هنا يكمن ىف أسلوب الفصيلة ىف

التعامل مع البيانات ىف الذاكرة. ) لفهم اإلختالف ميكنك الرجوع لجدول الفصائل الحاوية ص25 (.

: ) Declaration ( طريقة العـــالن

يتم اإلعالن عن نوع القامئة و اسمها بالطريقة التالية:

QVector<data type> name;

EX: QVector<QString> strlist;

تم اإلعالن عن املتغري strlist إلدارة قامئة عنارصها من النوع النيص) QString (، وميكن شحنها

بقامئة من النصوص) قامئة أسامء مثال(، و يتم شحن عنارص القامئة بواسطة العامل )<<(.

EX: strlist << “name1” << “name2” << “name2”;

.name1,nam2,nam3 سوف نحصل عيل strlist وبالتاىل عند طباعة القامئة

وظائف الفصيلة :

.QList املثال مرفق مع باقى األمثلة وهو كمثال *

الوظيفــــــــــــــــــــــــةالدالــــــة

append) val (.إىل نهاية القامئة val تقوم بإضافة عنرص جديد قيمته

insert)int p , val(.p إىل القامئة بعد العنرص رقم val تقوم بإضافة عنرص جديد قيمته

remove) int p (.p تقوم مبسح العنرص رقم

remove)int p, int L ( .p بدأ من العنرص L تقوم مبسح عدد عنارص

pop_back)(.تقوم مبسح عنرص من نهاية القامئة

pop_front)(.تقوم مبسح عنرص من بداية القامئة

push_back) val (.إىل نهاية القامئة val تقوم بإضافة عنرص جديد قيمته

push_front) val (.إىل بداية القامئة val تقوم بإضافة عنرص جديد قيمته

indexOf) val (.val أول عنرص يساوى القيمة ) تقوم بإرجاع مكان ) رقم املسلسل

value) int p (.p تقوم بإرجاع قيمة العنرص رقم

prepend) val (.إىل بداية القامئة val تقوم بإضافة عنرص جديد قيمته

size)(.تقوم بإرجاع عدد عنارص القامئة

count) val (. val تقوم بإرجاع عدد مرات تكرار العنرص ذو القيمة

EXAmpleNO 6

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 29: Qt in Arabic

28

QQueue Class نسب الفصيلة :

QList ترث فصيلة

تعريف الفصيلة :

هذه الفصيلة ترث جميع خصائص و دوال الفصيلة QList، وتتميز بطريقة ) FIFO ( ىف

إدارة عنارص القوائم فيمكن تشبيه القامئة بأنبوب مفتوح الطرفني كام هو مبني بالرسم.

: ) Declaration ( طريقة العـــالن

.QList يتم اإلعالن و الشحن مثل فصيلة

QQueue<data type> name;

EX: QQueue<int> myqueue;

. int إلدارة قامئة عنارصها من النوع myqueue تم اإلعالن عن املتغري

وظائف الفصيلة :

الوظيفــــــــــــــــــــــــةالدالــــــة

dequeue)(.تقوم مبسح أول عنرص من القامئة مع إرجاع قيمته

enqueue) val (.QList::append تقوم بإضافة عنرص إىل آخر القامئة مثل الدالة

head)(.0 تقوم بإرجاع العنرص عىل رأس القامئة و هو العنرص األول وهو نفسه العنرص رقم

FIFO System

First In First Out

أول عنرص يدخل القامئة هو أول عنرص يخرج منها

IN

OUT

01

234

0

5

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 30: Qt in Arabic

29

#include <QtCore>

int main(){ QQueue<QString> myqueue; myqueue << “Ahmed” ; //First In myqueue << “Osama” ; myqueue << “sami”; //Last In

qDebug() << myqueue; qDebug() << myqueue.dequeue(); qDebug() << myqueue; qDebug() << myqueue.dequeue(); qDebug() << myqueue; qDebug() << myqueue.head(); myqueue.enqueue(“Mahmoud”); qDebug() << myqueue;}

QQueue Example

رشح الكود السابق :

QQueue>QString> myqueue;

myqueue >> “Ahmed” ;

myqueue >> “Osama” ;

myqueue >> “sami”;

.QString إلدارة قامئة عنارصها من النوع myqueue اإلعالن عن املتغري

.Ahmed , Osama , sami وشحنها بالعنارص

qDebug)( >> myqueue.dequeue)(;

طباعة Ahmed حيث تم سحب العنرص األول من القامئة.

.Osama , sami وتصبح القامئة

qDebug)( >> myqueue.dequeue)(;

طباعة Osama حيث تم سحب العنرص األول من القامئة.

.sami وتصبح القامئة

myqueue.enqueue)“Mahmoud”(;

إضافة Mahmoud إىل نهاية القامئة.

.sami , Mahmoud وتصبح القامئة

EXAmpleNO 7

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 31: Qt in Arabic

30

QStack Class نسب الفصيلة :

QVector ترث فصيلة

تعريف الفصيلة :

)LIFO( وتتميز بطريقة ،QVector هذه الفصيلة ترث جميع خصائص و دوال الفصيلة

ىف إدارة عنارص القوائم فيمكن تشبيه القامئة بأنبوب مفتوح من طرف واحد كام هو مبني بالرسم.

: ) Declaration ( طريقة العـــالن

.QVector يتم اإلعالن و الشحن مثل فصيلة

QStack<data type> name;

QStack<int> mystack;

. int إلدارة قامئة عنارصها من النوع mystack تم اإلعالن عن املتغري

وظائف الفصيلة :

الوظيفــــــــــــــــــــــــةالدالــــــة

pop)(.تقوم مبسح آخر عنرص من القامئة مع إرجاع قيمته

push) val (. val تقوم بإضافة عنرص إىل آخر القامئة قيمته

top)(.تقوم بإرجاع العنرص عىل رأس القامئة و هو العنرص األخري ىف القامئة

IN OUT

01

234

45

LIFO System

Last In First Out

آخر عنرص يدخل القامئة هو أول عنرص يخرج منها

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 32: Qt in Arabic

31

#include <QtCore>

int main(){ QStack<QString> mystack; mystack << “AHmed” ; //First In mystack << “Osama” ; mystack << “sami”; //Last In

qDebug() << mystack; qDebug() << mystack.pop(); qDebug() << mystack; qDebug() << mystack.pop(); qDebug() << mystack; qDebug() << mystack.top(); mystack.push(“Mahmoud”); qDebug() << mystack;}

QStack Example

رشح الكود السابق :

QStack>QString> mystack;

mystack >> “AHmed” ;

mystack >> “Osama” ;

mystack >> “sami”;

.QString إلدارة قامئة عنارصها من النوع mystack اإلعالن عن املتغري

.Ahmed , Osama , sami و شحنها بالعنارص

qDebug)( >> mystack.pop)(;

طباعة sami حيث تم سحب العنرص األخري من القامئة.

.Ahmed , Osama وتصبح القامئة

qDebug)( >> mystack.pop)(;

طباعة Osama حيث تم سحب العنرص األخري من القامئة.

. Ahmed وتصبح القامئة

mystack.push)“Mahmoud”(;

إضافة Mahmoud إىل نهاية القامئة.

.Ahmed , Mahmoud وتصبح القامئة

EXAmpleNO 8

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 33: Qt in Arabic

32

نسب الفصيلة :

QList ترث فصيلة

تعريف الفصيلة :

QList، وهى فصيلة خاصة سابقة الفصيلة الفصيلة ترث جميع خصائص ودوال هذه

التعريف.

QList<QString> : وتعرف كالتاىل

: ) Declaration ( طريقة العـــالن

QStringList mylist;

ويتم شحن العنارص بالعامل )<<(.

mylist << “Osama” << “Mohamed” << “Samier”;

وظائف الفصيلة : من أهم وظائف هذه الفصيلة هى عملية الوصل بني النصوص، حيث ميكن وصل قامئة من الكلامت

وإخراجها كنص واحد.

وذلك كام سرنى فـى املثال التاىل:

................................................................................

الوظيفــــــــــــــــــــــــةالدالــــــة

sort)(.تقوم برتتيب عنارص القامئة

filter) QString str(.str تقوم بإرجاع أعضاء الفصيلة التى تحتوى عىل النص

join) QString str(.str تقوم بإرجاع نص يتكون من جميع عنارص القامئة بني كل عنرص النص

QStringList Class

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 34: Qt in Arabic

33

#include <QtCore>

int main(){ QStringList mylist; mylist << “Osama” << “Mohamed” << “Ali” << “Samier” ;

mylist.sort(); qDebug() << mylist.filter(“med”);

QStringList mylist2;

QString str(“Mahmoud,Ali,Said,Sami,Mohamed”);

mylist2 = str.split( “ , ” );

str = mylist2.join( “ - ” );}

QStringList Example

رشح الكود السابق :

QStringList mylist;

mylist >> “Osama” >> “Mohamed” >> “Ali” >> “Samier” ;

.QStringList بإستخدام )QString( إلدارة قامئة عنارصها من النوع mylist اإلعالن عن املتغري

.Osama , Mohamed , Ali , Samier و شحنها بالعنارص

mylist.sort)(;

.Ali,Mohamed,Osama,Samier :ترتيب القامئة لتصبح كالتاىل

QStringList mylist2;

QString str)“Mahmoud,Ali,Said,Sami,Mohamed”(;

. )QString( إلدارة قامئة عنارصها من النوع mylist2 اإلعالن عن املتغري

.QString من النوع str و اإلعالن عن املتغري

mylist2 = str.split) “ , ” (;

إدخال النص إىل القامئة كمجموعة عنارص يفصل بني كل عنرص ”, ”.

str = mylist2.join) “ - ” (;

وصل عنارص القامئة إلخراجه كنص واحد بني كل عنرص ”-”.

. “Mahmoud-Ali-Said-Sami-Mohamed“:كالتاىل str ويكون النص

EXAmpleNO 9

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 35: Qt in Arabic

34

نسب الفصيلة :

فصيلة مستقلة

تعريف الفصيلة :

هذه الفصيلة هى إحدى الفصائل الحاوية، ولكنها تتعامل مع العنارص كمجموعة وليست

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

: ) Declaration ( طريقة العـــالن

QSet<data type> name;

EX : QSet<int> myset;

ويتم شحن العنارص بالعامل )<<(.

myset << 1 << 2 << 3 << 4;

وظائف الفصيلة :

من أهم وظائف هذه الفصيلة هى عمليات اإلتحاد و التقاطع للمجموعات.

توضيح للعمليات عىل املجموعات من تقاطع و فرق و إتحاد.

الوظيفــــــــــــــــــــــــةالدالــــــة

intersect)QSet s(.s تقوم بإرجاع املجموعة الناتجة عن التقاطع مع املجموعة

subtract)QSet s(.s تقوم بإرجاع املجموعة الناتجة عن الفرق مع املجموعة

unite)QSet s(.s تقوم بإرجاع املجموعة الناتجة عن اإلتحاد مع املجموعة

QSet Class

تقاطع مجموعتني

فرق مجموعتني

إتحاد مجموعتني

15

2 36

9

4

1 2 31

2

71 1

24

36

7 93

1

7

42

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 36: Qt in Arabic

35

#include <QtCore>

int main(){ QSet<int> myset; myset << 1 << 2 << 3 << 2 << 5 << 1 << 3 << 1 << 2 << 3 << 5;

QSet<int> myset2; myset2 << 5 << 7 << 2 << 9 << 8;

qDebug() << myset.intersect( myset2 ); qDebug() << myset2.subtract( myset ); qDebug() << myset.unite( myset2 );}

QSet Example

رشح الكود السابق :

QSet>int> myset;

myset >> 1 >> 2 >> 3 >> 2 >> 5 >> 1 >> 3 >> 1 >> 2 >> 3 >> 5;

اإلعالن عن املتغري myset إلدارة مجموعة وشحنها بالعنارص ونالحظ أنه تم شحن املجموعة مثال بالعنرص 1

أكرث من مرة ولكن املجموعة myset ال تسمح بتكرار العنارص .

QSet>int> myset2;

myset2 >> 5 >> 7 >> 2 >> 9 >> 8;

.myset = )1,2,3,5( and myset2 = )5,7,2,8,9(

qDebug)( >> myset.intersect) myset2 (;

.myset2 و myset هى حاصل تقاطع املجموعتني myset هذا األمر يجعل املجموعة

.myset = )2,5( and myset2 = )5,7,2,8,9(

qDebug)( >> myset2.subtract) myset (;

.myset2 و myset هى حاصل فرق املجموعتني myset2 هذا األمر يجعل املجموعة

myset = )2,5( and myset2 = )7,8,9(

qDebug)( >> myset.unite) myset2 (;

.myset2 و myset هى حاصل إتحاد املجموعتني myset2 هذا األمر يجعل املجموعة

myset = )2,5،7،8،9( and myset2 = )7,8,9(

EXAmpleNO 10

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 37: Qt in Arabic

36

نسب الفصيلة :

فصيلة مستقلة

تعريف الفصيلة :

)pairs( هذه الفصيلة هى إحدى الفصائل الحاوية والتى تقوم بتخزين عنارصها ىف أزواج

عىل هيئة )مفتاح ، قيمة( )Key , Value(، وتسمى طريقة القاموس ألن القاموس يتكون من

زوجني الكلمة ومعناها، والجدير بالذكر أن هذه الفصيلة التسمح بتخزين أكرث من قيمة لنفس

. QMultiMap املفتاح، وميكن إعطاء املفتاح أكرث من قيمة بإستخدام فصيلة

: ) Declaration ( طريقة العـــالن

QMap<KEY data type ,VALUE data type> name;

EX : QMap<QString,int> mymap;

تم اإلعالن عن املتغري mymap إلدارة قامئة مزدوجة :

نوع بيانات املفتاح ) نىص ( و القيمة ) رقمى (.

ويتم شحن عنارص القامئة بطريقتني كالتاىل:

mymap.insert)“good”,1(;

mymap[“bad”] = 0;

وظائف الفصيلة :

................................................................................

الوظيفــــــــــــــــــــــــةالدالــــــة

key)value v(.v تقوم بإرجاع أول مفتاح تقابله القيمة

keys)value v(.v تقوم بإرجاع قامئة باملفاتيح التى تقابلها القيمة

keys)(.تقوم بإرجاع قامئة بجميع املفاتيح

value)key k(.k تقوم بإرجاع القيمة املقابلة للمفتاح

values)(.تقوم بإرجاع قامئة بجميع القيم

take)key k(.k ثم مسح املفتاح k تقوم بإرجاع القيمة املقابلة للمفتاح

count)(.تقوم بإرجاع عدد عنارص الفصيلة

QMap Class

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 38: Qt in Arabic

37

#include <QtCore>int main(){ QMap <QString , int > mymap;

mymap[“hadi”] = 2; mymap[“sami”] = 2;

mymap.insert( “ali” , 1 ); mymap.insert( “hadi” , 1 );

qDebug() << mymap.key( 1 );

qDebug() << mymap.keys( 1 );

qDebug() << mymap.keys();

qDebug() << mymap.value( “sami” );

qDebug() << mymap.values();

qDebug() << mymap.take( “ali” );}

QMap Example

رشح الكود السابق :

QMap >QString , int > mymap;

mymap[“hadi”] = 1;

mymap[“sami”] = 2;

mymap.insert) “ali” , 1 (;

mymap.insert) “hadi” , 1 (;

اإلعالن عن املتغري mymap إلدارة قامئة مزدوجة.

وشحنها بالعنارص.

نالحظ أنه تم ترتيب عنارص القامئة تبعا للمفتاح ) key ( ترتيبا أبجديا، كام نالحظ أن القيمة املقابلة للمفتاح

) hadi ( كانت) 2 ( ثم عند إضافته مرة أخرى بالقيمة الجديدة تم تغيري قيمته إىل ) 1 ( و مل يضاف كمفتاح

جديد ألن الفصيلة ال تسمح بذلك.

Key Valueali 1

hadi 1

sami 2

EXAmpleNO 11

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 39: Qt in Arabic

38

qDebug)( >> mymap.key) 1 (;

طباعة املفتاح ali ألنه أول مفتاح عنرص يقابله القيمة 1.

qDebug)( >> mymap.keys) 1 (;

طباعة املفاتيح ali , hadi وهى العنارص التى تقابلها القيمة 1.

qDebug)( >> mymap.keys)(;

.ali , hadi , sami طباعة كل املفاتيح

qDebug)( >> mymap.value) “sami” (;

.sami طباعة القيمة 2 املقابلة للمفتاح

qDebug)( >> mymap.values)(;

طباعة كل القيم 1،1،2.

qDebug)( >> mymap.take) “ali” (;

طباعة القيمة 1 املقابلة للمفتاح ali، ومسح املفتاح لتصبح القامئة كالتاىل:

................................................................................

Key Valuehadi 1

sami 2

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 40: Qt in Arabic

39

نسب الفصيلة :

QMap ترث فصيلة

تعريف الفصيلة :

هذه الفصيلة هى إحدى الفصائل الحاوية والتى ترث QMap، وتسمح بتخزين أكرث من

قيمة لنفس املفتاح .

: ) Declaration ( طريقة العـــالن

QMultiMap<KEY data type ,VALUE data type> name;

EX : QMultiMap<QString,int> mymap;

تم اإلعالن عن املتغري mymap إلدارة قامئة مزدوجة :

نوع بيانات املفتاح ) نىص ( و القيمة ) رقمى (.

ويتم شحن عنارص القامئة بطريقتني كالتاىل:

mymap.insert) “good” , 1 (;

mymap[“bad”] = 0;

وظائف الفصيلة : . QMap لها نفس وظائف و دوال الفصيلة

................................................................................

الوظيفــــــــــــــــــــــــةالدالــــــة

values)key k(.k تقوم بإرجاع قامئة بجميع القيم املقابلة للمفتاح

count)key k(.k تقوم بإرجاع عدد العنارص ذات املفتاح

QMultiMap Class

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 41: Qt in Arabic

40

#include <QtCore>int main(){ QMultiMap <QString , int > myMmap,myMmap1,myMmap2; myMmap1.insert( “ali” , 1 ); myMmap1.insert( “sami” , 1 ); myMmap1.insert( “mohamed” , 1 ); myMmap2.insert( “sami” , 2 ); myMmap2.insert( “ali” , 3 ); myMmap2.insert( “sami” , 1 ); myMmap2.insert( “ali” , 4 ); myMmap = myMmap1 + myMmap2;}

QMultiMap Example

رشح الكود السابق :

QMultiMap >QString , int > myMmap,myMmap1,myMmap2;

اإلعالن عن املتغريات mymap,mymap1,mymap2 إلدارة القوائم.

myMmap1.insert)“ali” , 1 (;

myMmap1.insert)“sami” , 1 (;

myMmap1.insert)“mohamed” , 1 (;

myMmap2.insert)“sami” , 2 (;

myMmap2.insert)“ali” , 3 (;

myMmap2.insert)“sami” , 1 (;

myMmap2.insert)“ali” , 4 (;

myMmap = myMmap1 + myMmap2;

maymap1

Key Value

ali 1

mohamed 1

sami 1

maymap2

Key Value

ali 4

ali 3

sami 1

sami 2

mymap

Key Value

ali 4

ali 3

ali 1

mohamed 1

sami 1

sami 2

sami 1

EXAmpleNO 12

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 42: Qt in Arabic

41

:)Iterator Classes( فصائل التكرار هذه الفصائل تقدم طريقة موحدة للقيام بالتعامل مع القوائم و عنارصها، ويوجد أسلوبني من

.) STL - Style -Iterators (, ) Java-Style- Iterators ( : أساليب الفصائل التكرارية هام

:)Java Style Iterator( طريقة الجافا

.STL طريقة الجافا هى طريقة جديدة ىف كيوت وهى أكرث راحة من طريقة

:)Iterator Classes(جدول فصائل التكرار

:)STL Style Iterator( طريقة

الرسعة كانت ما إذا حالة ىف مفضلة وهى 2.0 كيوت منذ املستخدمة القدمية الطريقة هى

مطلوبة.

:)Iterator Classes(جدول فصائل التكرار

وسوف نقوم برشح الطريقتني عىل الفصيلة QList فقط، حيث أن جميع الفصائل تعمل بنفس

الطريقة.

................................................................................

Containers Read-only iterator Read-write iterator

QList>T>, QQueue>T> QListIterator QMutableListIterator

QLinkedList QLinkedListIterator>T> QMutableLinkedListIterator

QVector>T>, QStack>T> QVectorIterator>T> QMutableVectorIterator>T>

QSet>T> QSetIterator>T> QMutableSetIterator>T>

QMap>Key, T>, QMultiMap>Key, T> QMapIterator>Key, T> QMutableMapIterator>Key, T>

QHash>Key, T>, QMultiHash>Key, T> QHashIterator>Key, T> QMutableHashIterator>Key, T>

Containers Read-only iterator Read-write iterator

QList>T>, QQueue>T> QList>T>::const_iterator QList>T>::iterator

QLinkedList QLinkedList>T>::constـiterator QLinkedList>T>::iterator

QVector>T>, QStack>T> QVector>T>::const_iterator QVector>T>::iterator

QSet>T> QSet>T>::const_iterator QSet>T>::iterator

QMap>Key, T>, QMultiMap>Key, T> QMap>Key, T>::const_iterator QMap>Key, T>::iterator

QHash>Key, T>, QMultiHash>Key, T> QHash>Key, T>::const_iterator QHash>Key, T>::iterator

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 43: Qt in Arabic

42

نسب الفصيلة :

فصيلة مستقلة

تعريف الفصيلة :

.Java - Style - Iterator هذه الفصيلة هى إحدى فصائل التكرار من نوع الجافا

: ) Declaration ( طريقة العـــالن

QListIterator<data type> name)QList(;

EX:

QList<QString> mylist;

QListIterator<QString> iter)mylist(;

.QString إلدارة قامئة عنارص من النوع mylist تم اإلعالن عن املتغري

.mylist ليشري إىل عنارص القامئة iter و إعالن املتغري

وظائف الفصيلة :

القامئة، ويقوم هذا املؤرش بإرجاع قيمة مؤرش يتنقل بني عنارص الفصيلة بتعريف تقوم هذه

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

- طريقة الجافا تعتمد عىل وضع املؤرش بني عنارص القامئة و ليس عىل العنرص نفسه كام سرنى

.STL ىف طريقة

- عند بداية التعريف يقف املؤرش قبل أول عنرص ىف القامئة، وبالتاىل ال يكون أمامه إال التحرك

.) next ( لألمام

- ىف حالة وجود املؤرش بني عنرصين ميكن تحريكه ىف اإلتجاهني، لألمام )next( أو للخلف

.)previous(

QListIterator Class

A B C D E

A B C D E

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 44: Qt in Arabic

43

.)previous( ىف حالة وصول املؤرش بعد آخر عنرص ال يكون أمامه إال التحرك للخلف -

................................................................................

A B C D E

الوظيفــــــــــــــــــــــــةالدالــــــة

hasNext )(.ىف حالة وجود عنرص بعد املؤرش true تقوم بإرجاع

hasPrevious )(.ىف حالة وجود عنرص قبل املؤرش true تقوم بإرجاع

next )(.تقوم بتحريك املؤرش خطوة لألمام مع إرجاع قيمة العنرص الذى عرب من فوقه املؤرش

previous )(.تقوم بتحريك املؤرش خطوة للخلف مع إرجاع قيمة العنرص الذى عرب من فوقه املؤرش

peekNext )(.تقوم بإرجاع قيمة العنرص بعد املؤرش دون تحريك املؤرش

peekPrevious )(.تقوم بإرجاع قيمة العنرص قبل املؤرش دون تحريك املؤرش

toBack )(.تقوم بوضع املؤرش بعد آخر عنرص ىف القامئة

toFront )(.تقوم بوضع املؤرش قبل أول عنرص ىف القامئة

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 45: Qt in Arabic

44

: ) Declaration ( طريقة العـــالن

Container class<data type>::iterator name;

EX:

QList<QString> mylist;

QList<QString>::iterator iter;

.QString إلدارة قامئة عنارص من النوع mylist تم اإلعالن عن املتغري

.mylist ليشري لعنارص القامئة iter و إعالن املتغري

طريقة العمل :

تعمل هذه الفصيلة بتعريف مؤرش يتنقل عىل عنارص القامئة، ويقوم هذا املؤرش بإرجاع قيمة

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

- هذه الطريقة عىل خالف طريقة الجافا تعتمد عىل وضع املؤرش عىل عنارص القامئة و ليس

بني العنارص.

- عند بداية التعريف يتم تعريف وضع املؤرش إذا كان عىل أول عنرص فال يكون أمامه إال

التحرك لألمام )++(.

- ىف حالة وجود املؤرش بني عنرصين ميكن تحريكه ىف اإلتجاهني لألمام)++( أو للخلف )--(.

STL Style Iterator

A B C D end()

A B C D end()

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 46: Qt in Arabic

45

- ىف حالة وصول املؤرش عند آخر عنرص ال يكون أمامه إال التحرك للخلف )--(، وهذه الطريقة

تضع عنرص إفرتاىض بعد نهاية عنارص القامئة هو) )(end ( وهو كعنرص ليس له قيمة و لكنه

فقط لإلستدالل عىل نهاية القامئة.

................................................................................

الوظيفــــــــــــــــــــــــةالدالــــــة

*iterator.تقوم بإرجاع قيمة العنرص الذى يقف عليه املؤرش

end )(.end)( تقوم بوضع املؤرش عىل العنرص

begin )(.تقوم بوضع املؤرش عىل العنرص األول

++ iterator.تقوم بتحريك املؤرش خطوة لألمام

-- iterator.تقوم بتحريك املؤرش خطوة للخلف

iterator += n.خطوة لألمام n تقوم بتحريك املؤرش عدد

iterator -= n.خطوة للخلف n تقوم بتحريك املؤرش عدد

iterator - j.j و iterator تقوم بإرجاع عدد العنارص ما بني

A B C D end()

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 47: Qt in Arabic

46

#include <QtCore>int main(){ QList<QString> mylist; mylist << “Ali” << “Mohamed” << “Mohsen” << “Sami”; QListIterator<QString> itr(mylist); while(itr.hasNext()) qDebug() << itr.next(); while(itr.hasPrevious()) qDebug() << itr.previous(); qDebug() << itr.peekNext(); itr.toBack(); qDebug() << itr.previous();}

QListIterator Example

رشح الكود السابق :

QList>QString> mylist;

mylist >> “Ali” >> “Mohamed” >> “Mohsen” >> “Sami”;

اإلعالن عن املتغري mylist إلدارة القامئة وشحنها.

QListIterator>QString> itr)mylist(;

اإلعالن عن املتغري itr ليشري إىل عنارص القامئة mylist، ويبدأ املؤرش بالتواجد قبل أول عنرص.

while)itr.hasNext)((

qDebug)( >> itr.next)(;

طباعة جميع عنارص القامئة ويقف املؤرش بعد آخر عنرص.

mylist

Ali Mohamed Mohsen Sami

mylist

Ali Mohamed Mohsen Sami

mylist

Ali Mohamed Mohsen Sami

EXAmpleNO 13

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 48: Qt in Arabic

47

while)itr.hasPrevious)((

qDebug)( >> itr.previous)(;

طباعة جميع عنارص القامئة من آخر إىل أول عنرص ويقف املؤرش قبل أول عنرص.

qDebug)( >> itr.peekNext)(;

طباعة العنرص )Ali( وهو العنرص التاىل ملكان املؤرش، وال يتحرك املؤرش من مكانه.

itr.toBack)(;

تحريك املؤرش إىل ما بعد آخر عنرص.

qDebug)( >> itr.previous)(;

طباعة العنرص )Sami( وهو العنرص السابق ملكان املؤرش، ويتحرك املؤرش خطوة للخلف.

................................................................................

mylist

Ali Mohamed Mohsen Sami

mylist

Ali Mohamed Mohsen Sami

mylist

Ali Mohamed Mohsen Sami

mylist

Ali Mohamed Mohsen Sami

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 49: Qt in Arabic

48

#include <QtCore>int main(){ QList<QString> mylist; mylist << “Ali” << “Mohamed” << “Mohsen” << “Sami”; QList<QString>::iterator itr; for( itr = mylist.begin() ; itr != mylist.end() ; itr++) qDebug() << *itr; --itr; qDebug() << *( itr ); qDebug() << *( --itr ); qDebug() << *( --itr ); qDebug() << *( ++itr ); *(itr) = “Modified”;}

STL Iterator Example

رشح الكود السابق :

QList>QString> mylist;

mylist >> “Ali” >> “Mohamed” >> “Mohsen” >> “Sami”;

اإلعالن عن املتغري mylist إلدارة القامئة وشحنها.

QList>QString>::iterator itr;

اإلعالن عن املتغري itr ليشري إىل عنارص القامئة mylist، ويبدأ املؤرش بالقيمة 0 عند أول عنرص.

for)itr = mylist.begin)( ; itr != mylist.end)( ; itr++(

qDebug)( >> *itr;

.) end )( (طباعة جميع عنارص القامئة ويقف املؤرش عند آخر عنرص

mylist

Ali Mohamed Mohsen Sami end)(

mylist

Ali Mohamed Mohsen Sami end)(

mylist

Ali Mohamed Mohsen Sami end)(

EXAmpleNO 14

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 50: Qt in Arabic

49

--itr;

تحريك املؤرش خطوة للخلف .

qDebug)( >> *)itr(;

.) Sami (طباعة

qDebug)( >> *)--itr(;

.) Mohsen (تحريك املؤرش خطوة للخلف و يتم طباعة

qDebug)( >> *)--itr(;

.) Mohamed (تحريك املؤرش خطوة للخلف و يتم طباعة

qDebug)( >> *)++itr(;

.) Mohsen (تحريك املؤرش خطوة لألمام و يتم طباعة

*)itr( = “Modified”;

.) Modified ( تغيري قيمة العنرص املشار إليه بالقيمة

................................................................................

mylist

Ali Mohamed Mohsen Sami end)(

mylist

Ali Mohamed Mohsen Sami end)(

mylist

Ali Mohamed Mohsen Sami end)(

mylist

Ali Mohamed Mohsen Sami end)(

mylist

Ali Mohamed Modified Sami end)(

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 51: Qt in Arabic

50

تعريف:

هى مصطلح تأىت به كيوت مثل for و while و switch ، وتقوم foreach بتفريغ عنارص

أى قامئة )القوائم التى تنتجها الفصائل الحاوية( داخل متغري من نفس نوع عنارص تلك القامئة،

ومن ثم ميكن إجراء أى عملية عىل كل عنرص سواء كانت بالتعديل أو املسح... الخ.

صيغة اإلستخدام كاآلىت:

foreach )variable , container(

foreach Keyword

#include <QtCore>int main(){ QList<QString> mylist; mylist << “Mohamed” << “Mahmoud” << “Ali” << “Omar”; foreach ( QString liststr , mylist ) qDebug() << liststr;

QMap<QString , int> mymap; mymap[“ahmed”] = 1; mymap[“mohamed”] = 2; mymap[“osama”] = 3;

foreach ( QString mapstr , mymap.keys() ) qDebug() << mapstr;

foreach ( int mapint , mymap.values() ) qDebug() << mapint;}

QDir , QFileInfo Example

رشح الكود السابق :

QList>QString> mylist;

mylist >> “Mohamed” >> “Mahmoud” >> “Ali” >> “Omar”;

اإلعالن عن املتغري mylist إلدارة قامئة ذات عنارص من النوع QString و شحنها.

foreach ) QString liststr , mylist (

qDebug)( >> liststr;

.QString من النوع liststr اإلعالن عن املتغري

وتقوم foreach بشحن املتغري liststr بالقيم من القامئة mylist بالتتابع ثم طباعتها.

EXAmpleNO 15

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 52: Qt in Arabic

51

QMap>QString , int> mymap;

mymap[“ahmed”] = 1;

mymap[“mohamed”] = 2;

mymap[“osama”] = 3;

.int وقيمة من النوع QString إلدارة قامئة تحتوى عىل مفتاح من النوع mymap اإلعالن عن املتغري

foreach ) QString mapstr , mymap.keys)( (

qDebug)( >> mapstr;

. QString من النوع mapstr اإلعالن عن املتغري

وتقوم foreach بشحن املتغري mapstr باملفاتيح من mymap بالتتابع ثم طباعتها.

foreach ) int mapint , mymap.values)( (

qDebug)( >> mapint;

.int من النوع mapint اإلعالن عن املتغري

وتقوم foreach بشحن املتغري mapint بالقيم من mymap بالتتابع ثم طباعتها.

ويتم النهاىئ تكرار بعمل يقوم forever حيث كيوت وهو به تأىت أيضا مصطلح جديد هناك

إستخدامه بالشكل التاىل:

forever{

...

}

كل ما بداخل القوسني { } يتم تنفيذه بشكا النهاىئ.

................................................................................

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 53: Qt in Arabic

52

نسب الفصيلة :

فصيلة مستقلة

تعريف الفصيلة :

كيوت تستخدم امللفات، وهنا نجد أن الفصيلة تستخدم ملعالجة أسامء مسارات هذه

العالمة ) / ( كفاصل بني املجلدات، وكام نعلم فإن نظام ويندوز يستخدم العالمة ) \ (، ولكن

كيوت تتعامل مع نظام التشغيل دون تغيري كود الربمجة. وسوف يوضح املثال التاىل كيفية تعامل كيوت مع هذا الوضع.

1: QDir)“/home/user/Documents“( use in mac or linux.

2: QDir)“C:/Documents and Settings“( use in windwos.

ىف الحالة الثانية ستقوم كيوت بتحويل العالمة ) / ( إىل العالمة ) \ ( تلقائيا ليتالئم مع النظام

.C:\Documents and Settings وتصبح النتيجة بهذا الشكل

: ) Declaration ( طريقة العـــالن

QDir name)“dir name”(;

EX: QDir mydir)“C:\\windows“(;

وظائف الفصيلة :

................................................................................

QDir Class

الوظيفــــــــــــــــــــــــةالدالــــــة

cd)dir name(.dir name تقوم بتحويل املسار إىل مسار

mkdir)dir name(.dir name تقوم بإنشاء مجلد باسم

mkpath)dir path(.dir path تقوم بإنشاء مجلدات متتابعة

absolutePath)(.تقوم بإرجاع املسار الحاىل

entryInfoList)atrribute(.attribute تقوم بإرجاع قامئة امللفات ذات خصائص معينة

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 54: Qt in Arabic

53

نسب الفصيلة :

فصيلة مستقلة

تعريف الفصيلة :

هذه الفصيلة تختص بالتعامل مع امللف أو املجلد الواحد من حيث االسم ، املساحة ،

املسار ، صالحية الوصول إليه و إىل آخره من تلك البيانات.

QFileInfo التى ترث الفصيلة QFileInfoList وللتعامل مع قامئة ملفات سوف نستخدم الفصيلة

.QList>QFileInfo>وهى معرفة بـ

: ) Declaration ( طريقة العـــالن

QFileInfo name)“filepath/filename”(;

EX: QDir mydir)“c:\\mypath\\myfile.txt“(;

وظائف الفصيلة :

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

عىل نظم التشغيل املختلفة ، وملزيد من املعرفة لهذه الفصائل وخصائصها ميكن مراجعة أداة

املساعدة من كيوت.

وىف املثال التاىل سوف نقوم برشح QDir, QFileInfo , QFileInfoList لنعطى صورة مبسطة

عن كيفية التعامل مع هذه الفصائل.

................................................................................

QFileInfo Class

الوظيفــــــــــــــــــــــــةالدالــــــة

cd)dir name(.dir name تقوم بتحويل املسار إىل مسار

mkdir)dir name(.dir name تقوم بإنشاء مجلد باسم

mkpath)dir path(.dir path تقوم بإنشاء مجلدات متتابعة

absolutePath)(.تقوم بإرجاع املسار الحاىل

entryInfoList)atrribute(.attribute تقوم بإرجاع قامئة امللفات ذات خصائص معينة

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 55: Qt in Arabic

54

#include <QtCore>

int main(){ QDir mydir; QFileInfoList flist; mydir.cd(mydir.currentPath()); qDebug() << mydir.absolutePath(); mydir.mkdir( “test” ); mydir.cd( “test” ); mydir.mkdir( “1” ); mydir.cd( “1” ); mydir.mkdir( “2” ); mydir.cdUp(); mydir.cd( “..” ); mydir.mkpath( “test2/1/2” ); flist = mydir.entryInfoList(QDir::AllEntries ,QDir::Size); QString d; qDebug() << “FileName” << “\t\t” << “Size” << “ \t “ << “Type\n”; foreach( QFileInfo f , flist ) { if ( f.isDir() ) d = “DIR”; else d = “file”; qDebug() << f.fileName() << “\t\t” << f.size() << “ \t “ << d; }}

QDir , QFileInfo Example

رشح الكود السابق :

QDir mydir;

QFileInfoList flist;

.flist و قامئة ملفات mydir اإلعالن عن املتغري

mydir.cd)mydir.currentPath)((;

تحويل مسار mydir إىل مسار التطبيق الحاىل.

qDebug)( >> mydir.absolutePath)(;

طباعة املسار الحاىل.

mydir.mkdir)“test”(;

.test إنشاء مجلد

EXAmpleNO 16

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 56: Qt in Arabic

55

mydir.cd)“test”(;

.test الدخول ملجلد

mydir.mkdir)“1”(;

إنشاء املجلد 1.

mydir.cd)“1”(;

الدخول للمجلد 1.

mydir.mkdir)“2”(;

إنشاء املجلد 2.

mydir.cdUp)(;

.test الخروج من املجلد 1 إىل املجلد

mydir.cd)“..”(;

الخروج ملجلد التطبيق حيث )(cdUP تساوى )”..“(cd وهو الخروج من املجلد الحاىل إىل املجلد األعىل.

mydir.mkpath)“test2/1/2”(;

.test2 / 1 /2 إنشاء املسار

flist = mydir.entryInfoList)QDir::AllEntries ,QDir::Size(;

.QDir::Size مبلفات املسار الحاىل برتتيب املساحات flist شحن قامئة امللفات

foreach)QFileInfo f , flist(

{

if )f.isDir)(( d = “DIR”;

else d = “file”;

qDebug)( >> f.fileName)( >> “\t\t” >> f.size)( >> “ \t “ >> d;

}

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

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 57: Qt in Arabic

56

نسب الفصيلة :

QIODevice ترث فصيلة

تعريف الفصيلة :

هذه الفصيلة تستخدم للتعامل مع امللفات من حيث اإلنشاء ، القراءة و الكتابة.

: ) Declaration ( طريقة العـــالن

QFile myfile)“myfile.txt“(;

وظائف الفصيلة :

................................................................................

QFile Class

الوظيفــــــــــــــــــــــــةالدالــــــة

open)option(.)للكتابة أو القراءة و الكتابة و القراءة( option تقوم بفتح امللف حسب الخيارات

read)length(.من امللف length تقوم بقراءة عدد حروف

seek)length(.حرف length تقوم بوضع مؤرش البيانات ىف مكان يبعد عن بداية امللف مبقدار

readLine)(.تقوم بقراءة سطر من البيانات

write)data(.داخل امللف data تقوم بكتابة البيانات

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 58: Qt in Arabic

57

#include <QtCore>

int main(){ QFile File(“test.txt”);

File.open(QIODevice::ReadWrite | QIODevice::Text);

File.write( “Hi Qt Developer !!\n” );

File.seek( 0 );

qDebug() << File.readLine();

File.close();}

QFile Example

رشح الكود السابق :

QFile File)“test.txt”(;

.test.txt إلدارة امللف File اإلعالن عن املتغري

File.open)QIODevice::ReadWrite | QIODevice::Text(;

فتح امللف للقراءة و الكتابة كنص و ليس كبيانات.

File.write) “Hi Qt Developer !!\n” (;

كتابة !! Hi Qt Developer داخل امللف.

File.seek) 0 (;

وضع مؤرش الحركة داخل امللف عند 0 أى عند أول امللف .

qDebug)( >> File.readLine)(;

قراءة سطر وطباعته عىل الشاشة.

File.close)(;

إغالق امللف.

EXAmpleNO 17

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 59: Qt in Arabic

58

نسب الفصيلة :

فصيلة مستقلة

تعريف الفصيلة :

QIODevice وتقوم بهذا العمل عىل ،) Text ( هذه الفصيلة تقوم بقراءة و كتابة النصوص

QTextStream وسوف نرى ىف املثال التاىل كيفية تعامل فصيلة .QString أو QByteArray أو

. QIODevice التى ترث فصيلة QFile مع فصيلة

: ) Declaration ( طريقة العـــالن

QTextStream mystream)QIODevice(;

QTextStream mystream)QByteArray(;

QTextStream mystream)QString(;

وظائف الفصيلة :

يتم التعامل عىل البيانات بالعاملني )<<( ، )<<( املختصني بإدخال و إخراج البيانات.

QTextStream Class

#include <QtCore>

int main(){ QFile File(“test.txt”);

File.open(QIODevice::ReadWrite | QIODevice::Text);

QTextStream fstr( &File );

fstr << “Hi Qt Developer !!\n”;

fstr << 65;

fstr.seek( 0 );

qDebug() << fstr.readLine();

qDebug() << fstr.readLine();}

QTextStream Example

EXAmpleNO 18

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 60: Qt in Arabic

59

رشح الكود السابق :

QFile File)“test.txt”(;

File.open)QIODevice::ReadWrite | QIODevice::Text(;

اإلعالن عن املتغري File إلدارة امللف test.txt. وفتحه للقراءة و الكتابة.

QTextStream fstr) &File (;

.File كمدخل ومخرج بيانات من وإىل املتغري fstr اإلعالن عن املتغري

fstr >> “Hi Qt Developer !!\n”;

إدخال !! Hi Qt Developer كبيانات نصية للملف.

fstr >> 65;

إدخال 65 كبيانات نصية للملف.

fstr.seek) 0 (;

وضع مؤرش البيانات عند 0 أى عند بداية امللف.

qDebug)( >> fstr.readLine)(;

qDebug)( >> fstr.readLine)(;

إستخراج البيانات بواسطة readLine و طباعتها عىل الشاشة.

................................................................................

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 61: Qt in Arabic

60

نسب الفصيلة :

فصيلة مستقلة

تعريف الفصيلة :

أو QIODevice العمل عىل بهذا البيانات، وتقوم كتابة بقراءة و الفصيلة تقوم هذه

فصيلة مع QDataStream فصيلة تعامل كيفية التاىل املثال ىف نرى وسوف ،QByteArray

. QIODevice التى ترث فصيلة QFile

: ) Declaration ( طريقة العـــالن

QDataStream mystream)QIODevice(;

QDataStream mystream)QByteArray(;

وظائف الفصيلة :

يتم التعامل عىل البيانات بالعاملني )<<( ، )<<( املختصني بإدخال و إخراج البيانات.

QDataStream Class

#include <QtCore>int main(){ QFile File(“test.txt”); File.open(QIODevice::ReadWrite);

QDataStream fdata(&File);

fdata << QString(“Hi Qt Developer !!”); fdata << 65;

fdata.device()->seek( 0 );

QString str; int a; fdata >> str >> a ;

qDebug() << str << a ;

File.close();}

QDataStream Example

EXAmpleNO 19

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 62: Qt in Arabic

61

رشح الكود السابق :

QFile File)“test.txt”(;

File.open)QIODevice::ReadWrite | QIODevice::Text(;

اإلعالن عن املتغري File إلدارة امللف test.txt. وفتحه للقراءة و الكتابة.

QDataStream fdata)&File(;

.File كمدخل ومخرج بيانات من املتحكم fdata اإلعالن عن املتغري

fdata >> QString)“Hi Qt Developer !!”(;

إدخال !! Hi Qt Developer كبيانات للملف.

fstr >> 65;

إدخال 65 كبيانات للملف.

fdata.device)(->seek) 0 (;

وضع مؤرش البيانات عند 0 أى عند بداية امللف.حيث )(fdata.device تعود بالقيادة لفصيلة QFile التى

. seek تحوى الدالة

QString str;

int a;

fdata >> str >> a ;

qDebug)( >> str >> a ;

إستخراج البيانات بواسطة العامل )<<( و طباعتهــا عىل الشاشــــة، ونالحظ خروج البيانـــات بنفس نوعهــا

فالنىص يخرج كنص و الرقمى يخرج كرقم.

................................................................................

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 63: Qt in Arabic

62

نسب الفصيلة :

فصيلة مستقلة

تعريف الفصيلة :

هذه الفصيلة ميكنها تحويل املتغري من أى نوع إىل آخر، كالتحويل من حرىف إىل عددى

ومن أعداد صحيحة إىل أعداد حقيقية.

: ) Declaration ( طريقة العـــالن

QVariant myvar)any data type(;

وظائف الفصيلة :

تحتوى الفصيلة عىل جميع الدوال لتحويل البيانات من نوع آلخر.

QVariant Class

#include <QtCore>int main(){ QVariant v( 100 ); int x = v.toInt() + 10; QString str = v.toString(); double z = v.toDouble() * 0.2234;

qDebug() << v.typeName() ;

qDebug() << x ; qDebug() << str; qDebug() << z ;

QVariant v1( “100” ); x = v1.toInt() + 10; str = v1.toString(); z = v1.toDouble() * 0.2234;

qDebug() << v1.typeName() ;

qDebug() << x ; qDebug() << str; qDebug() << z;}

QVariant ExampleEXAmpleNO 20

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 64: Qt in Arabic

63

رشح الكود السابق :

QVariant v) 100 (;

اإلعالن عن املتغري v من النوع QVariant وشحنه بالقيمة 100.

int x = v.toInt)( + 10;

.int إىل v و يساوى 110، حيث تم تحويل int من النوع x اإلعالن عن املتغري

QString str = v.toString)(;

.QString إىل v و يساوى ”100”، حيث تم تحويل QString من النوع str اإلعالن عن املتغري

double z = v.toDouble)( * 0.2234;

.Double إىل v و يساوى 22.34 ، حيث تم تحويل double من النوع z اإلعالن عن املتغري

qDebug)( >> v.typeName)( ;

يتم طباعة نوع املتغري v وتكون int نظرا لشحنه بقيمة عددية عند اإلعالن عنه ىف أول الكود.

QVariant v1) “100” (;

اإلعالن عن املتغري v1 وشحنه بالقيمة ”100“.

x = v1.toInt)( + 10;

str = v1.toString)(;

z = v1.toDouble)( * 0.2234;

هذا الكود يعطى نفس النتائج السابقة.

qDebug)( >> v1.typeName)( ;

يتم طباعة نوع املتغري v وتكون QString نظرا لشحنه بقيمة نصية عند اإلعالن عنه.

................................................................................

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 65: Qt in Arabic

64

) QtCore Module ( الرسومية غري األساسية الفصائل وحدة أن بالذكر والجدير

تحتوى عىل أكرث من 150 فصيلة، أما ما تم رشحه سابقا هى فقط أهم فصائل هذه الوحدة.

وسوف نتعرض اآلن إىل فصيلة QObject والتى تعترب أهم فصيلة ىف كيوت، وهى ما

تعطى لكل فصائل كيوت طابعها و مميزاتها الخاصة.

Notes ............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

QtCore Module وحدة الفصائل األساسية غري الرسومية

Page 66: Qt in Arabic

65

QObject Class

QObject Class

Page 67: Qt in Arabic

66QObject Class

Page 68: Qt in Arabic

67

نسب الفصيلة :

فصيلة مستقلة

تعريف الفصيلة :

هذه الفصيلة هى أهم فصيلة ىف كيوت، حيث أنها هى الفصيلة الرئيسية املكونة ملعظم

فصائل كيوت، ولذلك تحتاج هذه الفصيلة الكثري من اإلهتامم.

ومتتلك هذه الفصيلة عدة خصائص خاصة متيز الفصيلة التى ترثها، وسيتم رشح هذه املميزات

رشحا مفصال فيام بعد، حيث أن فهم وإستيعاب هذه الفصيلة ميثل ما يوازى ٪70 من قوة كيوت.

تنظم هذ الفصيلة نفسها عىل شكل شجرى حيث أن:

.) parent ( لكل فرع أصل واحد -

.) children ( واألصل ميكن أن يكون له عدة فروع -

- وأى فرع ) child ( من هذه الفروع ميكن أن يكون أصل ) parent ( لفروع أخرى.

- وإذا تم مسح األصل يتم إزالة كل ما يتبعه من فروع.

واملالحظ أن كل كائن ) object ( يرث الفصيلة ) QObject ( يصبح له اسم وميكننا معرفة أصله

و فروعه واسم الفصيلة التى يتبعها.

للفصيلة الوارثة لفصيلة ) QObject ( أن تستقبل أحداث ) events ( مثل الوقت ميكن أيضا

.) keyboard Events ( وأى من املدخالت مثل أحداث لوحة املفاتيح ) timer (

تستخدم فصيلة ) QObject ( ميكانيكة ) Signals & Slots ( للربط بني دوال الفصائل وبعضها

وهى من أهم خصائص هذه الفصيلة.

Q_CLASSINFO مثل الفصيلة تكوين ىف املستخدمة املاكرو ببعض ) QObject ( تأىت

.Q_SIGNALS , Q_SLOTS , Q_PROPERTY , Q_OBJECT

كيوت التى تقدمها الرتجمة تتعامل مع خاصية ) QObject ( الوارثة لفصيلة الفصائل جميع

والتى تسمح بسهولة ترجمة واجهة اإلستخدام إىل أية لغة.

QObject Class

QObject Class

Page 69: Qt in Arabic

68

) parent ( نفسها عىل شكل شجرى، حيث أن كل فصيلة أب ) QObject ( تنظم فصيلة

ميكن أن يتفرع منها أكرث من فصيلة ابن ) child ( فتصبح بالشكل التاىل:

QObject *parent = new QObject)(;

QObject *child1 = new QObject)parent(;

QObject *child2 = new QObject)parent(;

QObject *child1_1 = new QObject)child1(;

QObject *child2_1 = new QObject)child2(;

QObject *child2_2 = new QObject)child2(;

ونالحظ هنا التسلسل الشجرى حيث أن :

. child1 , child2 ) هو األب ) األصل ( لألبناء ) الفروع parent

.child1_1 ) هو األب ) األصل ( لالبن ) الفرع child1

.child2_1 , child2_2 ) هو األب ) األصل ( لألبناء ) الفروع child2

وكام نعلم أنه ىف حالة مسح أى QObject يتم مسح كل األبناء ) الفروع ( التى تليه.

.child2_1 , child2_2 يتم تلقائيا مسح ما يتبعه من فروع وهم child2 فبالتاىل إذا تم مسح

................................................................................

parent

child1 child2

child1_1 child2_1 child2_2

QObject Class

Page 70: Qt in Arabic

69

وضعت كيوت عدة قواعد ألى فصيلة ترث QObject، حيث أن كل فصيلة ترث فصيلة

) QObject ( لها تعاريف وبيانات خاصة بها ) meta object ( وهذه التعاريف تشمل اآلىت:

Class Name - اسم الفصيلة

Inheritance - الوراثة

Properties - خصائص الفصيلة

Signals & Slots دوال اإلرسال واإلستقبال -

Class Info - معلومات عامة

ويتم وضع هذه البيانات داخل تعريف الفصيلة كامكرو ) Macro (، ونظرا ألن مرتجم يس++

ال ميكنه التعامل مع املاكرو مبارشة، تستخدم كيوت مرتجم ) Compiler ( إضاىف بجانب مرتجم

ىس++ لرتجمة الوظائف الخاصة بكيوت.

)headers( يقوم بالبحث ىف ملفات Meta Object Compiler ) moc ( هذا املرتجم اإلضاىف

slots , signals ( ثم يقوم بتوليد كود للامكرو الخاصة.) QObject ( عن الفصائل الوارثة لفصيلة

، etc ( ويضع الكود ىف ملف moc_classname.cpp حتى ميكن ترجمته مبرتجم ىس++.

و تتم هذه العملية كاآلىت :

.Q_OBJECT عن املاكرو )headers( بالبحث ىف امللفات moc يبدأ

- فإذا مل يحتوى تعريف الفصيلة عىل املاكرو Q_OBJECT فإن املرتجم moc لن ينظر إليها،

التطبيق سنحصل عىل الخاص )moc_classname.cpp(، وعند ترجمة الكود يولد لن وبالتاىل

خطأ بالرتجمة.

Q_PROPERTY املاكرو مثل بالبحث عن باقى املاكرو Q_OBJECT سيبدأ أما إذا وجد -

, Q_SIGNALS , Q_SLOTS لتوليد األكواد الخاصة بها.

.QObject ولىك نستطيع فهم هذه الفصيلة سنبدأ برشح كيفية تكوين فصيلة ترث

Source.cpp

Header.h

Header.h

include

Compiling

Compile

MOCmoc_*.cpp

obj.o Links Executable

QObject Class

Page 71: Qt in Arabic

70

: QObject تكوين فصيلة ترث

class className : public QObject >----------- QObject اسم الفصيلة وإعالن مرياثها لـ

{

Q_OBJECT >--Q_OBJECT ماكرو

Q_CLASSINFO)....( >-- Q_CLASSINFO ماكرو

Q_PROPERTY).....( >-- Q_PROPERTY ماكرو

public: >-- منطقة املتغريات و الدوال العامة

constructor)QObject *parent, ...(; >-- املنشئ و هو ينشئ الفصيلة ىف الذاكرة

setter functions)(; >-- الدوال الالزمة لوضع قيم املتغريات املوجودة ىف املنطقة الخاصة

getter functions)(; >-- الدوال الالزمة لجلب قيم املتغريات املوجودة ىف املنطقة الخاصة

private: >-- منطقة املتغريات و الدوال الخاصة

variables; >-- توضع معظم املتغريات ىف املنطقة الخاصة ويتم التعامل

..... .getter و setter معها بدوال

protected: >-- منطقة املتغريات و الدوال املحمية

...

Q_SLOTS: >-- Q_SLOTS ماكرو

slots functions; >-- منطقة الدوال املستقبلة لالشارة

Q_SIGNALS: >-- Q_SIGNALS ماكرو

signals function; >-- منطقة الدوال املرسلة لالشارة

}

QObject Class

Page 72: Qt in Arabic

71

وكام نرى ىف أجزاء الفصيلة تم إضافة أكرث من ماكرو، وسوف نقوم بتوضيح وظيفة كل ماكرو

وكيفية كتابته ىف الجدول التاىل.Q_OBJECT

QObject بأن هذه الفصيلة ترث فصيلة ) meta object compiler ( هو املاكرو املسؤول عن إخبار

.) moc ( وبالتاىل فهى بحاجة إىل ترجمة بواسطة

ويتم كتابته ىف أول الفصيلة دون أى عالمات إضافية مثل ) ; (

Q_CLASSINFOهو ماكرو إلضافة معلومات نصية عن الفصيلة، وكمثال ميكن إضافة اسم املربمج أو موضوع الفصيلة،

ويتم كتابته كالتاىل:

Q_CLASSINFO)“Programmer” , “ Ali“(

Q_CLASSINFO)“about” , “ drawing“(

Q_PROPERTYكإتجاه سائد ىف كيوت ال يتم التعامل مبارشة مع متغريات الفصيلة، ولكن يتم من خالل دالتني:

.) Getter Function ( واألخرى لجلب قيمة ) Setter Function ( واحدة لوضع قيمة

.Setter , Getter هو ماكرو إلضافة خاصية للفصيلة تبنى عىل الدوال Q_PROPERTY

وتكتب بالطريقة التالية :

Q_PROPERTY) Var_datatype propertyName READ Getter WRITE Setter (class classname : QObject

{

Q_OBJECT

Q_PROPERTY)int num_pro READ number WRITE setNumber(

public:

int number)(

void setNumber)int(;

private:

int num;

};

setProperty) propertyName , Variable Value ( ومن ثم ميكن إستخدامها بواسطة الدالة

Q_SLOTS & Q_SIGNALSيتم كتابة املاكرو مثل public , private , protected داخل تعريف الفصيلة.

ونذكر أن املاكرو Q_OBJECT يجب وجوده ىف تعريف الفصيلة، أما بالنسبة ألى ماكرو آخر

فيتم إستخدامه حسب الحاجة إليه .

QObject Class

Page 73: Qt in Arabic

72

Q_SIGNALS and Q_SLOTS ميكانيكية

هذه امليكانيكية شائعة اإلستخدام ىف تصميم الواجهات الرسومية، وهى طريقة للربط ما بني دوال

الفصائل املختلفة، ويتم الربط بني هذه الدوال كالتاىل :

.) Slot Function ( ودالة إستقبال ) Signal Function ( بني دالة إرسال

.) Signal Function ( ودالة إرسال ) Signal Function ( أو بني دالة إرسال

دالة إرسال اإلشارة : و هى دالة يعلن عنها داخل تعريف الفصيلة فقط وليس لها كود، وتعلن

.Q_SIGNALS هذه الدالة داخل النطاق

.Q_EMIT ) Signal Function ( ويتم إشعال دالة إرسال اإلشارة بواسطة املاكرو -

.Q_SLOTS دالة إستقبال اإلشارة : و هى دالة عادية ولكن يعلن عنها داخل النطاق

يتم الربط بواسطة األمر :

connect) obj1 , SIGNAL)signal function( , obj2 , SLOT)slot function((;

Watcher تقوم بتسجيل األسامء، وهناك فصيلة Container مثـــــال : إذا فرضنا وجود فصيلة

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

Object 1

Function doSomething()

Q_SIGNALSsendThing()

Function doSomething(){.......Q_EMIT(sendThing());}

Object 2

Q_SLOTSaccessRecv()

connect ( Object1 , SIGNAL ( sendThing() ) , Object2 , SLOT ( accessRecv() ) );

QObject Class

Page 74: Qt in Arabic

73

.QObject ترث container إنشاء فصيلة

container.h#include >QObject>

#include >QStringList>

class container : public QObject >--- QObject ترث container

{

Q_OBJECT >--- Q_OBJECT املاكرو

public:

explicit container)QObject *parent = 0(; >--- دالة إنشاء الفصيلة

void addItem)QString(; >--- strlist دالة إدخال اسم للقامئة

Q_SIGNALS: >--- Q_SIGNALS املاكرو

void ItemAdded)QString(; >--- QString دالة إلرسال إشارة قيمتها من النوع

دالة اإلرسال ليس لها كود

public Q_SLOTS: >--- Q_SLOTS املاكرو

اليوجد دوال مستقبلة لإلشارة ---<

private:

QStringList strlist; >--- الذى يحوى األسامء strlist املتغري

};

container.cpp

#include “container.h“

container::container)QObject *parent( :

QObject)parent(

كود دالة اإلنشاء ---< }

}

void container::addItem)QString str( >--- strlist كود دالة إدخال اسم للقامئة

{

this->strlist >> str; >--- strlist للقامئة str إدخال القيمة

Q_EMIT)ItemAdded)str((; >--- Q_EMIT املاكرو

}

العملية ىف كل مرة str، وتتم هذه إشارة قيمتها لتبث ItemAdded اإلرسال دالة بإشعال Q_EMIT املاكرو سيقوم

.addItem تستخدم الدالة

ونالحظ هنا أنه ال يوجد كود لدالة اإلرسال ItemAdded، فهى تعلن داخل تعريف الفصيلة فقط.

EXAmpleNO 21

QObject Class

Page 75: Qt in Arabic

74

.QObject ترث watcher إنشاء فصيلة

watcher.h#include >QObject>

class watcher : public QObject

{

Q_OBJECT

public:

explicit watcher)QObject *parent = 0(;

Q_SIGNALS:

public Q_SLOTS: >--- Q_SLOTS املاكرو

void printstr)QString(; >--- دالة إلستقبال االشارة

};

ميكن إستخدام الدالة printstr كأى دالة أخرى، ولكن وضعها ىف نطاق املاكرو Q_SLOTS يعطيها إمكانية اإلستجابة

.connect وذلك عند ربطهام بأمر ) signal function ( إلشارات دوال اإلرسال

watcher.cpp

#include “watcher.h“

#include >QDebug>

watcher::watcher)QObject *parent( :

QObject)parent(

{

}

void watcher::printstr)QString str(

{

qDebug)( >> “new Item was added to Container : “ >> str;

}

يتم كتابة الدالة printstr بطريقة عادية، وميكن إستخدامها بإحدى الطريقتني :

. printstr إىل الدالة str األولـى : إستدعائها بالطريقة العادية بتمرير املتغري

الثانيـة : التعامل معها كدالة إستقبال، وتلقيها إشارة قيمتها من نفس النوع QString من دالة إرسال.

QObject Class

Page 76: Qt in Arabic

75

.QObject ترث watcher إنشاء فصيلة

main.cpp#include >QtCore/QCoreApplication>

#include “container.h“

#include “watcher.h“

int main)int argc, char *argv[](

{

QCoreApplication a)argc, argv(;

container *cont = new container; >--- cont تسمى container إنشاء دالة

watcher *watch = new watcher; >--- watch تسمى watcher إنشاء دالة

QObject::connect)cont , SIGNAL)ItemAdded)QString(( , watch , SLOT)printstr)QString(((;

cont->addItem)“Mohamed 1“(;

cont->addItem)“Mohamed 2“(;

cont->addItem)“Mohamed 3“(;

return a.exec)(;

}

ماذا يحدث ؟ connect) cont , SIGNAL) ItemAdded)QString( ( , watch , SLOT) printstr)QString( ( (;

cont من الفصيلة ItemAdded ربط دالة اإلرسال

.watch من الفصيلة printstr بدالة اإلستقبال

سيحدث اآلىت :

.strlist ستقوم بإدخال االسم إىل القامئة cont من الفصيلة addItem كلام إستدعيت الدالة -

- ثم يتم تشغيل دالة اإلرسال ItemAdded بواسطة Q_EMIT لتبث إشارة قيمتها االسم الجديد

الذى أدخل للقامئة.

- وبواسطة األمر connect فإن الدالة printstr من الفصيلة watch ستقوم بإستقبال اإلشارة وتأخذ

قيمتها لتجرى العمليات عليها ) وهى طباعتها (.

فيكون ناتج التطبيق السابق:

new Item was added to Container : “Mohamed 1“

new Item was added to Container : “Mohamed 2“

new Item was added to Container : “Mohamed 3“

QObject Class

Page 77: Qt in Arabic

76

:signals and slots قواعد تحكم دوال اإلرسال و اإلستقبال

) signal ( إرسال دالة ربط هو هنا الهدف حيث بسهولة، القواعد هذه فهم ميكن

بدالة إستقبال ) slot (، فدالة اإلرسال تبث بيانات) عدد و نوع (، ودالة اإلستقبال تتلقى بيانات

) عدد ونوع (، لذلك يتوقف الربط الصحيح عىل عدد و نوع البيانات التى تبث و تستقبل.

عىل سبيل املثال:

signal function : setdata)int( >--- int دالة إرسال تبث عدد 1 بيان من النوع

slot function : execdata)int( >--- int دالة إستقبال تستقبل عدد 1 بيان من النوع

وبالتاىل ميكن ربطهام، حيث أن بيانات الدالتني متكافئتني من حيث النوع و العدد.

حاالت الربط بني دوال اإلرسال و دوال اإلستقبال :

الجدير بالذكر أن الربط الصحيح للدوال يتوقف عىل دالة اإلستقبال.

الحالة األولـى : ميكن الربط بينهام إذا تكافأت البيانات متاما كام ىف املثال السابق.

الحالة الثانية : إذا كانت دالة اإلرسال تبث عدد بيانات أكرث فتأخذ دالة اإلستقبال ما تريد وترتك

الباقى، ولكن ال ميكن حدوث العكس، وإليكم بعض األمثلة.

connectSlotsSignals)execdata)int(setdata)intمسموح

)execdata)QString,int(setdata)int,QStringغري مسموح

)execdata)int,QString(setdata)int,QStringمسموح

)execdata)(setdata)مسموح

)execdata)(setdata)intمسموح

)setdata)int(setdata)int,intمسموح

)setdata)int,int(setdata)intغري مسموح

)execdata)int(setdata)غري مسموح

.QObject وسنعطى اآلن مثال عىل فصيلة كاملة ترث فصيلة

مثـــال : نريد إنشاء فصيلة للسيارات تحتوى عىل كال من اسم السيارة ، املوديل ، أقىص رسعة

للسيارة ، إمكانية تشغيل املوتور، تحديد رسعة حركة السيارة.

وبالتاىل معرفة وضع السيارة ىف حالة تشغيل املوتور أو إيقافه، وأيضا معرفة الرسعة الحالية.

وسوف يساعدنا ملئ النموذج التاىل قبل البدء ىف كتابة الكود.

QObject Class

Page 78: Qt in Arabic

77

ClasName car Inherits QObjectMacros , Constructors and Destructors

Level Type Function member

NON

NON

NON

NON

NON

public

public

Macro

Macro

Macro

Macro

Macro

Contructor

Contructor

Q_OBJECT

Q_CLASSINFO(“Author” , “QT-Developer”)

Q_PROPERTY(QString carname READ name WRITE setName);

Q_PROPERTY(QString carmodel READ model WRITE setModel)

Q_PROPERTY(int carspeed READ speed WRITE setSpeed)

explicit car(QObject *parent = 0);

explicit car(QString name, QObject *parent = 0);

VariablesLevel Type Name Info

private

private

private

private

private

QString

QString

int

int

bool

car_name;

car_model;

car_speed;

car_maxspeed;

car_enginestatus;

Setters and Getter Function membersSetters Functions Getters Functions

Level Type Function Level Type Function

public

public

public

public

public

void

void

void

void

void

setName(QString);

setModel(QString);

setMaxSpeed(int);

StartEngine();

StopEngine();

public

public

public

public

public

public

QString

QString

int

int

bool

QString

name();

model();

speed();

maxSpeed();

isEngineOn();

EngineStatus();

Slots and Signals

Q_SLOTS Q_SIGNALS

Level Type Function Level Type Function

Q_SLOTS void setSpeed(int); Q_SIGNALS

Q_SIGNALS

Q_SIGNALS

void

void

void

SpeedChanged(int);

Enginetoggled(bool);

MaxSpeed(int);

QObject Classملحوظة : يوجد بآخر الكتاب مناذج فارغة

Page 79: Qt in Arabic

78

:) car.h (عند تفريغ النموذج السابق ستصبح الفصيلة بالشكل التاىل

#include >QObject>

class car : public QObject

{

Q_OBJECT

Q_CLASSINFO)“Author” , “QT-Developer”(

Q_PROPERTY)QString carname READ name WRITE setName(

Q_PROPERTY)QString carmodel READ model WRITE setModel(

Q_PROPERTY)int carspeed READ speed WRITE setSpeed(

public:

explicit car)QObject *parent = 0(;

explicit car)QString name, QObject *parent = 0(;

void setName)QString(;

void setModel)QString(;

void setMaxSpeed)int(;

void StartEngine)(;

void StopEngine)(;

QString name)(;

QString model)(;

int speed)(;

int maxSpeed)(;

bool isEngineOn)(;

QString EngineStatus)(;

Q_SIGNALS:

void SpeedChanged)int(;

void Enginetoggled)bool(;

void MaxSpeed)int(;

public Q_SLOTS:

void setSpeed)int(;

private:

QString car_name;

QString car_model;

int car_maxspeed;

int car_speed;

bool car_enginestatus;

};

}}}

}

}}

}

املاكرو

تعريف منشئ الفصيلة

Setters الدوال الالزمة لوضع قيم املتغريات

Getters الدوال الالزمة لجلب قيم املتغريات

دوال اإلرسال

دوال إستقبال لإلشارة

املتغريات الخاصة بالفصيلة

QObject Class

Page 80: Qt in Arabic

79

رشح الكود السابق :

سوف نقوم برشح كيفية كتابة املاكرو وكيفية اإلستفادة منها.

Q_OBJECT

.QObject عىل أن الفصيلة ترث فصيلة moc ماكرو ليستدل املرتجم Q_OBJECT

Q_CLASSINFO

هو ماكرو يوضع فيه املعلومات األساسية عن الفصيلة مثل:

Q_CLASSINFO)“Author” , “QT-Developer”(

Q_CLASSINFO)“Web” , “www.carclass.net”(

Q_PROPERTY

القيمة ) Getter Function ( و دالة وضع املتغري) Variable Type ( ودالة جلب ماكرو يوضع به نوع

.) Setter Function ( القيمة

وتأخذ الشكل التاىل:

Q_PROPERTY)DataType PropertyName READ GetterFunction WRITE SetterFunction(

. Q_PROPERTY سنرشح فيام بعد أهمية

وتطبيقا ىف املثال السابق نرى :

Q_PROPERTY)QString carname READ name WRITE setName(

Q_PROPERTY)QString carmodel READ model WRITE setModel(

Q_PROPERTY)int carspeed READ speed WRITE setSpeed(

Q_SIGNALS

جميع الدوال تحت املاكرو Q_SIGNALS تكون من النوع void، وهذه الدوال ال يكتب لها تفصيل ىف ملف

. classname.cpp الكود

. Q_EMIT وهى دوال خاملة، فقط هى تبث إشارة إذا تم إشعالها بواسطة املاكرو

Q_SLOTS

جميع الدوال تحت املاكرو Q_SLOTS هى دوال عادية ميكن إستخدامها كأى دالة أخرى، ولكن ما مييزها

.Q_SIGNALS أنها تستطيع إستقبال إشارات دوال املاكرو

................................................................................

QObject Class

Page 81: Qt in Arabic

80

car للفصيلة ) car.cpp ( الكود التفصيىل

#include “car.h“

car::car)QObject *parent( :

QObject)parent(

{

this->car_speed = 0;

this->car_enginestatus = false;

}

car::car)QString name, QObject *parent(:QObject)parent(

{

this->car_speed = 0;

this->car_enginestatus = false;

this->car_name = name;

}

void car::setName)QString name(

{

this->car_name = name;

}

void car::setModel)QString model(

{

this->car_model = model;

}

void car::setMaxSpeed)int max(

{

this->car_maxspeed = max;

Q_EMIT MaxSpeed)max(; >------------

}

} كود دالة املنشئ

} كود دالة املنشئ

{دالة Setter : إلعطاء اسم للسيارة{دالة Setter : إلعطاء موديل السيارة

{دالة Setter : لتحديد أقىص رسعةMaxSpeed لتشعل دالة اإلشارة Q_EMIT نالحظ وجود املاكرو

max لتبث إشارتها بالقيمة

QObject Class

Page 82: Qt in Arabic

81

void car::setSpeed)int speed(

{

if)speed > 0(speed = 0;

if)speed > this->car_maxspeed( speed = this->car_maxspeed;

if)this->car_speed == speed(return;

if)!this->isEngineOn)((speed=0;

this->car_speed = speed;

Q_EMIT SpeedChanged)speed(; >-----------------------------

}

void car::StartEngine)(

{

if)this->car_enginestatus == true( return;

this->car_enginestatus = true;

Q_EMIT Enginetoggled)this->car_enginestatus(; >------

}

void car::StopEngine)(

{

if)this->car_enginestatus == false( return;

else{

this->setSpeed)0(;

this->car_enginestatus = false;

Q_EMIT Enginetoggled)this->car_enginestatus(; >------

}

}

QString car::name)(

{

return this->car_name;

}

QString car::model)(

{

return this->car_model;

}

} دالة Setter : لوضع الرسعة الحالية

Q_EMIT

SpeedChanged لتشعل دالة اإلرسال

speed لتبث إشارتها بالقيمة

{دالة Setter : لتشغيل املحركQ_EMIT

Enginetoggled تشعل دالة اإلرسال

car_enginestatus لتبث إشارتها بالقيمة

} دالة Setter : إليقاف املحرك

Q_EMIT

Enginetoggled تشعل دالة اإلرسال

car_enginestatus لتبث إشارتها بالقيمة

{دالة Getter : إلرجاع اسم السيارة{دالة Getter : إلرجاع موديل السيارة

QObject Class

Page 83: Qt in Arabic

82

int car::maxSpeed)(

{

return this->car_maxspeed;

}

int car::speed)(

{

return this->car_speed;

}

bool car::isEngineOn)(

{

return this->car_enginestatus;

}

QString car::EngineStatus)(

{

QString status;

if)this->isEngineOn)(( status = “Engine On“;

else status = “Engine Off“;

return status;

}

،QObject ىف الربط مابني دوال الفصائل الوارثة لفصيلة signals and slots لقد رأينا طريقة

ويوجد أيضا طريقة أخرى للربط ما بني دوال الفصائل، وهى عن طريق وضع دالة إستقبال باسم

.Q_SLOTS أو slots يحتوى عىل دالة اإلرسال واسم فصيلتها، وتوضع هذه الدالة داخل النطاق

وتقوم هذه الدالة بإستقبال البيانات التى تبثها دالة اإلرسال املكتوبة ىف اسم الدالة كاآلىت:

void on_<object name>_<signal name>)>signal parameters>(;

EX : void on_PushBotton_clicked)(;

وتعرف هذه الطريقة بـ connectSlotsByName، وسنقوم برشحها بصورة أفضل عند التعامل

مع الواجهات الرسومية.

{دالة Getter : إلرجاع قيمة أقىص رسعة{دالة Getter : إلرجاع قيمة الرسعة الحاليةbool : true , false إلرجاع حالة املحرك : Getter دالة}

QString إلرجاع حالة املحرك كنص : Getter دالة}

اسم الفصيلة دالة اإلرسال

QObject Class

Page 84: Qt in Arabic

83

QtGui Module

وحدة

مكونات واجهة

املستخدم الرسومية

QtGui Module وحدة مكونات واجهة املستخدم الرسومية

Page 85: Qt in Arabic

84

إدراج

#include <QtGui>

داخل ملفات الكود

متطلبات هذه الوحدة

إدراج

QT += gui

. project.pro داخل ملف املرشوعQtGui Module وحدة مكونات واجهة املستخدم الرسومية

Page 86: Qt in Arabic

85

قبل البدأ بدراسة فصائل الواجهات الرسومية GUI، من املمكن أن نثري بعض األسئلة:

ماهى مكونات الواجهة الرسومية؟ وما هى خصائص تلك املكونات؟ وهل هذه املكونات سابقة

التجهيز أم يتم برمجتها؟

،) Buttons , Line Edit , Radio Buttons( مكونات الواجهة الرسومية : هى عىل سبيل املثال

بجانب كل ما هو رسم عىل الشاشة و يتفاعل مع أحداث ) Events (، مثل الضغط عىل الفأرة أو

أحد مفاتيح لوحة املفاتيح.

وهى أال واحدة فصيلة من ينحدر الرسومية الواجهة مكونات جميع أن القول ميكن وبالتاىل

عن عبارة وهى الرسومية، الواجهة ملكونات األساسية البنية تعترب والتى ،QWidget فصيلة

.) Events ( مساحة مستطيلة ترسم عىل الشاشة وتتفاعل مع األحداث

كل ترث فهى ،) QObject , QPaintDevice فصيلتني) ترث فصيلة QWidget هى فصيلة

خصائص و مميزات QObject، كام رأينا سابقا و ترث أيضا خصائص QPaintDevice الرسومية.

وبالتاىل فعند دراسة خصائص QWidget جيدا، نكون قد قمنا بتعريف الخصائص العامة لجميع

مكونات الواجهة الرسومية، و كيفية التحكم بها.

................................................................................

QtGui Module وحدة مكونات واجهة املستخدم الرسومية

Page 87: Qt in Arabic

86

نسب الفصيلة :

QPaintDevice , QObject ترث فصيلة

تعريف الفصيلة :

الرسومية املستخدم واجهة مكونات وحدة ىف فصيلة أهم هى الفصيلة هذه تعترب

) Gui module (، حيث أنها هى الفصيلة الرئيسية املكونة لكل فصائل كيوت الرسومية، وهى

.) Events ( عبارة عن مساحة مستطيلة ترسم عىل الشاشة وتتفاعل مع األحداث

ملحوظة :

عند تعريف الفصيلة QWidget سوف نالحظ قيمة البد من متريرها ىف بداية التعريف.

مثال عىل ذلك :

QWidget) QWidget *parent = 0, Qt::WindowFlags f = 0 ( دالة اإلنشاء

. parent , f يتم شحنها بقيمتني للمتغريين QWidget عند اإلعالن عن أى فصيلة

املتغري parent إذا مل يتم شحنه بقيمة، تصبح قيمته 0 كقيمة إفرتاضية.

وىف حالة إذا كانت قيمة املتغري parent تساوى 0،

.) window ( متثل نافذة مستقلة QWidget فإن الفصيلة

وإذا تم شحن املتغري parent بفصيلة widget كأب،

.widget تصبح مبثابة ابن للفصيلة األب QWidget فإن الفصيلة

QWidget mywidget)0(; >-------- نافذة مستقلة mywidget

QWidget mywidget; >-------- نافذة مستقلة mywidget

QWidget mywidget2) &mywidget (;

. mywidget ويكون ابن لـ ،mywidget هى كائن رسومى جديد يرسم بداخل mywidget2

وكل ما يتم فعله عىل األب يحدث لجميع أبناءه، والعكس ليس بصحيح، مبعنى أنه إذا ما تم إخفاء

النافذة األب parent يختفى جميع أبناءه children، وكذلك أيضا ىف حالة اإللغاء والتعطيل،

وسيقوم املثال التاىل بتوضيح ذلك بصورة أكرب.

QWidget Class

QtGui Module وحدة مكونات واجهة املستخدم الرسومية

Page 88: Qt in Arabic

87

main.cpp

#include >QtGui/QApplication>

#include >QWidget>

#include >QLabel>

#include >QLineEdit>

#include >QCheckBox>

int main)int argc, char *argv[](

{

QApplication a)argc, argv(;

QWidget wid;

QLabel lbl;

QLineEdit line;

QCheckBox box;

wid.show)(;

lbl.show)(;

line.show)(;

box.show)(;

return a.exec)(;

}

QWidget wid

QLabel lbl

QCheckBox box

QLineEdit line

نتيجة هذا الكود : يتم عرض كل مكون رسومى كأنه نافذة مستقلة.

EXAmpleNO 22

QtGui Module وحدة مكونات واجهة املستخدم الرسومية

Page 89: Qt in Arabic

88

#include >QtGui/QApplication>

#include >QWidget>

#include >QLabel>

#include >QLineEdit>

#include >QCheckBox>

int main)int argc, char *argv[](

{

QApplication a)argc, argv(;

QWidget wid;

QLabel lbl)&wid(;

QLineEdit line)&wid(;

QCheckBox box)&wid(;

wid.show)(;

return a.exec)(;

}

ىف هذا الكود يتم رسم كال من lbl,line,box بداخل wid، حيث أن wid هى النافذة الوحيدة

.wid والباقى يعترب مكونات رسومية أبناء لـ

والبد إذا من رشح كيفية عمل كيوت ىف الواجهات الرسومية، وما هى األسس التى بنيت عليها.

ونذكر أيضا أنه عند التطبيق الفعىل سيتم إستخدام األداة Qt Designer لرسم كل أجزاء التطبيق

وتسميتها وإعطاءها الخواص الخاصة بها، كام سيتم الربط بني دوال الفصائل الرسومية من خالل

. Qt Designer املوجودة بـ signals and slots نافذة

وبالنظر إىل فصيلة QWidget نجد أن لها كم هائل من الدوال التى تتحكم ىف خصائصها الرسومية،

،) setGeometry ( الشاشة إحداثيات ىف ومكانها النافذة وعرض طول لتحديد دوال فيوجد

ودوال إلظهار النافذة أو إخفائها ) show , hide ( بجانب دوال أخرى كثرية.

QWidget وسنبدأ اآلن بإنشاء أول تطبيق ذو واجهة رسومية، وهذا التطبيق ينحرص ىف إنشاء

الخاصة األكواد األداة Qt Creator ىف تكوين الشاشة، وذلك ملعرفة كيفية عمل وعرضها عىل

بالتطبيق.

QtGui Module وحدة مكونات واجهة املستخدم الرسومية

Page 90: Qt in Arabic

89

.Qt Creator نبدأ أوال بفتح

.File من القامئة New File or Project نختار -

.Project من القامئة Qt Gui Application و Qt c++ Project و نختار -

.test ثم تظهر نافذة إلعطاء اسم للتطبيق وسنقوم بتسمية التطبيق -

QtGui Module وحدة مكونات واجهة املستخدم الرسومية

Page 91: Qt in Arabic

90

. base class من قامئة QWidget نختار : class information من الواجهة -

- مبجرد اإلنتهاء من هذه الخطوات وبضغط Runسيقوم التطبيق بإظهار نافذة خالية.

-املطلوب هنا هو معرفة ما قام به Qt Creator، وما هى امللفات واألكواد التى أنتجها تلقائيا.

امللفات التى أنتجها Qt Creator هى:

Project

|---test.pro >--- ملف لتعريف الخواص الخاصة بالتطبيق

|---Forms >--- توضع هنا النامذج الرسومية

| |----widget.ui >---Qt Designer منوذج نافذة ميكن تعديله بواسطة األداة

|

|---Headers

| |----widget.h >--- ملف تعريف الفصيلة

|

|---Source

|----main.cpp >--- ملف التطبيق األساىس

|----widget.cpp >--- ملف كود تفصيىل للفصيلة

QtGui Module وحدة مكونات واجهة املستخدم الرسومية

Page 92: Qt in Arabic

91

الذى سبق املكان التطبيق ىف باسم ) Folder ( بإنشاء مجلد Qt Creator سيقوم

إختياره أثناء إعداد التطبيق، ففى املثال السابق سيقوم بإنشاء مجلد اسمه test ويوضع فيه

امللفات السابق ذكرها.

: test.pro امللف

مثل معها التعامل املطلوب ) Modules ( الوحدات أسامء عىل يحتوى ملف هو

)gui , network (، كام يحتوى عىل أسامء امللفات الخاصة باملرشوع.

: widget.ui امللف

هو ملف توصيف النافذة و ما بها من كائنات رسومية.

: main.cpp امللف

هو ملف كود املرشوع الرئيىس.

: widget.h امللف

.widget هو ملف كود تعريف الفصيلة الرسومية

: widget.cpp امللف

.widget هو ملف كود تفصيل لتعريف الفصيلة الرسومية

عند الضغط عىل build all يحدث اآلىت :

.uic بواسطة املرتجم ui_widget.h إىل ملف كود اسمه widget.ui يتم ترجمة -

ويقوم uic بإنتاج فصيلة مستقلة تحتوى عىل جميع الكائنات الرسومية املوجودة

.namespace ما عدا النافذة الرئيسية، وتعرف هذه الفصيلة داخل

- يقوم املرتجم moc بالبحث عن جميع املاكرو الخاص بـ QObject و إنتاج ملف

.moc_widget.cpp كود اسمه

- يتم ترجمة امللفات السابقة إلنتاج ملف تشغيل التطبيق.

.) moc_widget.cpp , ui_widget.h ( امللخص : تم إنتاج ملفني تلقائيا هام

.widget.h , widget.cpp , main.cpp ولرنى اآلن ما بداخل

QtGui Module وحدة مكونات واجهة املستخدم الرسومية

Page 93: Qt in Arabic

92

main.cpp#include >QtGui/QApplication>

#include “widget.h“

int main)int argc, char *argv[]( >------ الرئيسية Main الدالة

{

QApplication a)argc, argv(; >------ تعريف الفصيلة التى تقوم بإدارة التطبيق

Widget w; >------ QWidget وهى ترث من الفصيلة Widget تعريف فصيلة

وكام نرى فأنها ليس لها أب وبالتاىل فهى نافذة مستقلة.

w.show)(; >------ دالة إلظهار النافذة عىل الشاشة

return a.exec)(; >------ دالة التكرار لضامن إستمرار التشغيل حتى إيقاف التطبيق

}

widget.h#ifndef WIDGET_H

#define WIDGET_H

#include >QWidget>

namespace Ui {

class Widget;

}

class Widget : public QWidget

{

Q_OBJECT

public:

explicit Widget)QWidget *parent = 0(;

~Widget)(;

private:

Ui::Widget *ui;

};

#endif // WIDGET_H

Ui::Widget مؤرش للفصيلة ui

هام فصيلتني مختلفتني:

: داخل namespace وهى فصيلة مستقلة تحوى دالتني فقط، األوىل

وتعريفها موجود داخل امللف ui_widget.h. والدالتني هام:

setupUi)QWidget *(;

retranslateUi)QWidget *Widget(;

setupUi الدالة املختصة باإلنشاء والوصول إىل جميع الكائنات الرسومية

املوجودة داخل النافذة الرئيسية، وتستدعى كالتاىل:

Ui::Widget

retranslateUi الدالة املختصة برتجمة نصوص الكائنات الرسومية

.................................................

.QWidget الثانية : هى فصيلة النافذة الرئيسية، وهى ترث فصيلة

QtGui Module وحدة مكونات واجهة املستخدم الرسومية

Page 94: Qt in Arabic

93

widget.cpp#include “widget.h“

#include “ui_widget.h“

Widget::Widget)QWidget *parent( :

QWidget)parent(,

ui)new Ui::Widget(

{

ui->setupUi)this(;

}

Widget::~Widget)(

{

delete ui;

}

إلنشاء الكائنات الرسومية داخل النافذة الرئيسية،

وبدونها تظهر النافذة خالية.

ui_widget.h لنلقى نظرة عىل امللف

) كود هذا امللف معروض بشكل غري كامل، وما نعرضه هنا هى فقط األجزاء الهامة، وذلك بغرض فهم ما يحدث داخل

كيوت، ولكن عند التطبيق ينتج هذا امللف تلقائيا، وال يتم التعديل فيه من الداخل. (

class Ui_Widget

{

public:

void setupUi)QWidget *Widget( {

......

}

void retranslateUi)QWidget *Widget( {

.......

}

};

namespace Ui {

class Widget: public Ui_Widget {};

}

Ui_Widget تعريف فصيلة

retranslateUi , setupUi تحتوى عىل الدالتني

setupUi : تستخدم لعرض املكونات الرسومية الخاصة باملرشوع.

ىف ترجمتها املطلوب الكلامت لوضع تستخدم : retranslateUi

الواجهة الرسومية.

Ui_Widget التى ترث الفصيلة Ui::Widget تعريف الفصيلة

. retranslateUi , setupUi وبالتاىل فإنها ترث الدالتني

widget.h هى املستخدمة ىف Ui::Widget و الفصيلة

QtGui Module وحدة مكونات واجهة املستخدم الرسومية

Page 95: Qt in Arabic

94

اآلن سنقوم ومكوناته، رسومية واجهة ذو تطبيق إنشاء لكيفية السابق التوضيح بعد

برشح مثال لفهم signals and slots جيدا، وربطهام مبكونات الواجهة الرسومية.

QObject السابق الفصل نهاية ىف برشحها قمنا التى car الفصيلة بإستخدام سنقوم

ليكون لدينا ملفات الكود التالية:

main.cpp >----- امللف الرئيىس

car.h >----- car ملف تعريف الفصيلة

car.cpp >----- car ملف الكود التفصيىل للفصيلة

الفصيلة car_gui هى فصيلة رسومية ترث QWidget وتحوى بعض الكائنات الرسومية.

car_gui.h >----- car_gui ملف تعريف الفصيلة

car_gui.cpp >----- car_gui ملف الكود التفصيىل للفصيلة

نقوم بالخطوات العادية إلنشاء تطبيق رسومى باسم ) EX_QObject_car (، ثم نبدأ برسم

.Qt Designer اآلىت بـ

8 QLabel

Class

QToolButton ClassObjectName:

enginebtn

QDail ClassObjectName:

speeddail

ObjectName:

namelbl

ObjectName:

modelbl

ObjectName:

enginestatuslbl

ObjectName:

speedlbl

QtGui Module وحدة مكونات واجهة املستخدم الرسومية

Page 96: Qt in Arabic

95

car_gui.h#ifndef CAR_GUI_H

#define CAR_GUI_H

#include >QWidget>

#include “car.h“ >-------- car إستدعاء لتعريف الفصيلة

namespace Ui {

class car_gui; >-------- Ui::car_gui تعريف الفصيلة

}

class car_gui : public QWidget

{

Q_OBJECT

public:

explicit car_gui)QWidget *parent = 0(;

~car_gui)(;

car *toyota;

public Q_SLOTS:

void setCarSpeed)int(;

void setCarEngine)bool(;

private:

Ui::car_gui *ui;

};

#endif // CAR_GUI_H

} car_gui تعريف الفصيلة

} دوال مستقبلة لإلشارة

ملحوظة هامة :

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

حول األكواد التى قمنا بإضافتها.

EXAmpleNO 23

QtGui Module وحدة مكونات واجهة املستخدم الرسومية

Page 97: Qt in Arabic

96

car_gui.cpp#include “car_gui.h“

#include “ui_car_gui.h“

#include “car.h“

car_gui::car_gui)QWidget *parent( :

QWidget)parent(,

ui)new Ui::car_gui(

{

QString str;

ui->setupUi)this(;

toyota = new car)this(;

toyota->setProperty)“carname“ , “TOYOTA“(;

toyota->setModel)“2005“(;

toyota->setMaxSpeed)200(;

ui->speeddial->setMaximum)toyota->maxSpeed)((;

ui->namelbl->setText)toyota->name)((;

ui->modelbl->setText)toyota->property)“carmodel“(.toString)((;

ui->enginestatuslbl->setText)toyota->EngineStatus)((;

str.setNum)toyota->speed)((;

ui->speedlbl->setText)str(;

connect)toyota , SIGNAL)SpeedChanged)int((, this , SLOT)setCarSpeed)int(((;

connect)toyota ,SIGNAL)Enginetoggled)bool((,this,SLOT)setCarEngine)bool(((;

connect)ui->speeddial,SIGNAL)valueChanged)int((,toyota,SLOT)setSpeed)int(((;

connect)ui->enginebtn,SIGNAL)clicked)bool(( , this,SLOT)setCarEngine)bool(((;

}

car_gui::~car_gui)(

{

delete ui;

}

QtGui Module وحدة مكونات واجهة املستخدم الرسومية

Page 98: Qt in Arabic

97

void car_gui::setCarSpeed)int speed(

{

QString str;

str.setNum)speed(;

ui->speedlbl->setText)str(;

ui->speeddial->setValue)speed(;

}

void car_gui::setCarEngine)bool status(

{

if )status == true(

{

toyota->StartEngine)(;

ui->enginestatuslbl->setText)toyota->EngineStatus)((;

ui->enginebtn->setText)“Stop Engine“(;

}

else

{

toyota->StopEngine)(;

ui->enginestatuslbl->setText)toyota->EngineStatus)((;

ui->enginebtn->setText)“Start Engine“(;

}

}

.signals and slots بني ) connect ( رسم عمليات اإلرتباط

car class

Q_SIGNALS

SpeedChanged)int(

Enginetoggled)bool(

Q_SLOTS

setSpeed)int(

car_gui class

Q_SIGNALS

ui->speeddial::valueChanged)int(

ui->enginebtn:: clicked)bool(

Q_SLOTS

setCarSpeed)int(

setCarEngine)bool(

QtGui Module وحدة مكونات واجهة املستخدم الرسومية

Page 99: Qt in Arabic

98

ونرى ىف املثال السابق كيف أن اإلرتباط بني النافذة car_gui والكائنات التى تحويها تتم

بواسطة Signals and Slots، وكمـا ذكرنا ىف نهاية الرشح لخواص الفصيلة QObject والفصائل

،connectSlotsByName الوارثة لها أنه ميكن الربط بني الدوال بطريقة أخرى وهى طريقة

والتى تتم بواسطة إنشاء دالة إستقبال slot بالصيغة التالية :

void on_>object name>_>signal name>)>signal parameters>(;

ولعمل ذلك ىف املثال السابق سنقوم بالتعديالت اآلتية:: car_gui.h ىف ملف

class car_gui : public QWidget

{

.....

public Q_SLOTS:

.....

void on_mycarname_SpeedChanged)int(;

...

}

: car_gui.cpp ىف ملفcar_gui::car_gui)QWidget *parent( :QWidget)parent(,ui)new Ui::car_gui(

{

....

toyota = new car)this(;

toyota->setObjectName)“mycarname“(;

...

// connect)toyota , SIGNAL)SpeedChanged)int((, this , SLOT)setCarSpeed)int(((;

....

QMetaObject::connectSlotsByName)this(;

}

void car_gui::on_toyota_SpeedChanged)int i (

{

setCarSpeed) i(;

}

إضافة الدالة

on_mycarname_SpeedChanged)int(

Q_SLOTS داخل النطاق

car سيكون اسم الكائن املشتق من الفصيلة mycarname حيث

.car اسم الكائن املشتق من الفصيلة mycarname

SpeedChanged الخاص بدالة اإلرسال connect إلغاء األمر

البد من تشغيل هذه الدالة التى تقوم بالبحث عن الدوال التى عىل الصيغة.

on_>object name>_>signal name>)>signal parameters>(.

ستقوم بنفس عمل الدالة connect التى تم

{إلغائها.QtGui Module وحدة مكونات واجهة املستخدم الرسومية

Page 100: Qt in Arabic

99

دوال الحــــــــــــــداث

لقد قمنا بتعريف الفصيلة QWidget بأنها عبارة عن مساحة مستطيلة ترسم عىل الشاشة،

.) Events ( وتتفاعل مع األحداث

والسؤال هنا هو : ماهى دوال األحداث؟ وكيف يتم تعريفها بالفصيلة QWidget ؟

: ) Event Function ( دوال األحداث

الضغط ، النافذة داخل الرسم مثل أحداث أى بإستقبال الخاصة الدوال هى

خاصية حدوث ، تحريكها ، الفأرة مفتاح عىل الضغط ، املفاتيح لوحة من مفتاح عىل

) drag and drop ( أو أى حدث آخر.

تعرف دوال األحداث بالفصيلة بخطوتني :

.protected داخل النطاق املحمى ) class.h ( 1- توضع الدالة ىف ملف تعريف الفصيلة

.) class.cpp ( ىف ملف كود الفصيلة ) implement code ( 2- يتم تفصيل الكود

.keyPressEvent)QKeyEvent *( مثال للدالة -

.shift والتى ستقوم بفعل معني عند الضغط عىل مفتاح

: class.h 1- ىف امللف class classname

{

.....

protected:

void keyPressEvent)QKeyEvent *(;

};

: class.cpp 2- ىف امللف void classname::keyPressEvent)QKeyEvent *key(

{

if)key->key)( == Qt::Key_Shift(

{

do somthing.....

}

}

QtGui Module وحدة مكونات واجهة املستخدم الرسومية

Page 101: Qt in Arabic

100

: ) Event Filter Function ( دالة الفلرت لألحداث

هى دالة تقوم بعمل فلرت ألحداث معينة، والسامح بتمرير تلك األحداث أو عدم متريرها.

وتعرف دوال الفلرت لألحداث بالفصيلة بثالث خطوات:

1- يتم تشغيل الدالة installEventFilter للكائن املراد فلرتة أحداثه.

.protected داخل النطاق املحمى ) class.h ( 2- توضع الدالة ىف ملف تعريف الفصيلة

.) class.cpp ( ىف ملف كود الفصيلة ) implement code ( 3- يتم تفصيل الكود

مثال:

:class.cpp 1- ىف امللف classname:: classname)..( {

ui->textEdit->installEventFilter)this(;

}

: class.h 2- ىف امللف class classname

{

.....

protected:

bool eventFilter)QObject *, QEvent *(;

};

: class.cpp 3- ىف امللف bool classname::eventFilter)QObject *obj, QEvent *event( {

if )obj == ui->textEdit( {

if )event->type)( == QEvent::KeyPress( {

QKeyEvent *ke = static_cast>QKeyEvent *>)event(;

if )ke->key)( == Qt::Key_A( return true;

else return false;

}

} return QWidget::eventFilter)this,event(;

}

textEdit تشغيل فلرت األحداث للكائن

ميرر كام ،void النوع من وليست bool النوع من الدالة أن نالحظ

لها قيمتني هام )الكائن و نوع الحدث(، وعند تشغيل الدالة بواسطة

العملية رقم 1 فإن جميع األحداث التى تخص الكائن متر مسبقا عىل

الفلرت، فإذا عاد الفلرت بالقيمة true منع الحدث أو false مرر الحدث

إذا كان الكائن هو textEdit فسوف تراجع أحداثه و غري ذلك مير.

الحدث KeyPress هو ما نريده بالفلرت و غري ذلك مير

فسوف A مفتاح عىل الضغط هو الحدث كان إذا

يرجع القيمة true، وبالتاىل مينع الحدث وال تستطيع

،textEdit داخل الكائن A كتابة الحرف

أى false القيمة ترد آخر مفتاح أى عىل بالضغط و

متر دون الفلرت.

QtGui Module وحدة مكونات واجهة املستخدم الرسومية

Page 102: Qt in Arabic

101

QWidget الرسم داخل

،paintEvent هو حدث يسمى QWidget وكام ذكرنا أن الرسم داخل الفصيلة

وبالتاىل للرسم داخل الفصيلة QWidget يتم تعريف الحدث Event ) دوال األحداث (كام

،QPainter قمنا برشحه سابقا، ثم نستخدم للرسم الفصيلة

. QWidget وسيقوم املثال التاىل بتوضيح كيفية الرسم داخل الفصيلة

،QWidget سنقوم بإنشاء تطبيق رسومى يرث الفصيلة

،widget.h ىف امللف protected داخل النطاق paintEvent وإعالن دالة الحدث

.widget.cpp ىف امللف paintEvent داخل دالة الحدث QPainter وإعالن دالة الرسم

widget.h#include >QWidget>

class Widget : public QWidget

{

Q_OBJECT

......

protected:

void paintEvent)QPaintEvent *(; >------ paintEvent اإلعالن عن دالة الحدث

......

};

widget.cpp

void Widget::paintEvent)QPaintEvent *p( >------ paintEvent دالة الحدث

{

QPainter pp)this(; >------ QPainter إلدارة فصيلة من النوع pp اإلعالن عن املتغري

QPen pen; >------ QPen إلدارة فصيلة من النوع pen اإلعالن عن املتغري

QColor color)10,100,100(; >------ QColor إلدارة فصيلة من النوع color اإلعالن عن املتغري

pen.setColor)color(; >------ pen للقلم color إستخدام اللون

pp.setPen)pen(; >------ pp للرسام pen إستخدام القلم

pp.save)(; >------ حفظ وضع اإلحداثيات

EXAmpleNO 24

QtGui Module وحدة مكونات واجهة املستخدم الرسومية

Page 103: Qt in Arabic

102

widget.cpp

pp.translate)100,100(; >------ )100 ، 100( إىل اإلحداثيات ) نقل اإلحداثيات ) 0 ، 0

pp.drawLine)0,0,100,0(; >------ ) 0 ، 100 ( إىل ) رسم خط من ) 0 ، 0

pp.translate)100,0(; >------ )0 ، 100 (نقل اإلحداثيات إىل

pp.rotate)90(; >------ دوران اإلحداثيات 90 درجة

pp.drawLine)0,0,100,0(; >------ ) 0 ، 100 ( إىل ) رسم خط من ) 0 ، 0

pp.translate)100,0(;

pp.rotate)90(;

pp.drawLine)0,0,100,0(;

pp.translate)100,0(;

pp.rotate)90(;

pp.drawLine)0,0,100,0(;

pp.restore)(; >------ إسرتجاع وضع اإلحداثيات

QBrush br; >------ QBrush من الفصيلة br إشتقاق

br.setColor)color(; >------ br للرشاش color إستخدام اللون

br.setStyle)Qt::Dense7Pattern(; >------ إختيار شكل الرشاش

pp.fillRect)0,0,100,100,br(; >------ br رش مساحة املربع بواسطة الرشاش

pen.setWidth)3(; >------ 3 عند القيمة Pen Width وضع سمك القلم

pp.setPen)pen(; >------ pen إعادة إستخدام الرسام للقلم

pp.drawEllipse)100,0,100,100(; >------ رسم دائرة

pp.setRenderHint)QPainter::Antialiasing , true(; >------ تشغيل خاصية منع التعريجات

pp.drawEllipse)200,0,100,100(; >------ رسم دائرة

}

ويجب مالحظة الفرق بني الدائرتني ىف املثال السابق، وتأثري خاصية منع التعريجات Antialiasing عىل الدائرة الثانية.

وسنقوم اآلن برشح الفصيلة QPainter وبعض خصائصها.

QtGui Module وحدة مكونات واجهة املستخدم الرسومية

Page 104: Qt in Arabic

103

نسب الفصيلة :

فصيلة مستقلة

تعريف الفصيلة :

.QWidget هذه الفصيلة هى الفصيلة املسؤولة عن الرسم داخل

: ) Declaration ( طريقة العـــالن

QPainter mypaint) QPaintDevice * device (;

،QPaintDecice التعامل والرسم عىل أى فصيلة ترث فصيلة QPainter ميكن لفصيلة

وفصيلة QWidget هى إحدى هذه الفصائل.

وظائف الفصيلة :

تحتوى هذه الفصيلة عىل عدد كبري من الوظائف :

: ) Settings ( إعدادات الرسم -

اللون والخط ) نوع وسمك ( وخلفية الرسم.

: ) Drawing ( أشكال الرسم -

رسم الكلامت والنقط والخطوط واملربعات والدوائر ورسم املسارات لتكوين أشكال معقدة.

: ) Rendering Quality ( دقة الرسم -

.Antialiasing تقدم الفصيلة دوال لتحديد دقة الرسم، ومن أهمها خاصية مضاد التعرجات

:) Coordinate Transformations ( تحريك اإلحداثيات -

واإلنتقال ،) Rotate ( والدوران ،) Scale ( الرسم مقياس مثل اإلحداثيات مع التعامل

) Translate (، كام ميكننا حفظ الوضع الحاىل لإلحداثيات بالدالة ) save ( ، ثم عمل عمليات

معينة عىل اإلحداثيات من نقل أو دوران، ثم إسرتجاع وضع اإلحداثيات املحفوظة بواسطة الدالة

) restore (، ذلك باإلضافة إىل وظائف أخرى كثرية.

QPainter Class

QtGui Module وحدة مكونات واجهة املستخدم الرسومية

Page 105: Qt in Arabic

104

نسب الفصيلة :

QWidget ترث فصيلة

تعريف الفصيلة :

ترث هذه الفصيلة خصائص فصيلة QWidget، وتضيف عليها بعض الخصائص الجديدة

التطبيق، ويكون نافذة خالل الفصيلة تقوم بفتح لها صفات خاصة، وهذه نافذة لتجعل منها

الغرض منها إجراء عملية قصرية وصغرية ملساعدة التطبيق، وهناك نوعان من النوافذ :

.) Modal Dialogs , Modeless Dialogs ( نوافذ مرشوطة، ونوافذ غري مرشوطة

: ) Modal Dialogs ( النوافذ املرشوطة

هى نوافذ تتوقف عند ظهورها جميع نوافذ التطبيق منتظرة القيمة املردودة أو الراجعة

.Rejected أو بالرفض Accepted منها، و تكون القيمة املردودة باإليجاب

ومثال عىل هذه النوافذ :

نافذة فتح ملف ) Open File ( ، نافذة املوافقة أو الرفض عىل العمليات التى يقوم بها

.) Ok , Cancel ( التطبيق، والتى تحتوى هذه املفتاحني

:) Modeless Dialogs ( النوافذ غري املرشوطة

هى نوافذ يتم ظهورها بجانب النوافذ األخرى للتطبيق، وال ينتظر التطبيق منها رد سواء

كان باإليجاب أو بالرفض.

مثال عىل هذه النوافذ :

نوافذ البحث ) Find ( ، اإلستبدال ) Replace ( ىف تطبيقات معالجة النصوص.

: ) Declaration ( طريقة العـــالن

تتم طريقة التعريف.

QDialog mydialog) QWidget * parent = 0(;

وظائف الفصيلة :

ىف النوافذ املرشوطة يتم إرجاع القيمة عن طريق الدالة )(exec، وهذه القيمة قد تكون

.Rejected أو بالرفض Accepted باملوافقة

- يتم إرجاع القيمة Accepted عند الضغط عىل مفتاح Ok أو ضغط Enter من لوحة املفاتيح.

- يتم إرجاع القيمة Rejected عند الضغط عىل مفتاح Cancel أو ضغط ESC من لوحة املفاتيح.

QDialog Class

QtGui Module وحدة مكونات واجهة املستخدم الرسومية

Page 106: Qt in Arabic

105

مثال: نريد فتح نافذة Qwidget تسمح بفتح نافذة مرشوطة Modal Dialog وإستقبال نص

منها يكتب بداخلها.

.widget من النوع QtCreator نقوم بفتح مرشوع جديد باألداة -

- نقوم بإضافة فصيلة رسومية جديدة كاآلىت:

،file من القامئة newfile or project إختيار

،Files And Classes من القامئة Qt Designer Form Class ثم إختيار

،Dialog with Buttons ثم إختيار

.myDialog ثم تسمية الفصيلة

ObjectName:

retvallbl

ObjectName:

opendlgbtn

ObjectName:

sendldt

QtGui Module وحدة مكونات واجهة املستخدم الرسومية

Page 107: Qt in Arabic

106

ستقوم األداة Qt Creator بتوليد األكواد الالزمة، وسنذكر هنا فقط األكواد املضافة

داخل امللفات.

الدالة on_opendlgbtn_clicked هى دالة اإلستقبال

opendlgbtn الخاصة بالكائن clicked لدالة اإلرسال

عند الضغط ) clicked ( عىل املفتاح ) opendlgbtn ( يتم تنفيذ الكود الداخىل للدالة.

myDialog mydlg)this(;

.myDialog إلدارة فصيلة mydlg اإلعالن عن املتغري

if)mydlg.exec)( == true(

ui->retvallbl->setText)mydlg.retval)((;

.cancel عند الضغط عىل false و ،ok عند الضغط عىل true تساوى mydlg.exec الدالة

... >-------widget.h ملف

#include “mydialog.h“

...

class Widget : public QWidget

{

.....

private slots:

void on_opendlgbtn_clicked)(;

...

};

void Widget::on_opendlgbtn_clicked)( >-------widget.cpp ملف

{

myDialog mydlg)this(;

if)mydlg.exec)( == true(

ui->retvallbl->setText)mydlg.retval)((;

}

EXAmpleNO 25

QtGui Module وحدة مكونات واجهة املستخدم الرسومية

Page 108: Qt in Arabic

107

.QLineEdit الذى يرث الفصيلة sndldt إلرجاع القيمة التى ستكتب داخل الكائن retval دالة

................................................................................

.Modal Dialog كنافذة مرشوطة QDialog املثال السابق يوضح كيفية إنشاء فصيلة

وإلنشاء فصيلة QDialog كنافذة غري مرشوطة Modeless Dialog، لن نقوم بإستعامل الدالة

)(exec حيث ميكن كتابة الكود كاآلىت:

................................................................................

class myDialog : public QDialog >-------mydialog.hملف

{

..

public:

...

QString retval)(;

...

};

QString myDialog::retval)( >-------mydialog.cppملف

{

return this->ui->sendldt->text)(;

}

void Widget::on_opendlgbtn_clicked)( >-------widget.cpp ملف

{

myDialog *mydlg = new myDialog )this(;

mydlg->show)(;

}

QtGui Module وحدة مكونات واجهة املستخدم الرسومية

Page 109: Qt in Arabic

108

نسب الفصيلة :

QWidget ترث فصيلة

تعريف الفصيلة :

تتعامل هذه الفصيلة مع الفصائل اآلتية:

.Menu Bar - رشيط القوائم

.QWidget وهى ترث ،QMenuBar يشتق من الفصيلة

.Tool Bar رشيط األدوات -

.QWidget وهى ترث ،QToolBar يشتق من الفصيلة

.Status Bar - رشيط الحالة

.QWidget وهى ترث ،QStatusBar يشتق من الفصيلة

.Dock Widget - سطح مكتب مساعد

.QWidget وهى ترث ،QDockWidget يشتق من الفصيلة

.Central Widget - سطح مكتب التطبيق

.QWidget يشتق من فصيلة

QMainWindow Class

QtGui Module وحدة مكونات واجهة املستخدم الرسومية

Page 110: Qt in Arabic

109

Menu Bar رشيط القوائم

يشتق من الفصيلة QMenuBar، وهى ترث الفصيلة QWidget، ويحتوى رشيط القوائم

والقوائم القوائم أن عنارص، حيث عدة منها يتفرع قوائم أو عىل العنارص من عىل مجموعة

.QAction والعنارص ترث فصيلة ،QMenuBar املتفرعة ترث فصيلة

مثال : إنشاء قامئة File تحتوى عىل عنارص Open , Save , Save as ، وتحتوى عىل قامئة متفرعة

.new File1 , new File2 التى تحتوى عىل عنارص ،New

لتكون القامئة بالشكل التاىل:

actionNew_File1 = new QAction)MainWindow(;

actionNew_File2 = new QAction)MainWindow(;

actionOpen = new QAction)MainWindow(;

actionSave = new QAction)MainWindow(;

actionSave_as = new QAction)MainWindow(;

menuBar = new QMenuBar)MainWindow(;

menuFile = new QMenu)menuBar(;

menuNew = new QMenu)menuFile(;

MainWindow->setMenuBar)menuBar(;

menuBar->addAction)menuFile->menuAction)((;

menuFile->addAction)menuNew->menuAction)((;

menuFile->addAction)actionOpen(;

menuFile->addAction)actionSave(;

menuFile->addAction)actionSave_as(;

menuNew->addAction)actionNew_File1(;

menuNew->addAction)actionNew_File2(;

}}}

إنشاء العنارص

إنشاء القوائم

إضافة العنارص داخل القوائم

EXAmpleNO 26

QtGui Module وحدة مكونات واجهة املستخدم الرسومية

Page 111: Qt in Arabic

110

Tool Bar رشيط األدوات

يشتق من الفصيلة QToolBar، وهى ترث الفصيلة QWidget، ويحتوى رشيط األدوات

عىل عنارص ترث فصيلة QAction، حيث ميكن إضافة نفس العنارص التى تحتويها القوائم إىل

رشيط األدوات، وميكن إظهار هذه العنارص ىف شكل أيقونات أو كتابة.

ليكون رشيط األدوات بالشكل التاىل:

Status Bar رشيط الحالة

يشتق من الفصيلة QStatusBar، وهى ترث الفصيلة QWidget، ويظهر ىف أسفل النافذة

،showMessage وتعرض به الرسائل الخاصة بحالة التطبيق، وتعرض هذه الرسائل بواسطة الدالة

.clearMessage ومتسح بواسطة الدالة

مثال عىل ذلك : إظهار حالة حفظ البيانات، أو إستدعائها أثناء تشغيل التطبيق.

actionNew_File1 = new QAction)MainWindow(;

actionNew_File2 = new QAction)MainWindow(;

actionOpen = new QAction)MainWindow(;

actionSave = new QAction)MainWindow(;

actionSave_as = new QAction)MainWindow(;

mainToolBar = new QToolBar)MainWindow(;

MainWindow->addToolBar)Qt::TopToolBarArea, mainToolBar(;

mainToolBar->addAction)actionOpen(;

mainToolBar->addAction)actionSave(;

mainToolBar->addAction)actionSave_as(;

mainToolBar->addAction)actionNew_File1(;

mainToolBar->addAction)actionNew_File2(;

}

}}

إنشاء العنارص

إنشاء رشيط األدوات

إضافة العنارص داخل رشيط األدوات

QtGui Module وحدة مكونات واجهة املستخدم الرسومية

Page 112: Qt in Arabic

111

Dock Widget سطح املكتب املساعد

إليها ويضاف ،QWidget الفصيلة ترث وهى QDockWidget الفصيلة من يشتق

أى فصيلة ترث فصيلة QWidget ، وميكن وضعها ىف أى إتجاه من اإلتجاهات األربعة للنافذة

.MainWindow

Qt::LeftDockWidgetArea

Qt::RightDockWidgetArea

Qt::TopDockWidgetArea

Qt::BottomDockWidgetArea

وتعرف كاآلىت:

;)QDockWidget *docw = new QDockWidget)MainWindow

;)MainWindow->addDockWidget)Qt::RightDockWidgetArea , docw

Central Widget سطح مكتب التطبيق

الكائن إضافة يتم و الرئيسية، التطبيق صفحة وهو ،QWidget فصيلة من يشتق

QWidget إىل النافذة MainWindow داخل Central widget عن طريق الدالة

mainwindow->setCentralWidget)QWidget *mywidget(;

: mainwindow وهناك نوعني من النوافذ الرئيسية

.SDI ) Single Document Interface ( نافذة ذات وثيقة واحدة -

.MDI ) Multiple Document Interface ( نافذة متعددة الوثائق -

: SDI النافذة ذات الوثيقة الواحدة

هى نافذة تطبيق تتعامل مع ملف أو وثيقة واحدة فقط، وتنشأ عن طريق وضع أى

فصيلة منحدرة من QWidget كسطح مكتب CentralWidget للتطبيق.

: MDI النافذة متعددة الوثائق

هى نافذة تطبيق تتعامل مع أكرث من ملف أو وثيقة عىل نفس سطح املكتب، وتنشأ عن

طريق وضع فصيلة QMdiArea كسطح مكتب CentralWidget للتطبيق.

MainWindows ملحوظة : األكواد ىف األمثلة السابقة كانت لتوضيح كيفية بناء النوافذ الرئيسية

.Qt Designer ولكن ميكن بناء النافذة ووضع كل مميزاتها من خالل األداة ،

QtGui Module وحدة مكونات واجهة املستخدم الرسومية

Page 113: Qt in Arabic

112

SDI ) Single Document Interface ( نافذة ذات وثيقة واحدة

MDI ) Multiple Document Interface ( نافذة متعددة الوثائق

QtGui Module وحدة مكونات واجهة املستخدم الرسومية

Page 114: Qt in Arabic

113

إدارة التخطيط

Layout Managment

Layout Managment إدارة التخطيط

Page 115: Qt in Arabic

114Layout Managment إدارة التخطيط

Page 116: Qt in Arabic

115

املقصود بإدارة التخطيط هو كيفية تخطيط النافذة من حيث أماكن وضع الكائنات

عند أو الشاشة بحجم التطبيق نافذة تكبري عند يحدث وماذا بينها، واملسافات الرسومية

،GUI تصغريها، ومبعنى آخر هو كيفية ضبط الكائنات الرسومية عىل واجهة التطبيق الرسومية

ويتم التحكم ىف قياس وصالحية ووضعية الكائن الرسومى عىل الواجهة الرسومية من خالل :

.Object Geometry قياسات الكائن الرسومى -

.Layout التخطيط -

.Size Policy صالحيات مقاييس الكائن -

:Object Geometry أوال قياسات الكائن الرسومى

لكل فصيلة QWidget ) الفصيلة األساسية للمكونات الرسومية ( عدة دوال مختصة

بقياسات الكائن الرسومى من إرتفاع ، عرض ، أصغر إرتفاع ، أصغر عرض ، أكرب إرتفاع وأكرب

عرض، وتحسب القياسات بالنقطة ) Pixel ( عىل الشاشة.

دالة وضع قياس الكائن طول وعرض.

setGeometry ) int x, int y, int w, int h (

إحداثيات بداية رسم الكائن عىل الشاشة x , y

عرض الكائن w

إرتفاع الكائن h

setMaximumHeight ) int maxh (

أقىص إرتفاع للكائن maxh

setMaximumWidth ) int maxw (

أقىص عرض للكائن maxw

setMinimumHeight ) int minh (

أقل إرتفاع للكائن minh

setMinimumWidth ) int minw (

أقل عرض للكائن minw

Layout Managment إدارة التخطيط

Page 117: Qt in Arabic

116

:Layout ثانيا التخطيط

يتم تخطيط الواجهة الرسومية للمحافظة عىل شكل التطبيق و إظهاره بأفضل صورة،

إنكامش أو متدد عند وذلك الرسومية، الكائنات ترتيب و املسافات من كال تتغري ما فدامئا

النافذة التى تحتويهم، ولذلك قامت كيوت بعمل عدة فصائل لتقوم بضم الكائنات الرسومية

داخل تخطيط معني، وطرحت كيوت أربعة نظم للتخطيط :

.Horizontal Layout - تخطيط أفقى

.Vertical Layout - تخطيط رأىس

.Grid Layout - تخطيط شبىك

.Form Layout - تخطيط عىل شكل إستامرة

: Horizontal Layout تخطيط أفقى

تتم عملية التخطيط األفقى بإستخدام الفصيلة QHBoxLayout، ثم إضافة املكونات

الرسومية لها كعنارص لتقوم برتتيبهم ترتيبا أفقيا عىل مسافات متساوية.

مثال:

QWidget *window = new QWidget; >------- window إنشاء النافذة

QPushButton *button1 = new QPushButton)“One”(;

QPushButton *button2 = new QPushButton)“Two”(;

QPushButton *button3 = new QPushButton)“Three”(;

QPushButton *button4 = new QPushButton)“Four”(;

QPushButton *button5 = new QPushButton)“Five”(;

QHBoxLayout *layout = new QHBoxLayout; >------- layout إنشاء املخطط األفقى

layout->addWidget)button1(;

layout->addWidget)button2(;

layout->addWidget)button3(;

layout->addWidget)button4(;

layout->addWidget)button5(;

window->setLayout)layout(; >-------window داخل النافذة layout وضع املخطط األفقى

window->show)(;

}}

إنشاء املفاتيح

وضع املفاتيح داخل املخطط األفقى

EXAmpleNO 27

Layout Managment إدارة التخطيط

Page 118: Qt in Arabic

117

: Vertical Layout تخطيط رأىس

تتم عملية التخطيط الرأىس بإستخدام الفصيلة QVBoxLayout، ثم إضافة املكونات

الرسومية لها كعنارص لتقوم برتتيبهم ترتيبا رأسيا عىل مسافات متساوية.

.QVBoxLayout بالفصيلة QHBoxLayout مثال: نفس املثال السابق مع إستبدال الفصيلة

: Grid Layout تخطيط شبىك

تتم عملية التخطيط الشبىك بإستخدام الفصيلة QGridLayout، ثم إضافة املكونات

الرسومية لها كعنارص لتقوم برتتيبهم ىف صفوف و أعمدة عىل مسافات متساوية.

ولذلك يتم إدخال الكائنات الرسومية لها مع رقم الصف و رقم العمود. addWidget ) QWidget * widget, int row, int column(;

: Form Layout تخطيط عىل شكل إستامرة

ثم ،QFormLayout الفصيلة بإستخدام إستامرة شكل عىل التخطيط عملية تتم

إضافة املكونات الرسومية لها كعنارص لتقوم برتتيبهم عىل شكل إستامرة ىف صفوف، و لها أكرث

من طريقة إلدخال العنارص، ومن هذه الطرق : addRow ) const QString & labelText, QWidget * field (;

setWidget ) int row, ItemRole role, QWidget * widget (;

فصائل التخطيط Layout Classes ليست لديها فقط إمكانية إحتواء الكائنات الرسومية، ولكن

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

من املفاتيح أفقيا ثم إنشاء مخطط رأىس و نضم له املخططني األفقيني.QHBoxLayout *H1_layout = new QHBoxLayout;

QHBoxLayout *H2_layout = new QHBoxLayout;

QVBoxLayout *V_layout = new QHBoxLayout;

V_layout ->addLayout)H1_layout(;

V_layout ->addLayout)H2_layout(;

مبجرد أن يصبح الكائن ضمن فصيلة تخطيط Layout تقوم الفصيلة بحسابات معينة ينتج عنها

.Size Policy للكائن، والذى يستخدم من قبل SizeHint ما يسمى بالحجم املفرتض

Layout Managment إدارة التخطيط

Page 119: Qt in Arabic

118

:Size Policy ثالثا صالحيات مقاييس الكائن

قياساته، تثبيت أو اإلنكامش، التمدد، عىل الكائن قدرة ىف الصالحيات هذه تتمثل

وخصصت الفصيلة QSizePolicy لتكوين الصالحيات املطلوبة، ومن ثم إعطاء هذه الصالحيات

للكائن أو ألكرث من كائن عن طريق الدالة :

setSizePolicy ) QSizePolicy (

:QSizePolicy لتكوين الصالحية املطلوبة بواسطة

QSizePolicy sizePolicy;

.QSizePolicy إلدارة فصيلة من النوع sizePlolicy إعالن املتغري

sizePolicy. setHorizontalPolicy ) Policy policy (

تقوم هذه الدالة بوضع الصالحية policy ىف اإلتجاه األفقى للكائن.

sizePolicy. setVerticalPolicy ) Policy policy (

تقوم هذه الدالة بوضع الصالحية policy ىف اإلتجاه الرأىس للكائن.

sizePolicy.setHorizontalStretch)uchar stretchFactor(;

تقوم هذه الدالة بوضع معامل التمدد stretchFactor ىف اإلتجاه األفقى للكائن.

sizePolicy.setVerticalStretch)uchar stretchFactor(;

تقوم هذه الدالة بوضع معامل التمدد stretchFactor ىف اإلتجاه الرأىس للكائن.

ما هى الصالحية policy ؟ وما هو معامل التمدد stretchFactor ؟

................................................................................

Layout Managment إدارة التخطيط

Page 120: Qt in Arabic

119

:Policies الصالحيات

،Layout تخطيط فصيلة ضمن الكائن يصبح عندما فقط الصالحيات هذه تعمل

فبمجرد وضع الكائن داخل فصيلة تخطيط تقوم الفصيلة بحسابات معينة ينتج عنها ما يسمى

بالحجم املفرتض SizeHint للكائن، وبناءا عىل هذا الحجم املفرتض من إدارة التخطيط تتحرك

.SizeHint تلك الصالحيات من خالل إلتزامها بهذا الحجم املفرتض

الشـــــــــــــــــــــــــــــــــرحالصالحيــــــــــــة

QSizePolicy::Fixedالحجم املفرتض SizeHint هو الحجم اإللزامى،

.SizeHint وغري مسموح للكائن أن يتضخم أو ينكمش عن الحجم املفرتض

QSizePolicy::Minimum

الحجم املفرتض SizeHint هو الحجم األصغر،

وميكن للكائن أن يتمدد، وغري مسموح له أن يقل حجمه عن الحجم املفرتض

.SizeHint

QSizePolicy::Maximum

الحجم املفرتض SizeHint هو الحجم األكرب،

وميكن للكائن أن ينكمش، وغري مسموح له أن يزيد حجمه عن الحجم املفرتض

.SizeHint

QSizePolicy::Preferred

الحجم املفرتض SizeHint هو الحجم األفضل،

وميكن للكائن أن ينكمش أو يتمدد ويظل مقبوال، وىف الغالب ال حاجة لجعله

)QWidget هذا هو اإلختيار اإلفرتاىض لكل ( .SizeHint أكرب من الحجم املفرتض

QSizePolicy::Expanding

الحجم املفرتض SizeHint هو الحجم املعقول،

وميكن للكائن أن ينكمش ويظل مقبوال ، وميكنه أيضا إستخدام مساحة إضافية

للتمدد، لذلك يجب أن يرتك للكائن مساحة قدر املستطاع.

QSizePolicy::MinimumExpanding

الحجم املفرتض SizeHint هو الحجم األصغر و الكاىف،

للكائن يرتك أن يجب لذلك للتمدد، إضافية مساحة إستخدام للكائن وميكن

مساحة قدر املستطاع.

QSizePolicy::Ignoredالحجم املفرتض SizeHint يتم تجاهله،

سيحاول الكائن إستخدام أكرب مساحة ممكنة للتمدد.

................................................................................

Layout Managment إدارة التخطيط

Page 121: Qt in Arabic

120

:stretchFactor معامل التمدد

القيمة اإلفرتاضية ملعامل التمدد ) stretchFactor ( تساوى 0، وبالتاىل فعند محاولة

متديد نافذة التطبيق سوف تتمدد كل الكائنات الرسومية بنفس املقياس.

أما إذا كانت قيمة معامل التمدد ) stretchFactor ( للكائن X تساوى 1،

وقيمة املعامل للكائن Y تساوى 2،

.X ضعف املساحة التى يأخذها الكائن Y فعند التمدد دامئا ما سيأخذ الكائن

. Qt Designer الجدير بالذكر أنه ميكن القيام بجميع ما سبق من خالل الداة

Notes ............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

Layout Managment إدارة التخطيط

Page 122: Qt in Arabic

121

السحب و السقاط

Drag and Drop

Drag and Drop السحب و اإلسقاط

Page 123: Qt in Arabic

122Drag and Drop السحب و اإلسقاط

Page 124: Qt in Arabic

123

املعلومات نقل تتيح خاصية هى Drag And Drop اإلسقاط و السحب خاصية

الخاصة بالكائنات الرسومية أو النصية بني تطبيق و آخر أو داخل التطبيق الواحد، حيث يتم

الفأرة ) mouse (، ثم تحريكه إىل مكان اإلمساك بالكائن ) object ( املراد سحبه بواسطة

الكائن ) object ( املراد إسقاطه عليه.

و تتطلب هذه العملية اآلىت:

.) Drag ( موافقة الكائن املراد سحبه عىل إجراء عملية السحب -

.) Drop ( موافقة الكائن املراد اإلسقاط عليه عىل إجراء عملية اإلسقاط -

وميكننا مالحظة أن هذه الخاصية تستخدم بالفعل بني الكثري من الربامج بسهولة تامة،

وتستخدم أيضا عىل أنظمة تشغيل مختلفة، والسبب ىف ذلك أن خاصية السحب و اإلسقاط

تقوم بنقل البيانات بهيكلة ثابتة و موحدة بني التطبيقات، فمعظم أنظمة التشغيل تتعامل مع

.) Multipurpose Internet Mail Extensions ( MIME البيانات بنظام

وألن MIME يعترب هو النظام القياىس، فإن كيوت تتعامل به ىف نقل البيانات داخل

خاصية السحب و اإلسقاط، ونذكر أيضا أن لكل نظام تشغيل طريقته الخاصة ىف التعامل مع

نقل البيانات، لذا أنتجت كيوت فصيلتني للتعامل مع النظام ) ويندوز ( و النظام ) ماك (،

.MIME وتقوم الفصيلتني بالتحويل ما بني األنظمة الخاصة لنقل البيانات و النظام

تتم عملية السحب و اإلسقاط عىل ثالثة مراحل:

- سحب الكائن بالضغط عليه بالفأرة.

- تحريك الكائن متجها إىل مكان اإلسقاط.

- إسقاط الكائن أو إلغاء العملية.

ومبا ،Event لألحداث وفقا تتم العمليات جميع أن السابقة الخطوات من نالحظ

الرسومية QWidget عبارة عن مساحة مستطيلة ترسم عىل للكائنات الفصيلة األساسية أن

الشاشة وتتفاعل مع األحداث ) Events (، فإن عملية السحب واإلسقاط ما هى إال واحدة من

.QWidget هذه األحداث التى تتعامل معها

................................................................................

Drag and Drop السحب و اإلسقاط

Page 125: Qt in Arabic

124

األحداث التى تخص عملية السحب و اإلسقاط :

الختصـــــــــــــــــــــــاص فصيلــة الحـــدثالحــــــدث

dragEnterEventQDragEnterEvent.يحدث عند بدأ عملية السحب و اإلسقاط

dragLeaveEventQDragLeaveEvent.يحدث عند إلغاء عملية السحب و اإلسقاط

dragMoveEventQDragMoveEvent.يحدث أثناء عملية السحب و اإلسقاط

dropEventQDropEvent.يحدث عند إنتهاء عملية السحب و اإلسقاط

ما هو النظام MIME؟

هى طريقة تستخدم لنقل البيانات من و إىل الربيد اإلكرتوىن، وهى تعتمد عىل إرسال

رأس البيانات إذا كانت نصية ) text/plain ( أو صورة ) image/jpeg (...إلخ ومن ثم إرسالها،

ولقد إعتمدت كيوت هذا النظام ىف نقل البيانات لخاصية السحب و اإلسقاط، ونؤكد مرة أخرى

أن هذه العملية تقوم بسحب و إسقاط البيانات فقط.

: MIME ملزيد من املعلومات عن

http://www.iana.org/assignments/media-types/

ما هى خطوات سحب كائن رسومى و إسقاطه ىف مكان آخر؟

اإلجابة :

- عند السحب :

نأخذ من الكائن كل ما نحتاجه من بيانات،

.MIME ثم منرر هذه البيانات بواسطة النظام

- عند اإلسقاط نتعامل مع البيانات بإحدى الطريقتني:

نقوم بإنشاء كائن جديد يحمل البيانات املمررة من النظام MIME ومسح الكائن القديم،

أو نقوم بتعديل الكائن القديم وفقا لوضع اإلسقاط الجديد.

................................................................................

Drag and Drop السحب و اإلسقاط

Page 126: Qt in Arabic

125

.Drag and Drop مثال لفهم و تطبيق خاصية السحب و اإلسقاط

املطلوب عمل نافذة بها ثالثة كائنات QLabel، وميكن سحب أى منهم و إسقاطه ىف مكان أخر.

.Qt Designer ونرسم التاىل ىف QWidget سنبدأ تطبيق رسومى

حيث :

Box 1:

Class : QLabel.

ObjectName : label.

Box 2:

Class : QLabel.

ObjectName : label_2.

Box 3:

Class : QLabel.

ObjectName : label_3.

................................................................................

Drag and Drop السحب و اإلسقاط

Page 127: Qt in Arabic

126

widget.h#ifndef WIDGET_H

#define WIDGET_H

#include >QWidget>

#include >QLabel>

namespace Ui {

class Widget;

}

class Widget : public QWidget

{

Q_OBJECT

public:

explicit Widget)QWidget *parent = 0(;

~Widget)(;

QWidget *DragedLabel; >------ الذى يتم سحبه QLabel مؤرش للكائن

QLabel *DropedLabel; >------ الذى يتم إسقاطه QLabel مؤرش للكائن

private:

Ui::Widget *ui;

protected:

void mousePressEvent)QMouseEvent *(; >------ لربمجة ما يحدث عند الضغط عىل الفأرة

void dragEnterEvent)QDragEnterEvent *(; >------ لربمجة ما يحدث عند بداية عملية السحب

void dropEvent)QDropEvent *(; >------ لربمجة ما يحدث عند عملية اإلسقاط

};

#endif // WIDGET_H

EXAmpleNO 28

Drag and Drop السحب و اإلسقاط

Page 128: Qt in Arabic

127

widget.cpp#include “widget.h“

#include “ui_widget.h“

#include >QMouseEvent>

#include >QStringList>

Widget::Widget)QWidget *parent( : QWidget)parent(, ui)new Ui::Widget(

{

ui->setupUi)this(;

this->setAcceptDrops)true(; >------ هذه الدالة رضورية لجعل حدث السحب و اإلسقاط متاح لهذه النافذة

}

Widget::~Widget)(

{

delete ui;

}

void Widget::mousePressEvent)QMouseEvent *event(

{

if )event->button)( == Qt::LeftButton(

{

DragedLabel = childAt)event->pos)((;

if)!DragedLabel( return;

if )DragedLabel->inherits)“QLabel“( == true(

{

QString labelName = DragedLabel->objectName)( ;

QString labelText = static_cast>QLabel*> )DragedLabel(->text)(;

QString transferText = labelName + “---“ + labelText;

QDrag *drag = new QDrag)this(;

QMimeData *mimeData = new QMimeData;

mimeData->setText)transferText(;

drag->setMimeData)mimeData(;

drag->exec)(;

}

}

}

Drag and Drop السحب و اإلسقاط

Page 129: Qt in Arabic

128

void Widget::dragEnterEvent)QDragEnterEvent *event(

{

if )event->mimeData)(->hasFormat)“text/plain“((

event->acceptProposedAction)(;

}

void Widget::dropEvent)QDropEvent *event(

{

QStringList strlist;

strlist = event->mimeData)(->text)(.split)“---“(;

DropedLabel = this->findChild>QLabel *>)strlist[0](;

DropedLabel->setGeometry) event->pos)(.x)(-75,event->pos)(.y)(-25,150,50 (;

DropedLabel->setText)strlist[1](;

event->acceptProposedAction)(;

}

رشح الكود السابق

void Widget::mousePressEvent)QMouseEvent *event(

هى الدالة املسؤولة عن حدث الضغط عىل الفأرة.

if )event->button)( == Qt::LeftButton(

ىف حالة الضغط عىل الزر األيرس للفأرة.

DragedLabel = childAt)event->pos)((;

event->pos)( حيث أن الدالة ،event->pos)( سيكون املؤرش للكائن اإلبن املوجود عند DragedLabel

تقوم بإرجاع اإلحداثيات X,Y ملكان ضغط الفأرة عىل الشاشة، وتقوم الدالة childAt بإيجاد الكائن اإلبن

) ابن بالنسبة للنافذة ( املوجود بتلك اإلحداثيات.

if)!DragedLabel( return;

نقوم بإختبار املؤرش DragedLabel، فإذا كان خاويا ينهى الحدث وال يفعل شئ.

Drag and Drop السحب و اإلسقاط

Page 130: Qt in Arabic

129

if )DragedLabel->inherits)“QLabel“( == true(

.QLabel إذا كان يشري إىل كائن يرث الفصيلة ،DragedLabel نقوم بإختبار املؤرش

QString labelName = DragedLabel->objectName)( ;

QString labelText = static_cast>QLabel*> )DragedLabel(->text)(;

QString transferText = labelName + “---“ + labelText;

تجهيز البيانات التى سيتم إرسالها بواسطة MIME، حيث يتم إرسال نص يحتوى عىل كال من ) اسم الكائن

والنص املوجود بداخله (، وعىل سبيل املثال وبإستخدام الكود السابق:

. ”label_2---Box 2” سيصبح النص املجهز لإلرسال label_2 عند سحب الكائن

QDrag *drag = new QDrag)this(;

.QDrag إلدارة فصيلة سحب drag اإلعالن عن املتغري

QMimeData *mimeData = new QMimeData;

.QMimeData إلدارة فصيلة mimeData اإلعالن عن املتغري

mimeData->setText)transferText(;

.text/plain وهو من النوع .mimeData إدخال النص املراد إرساله ملؤرش الفصيلة

drag->setMimeData)mimeData(;

إدخال مؤرش الفصيلة mimeData ملؤرش الفصيلة ليتم إستعامل mimeData عند عملية السحب.

drag->exec)(;

تنفيذ عملية السحب.

..................................................................................................................

void Widget::dragEnterEvent)QDragEnterEvent *event(

هى الدالة املسؤولة عن حدث ) بدأ السحب ( .

if )event->mimeData)(->hasFormat)“text/plain“((

event->acceptProposedAction)(;

.text/plain من النوع MIME إذا كانت نوع البيانات املنقولة بواسطة

يتم املوافقة عىل إجراء العملية.

Drag and Drop السحب و اإلسقاط

Page 131: Qt in Arabic

130

void Widget::dropEvent)QDropEvent *event(

هى الدالة املسؤولة عن حدث ) إنتهاء عملية السحب و اإلسقاط ( .

QStringList strlist;

.QStringList إلدارة فصيلة من النوع strlist اإلعالن عن املتغري

strlist = event->mimeData)(->text)(.split)“---“(;

الدالة )event->mimeData)(->text) تقوم بإستقبال البيانات املرسلة .

ولنفرض أن النص املرسل ”label_2---Box 2” سيتم فصله بـ )”---”(split إىل :

.) objectname ( وهو ميثل اسم الكائن strlist[0]= label_2

.) objecttext ( وهو ميثل النص املوجود داخل الكائن strlist[1]= Box 2

DropedLabel = this->findChild>QLabel *>)strlist[0](;

.MIME املرسل من ) objectname ( يشري إىل الكائن الذى يحمل األسم DropedLabel

DropedLabel->setGeometry) event->pos)(.x)(-75,event->pos)(.y)(-25,150,50 (;

تغيري إحداثيات الكائن ووضعه ىف اإلحداثيات X,Y الخاصة مبكان حدث اإلسقاط.

DropedLabel->setText)strlist[1](;

إضافة النص للكائن.

event->acceptProposedAction)(;

يتم املوافقة عىل إمتام العملية.

................................................................................

Drag and Drop السحب و اإلسقاط

Page 132: Qt in Arabic

131

عرض البيانات

طريقة منوذج / عرض

Model/View programmig

Model/View Programming عرض البيانات

Page 133: Qt in Arabic

132Model/View Programming عرض البيانات

Page 134: Qt in Arabic

133

طريقة منوذج /عرض ) Model / View Programming ( هى طريقة عرض البيانات

من خالل فصائل الواجهة الرسومية لكيوت.

ىف اإلصدارات السابقة لكيوت ) ما قبل اإلصدار 4.4 ( كانت كيوت تقوم بعرض البيانات

من خالل فصائل تقوم بتخزين البيانات وعرضها أيضا ىف نفس الوقت، و منذ اإلصدار 4.4 قامت

كيوت بتغيري امليكانيكية الخاصة بعرض البيانات وطبقت طريقة منوذج / عرض.

تعتمد هذه الطريقة ىف األساس عىل الفصل ما بني الفصائل التى تقدم منوذج البيانات

والفصائل التى تقوم بعرضها، وهذا الفصل يتيح حرية التعامل مع الفصائل التى تقدم منوذج

البيانات عىل أكرث من فصيلة عرض دون الحاجة إىل نسخ البيانات، حيث ميكن عرض نفس

البيانات داخل كال منها، مام يؤدى إىل تقليل إستهالك الذاكرة.

تكوين الهيكل األساىس لطريقة منوذج / عرض :

.Models النامذج -

.Views العرض -

.QModelIndex املؤرش-

Data

Model

View

Index

Editing

Model/View Programming عرض البيانات

Page 135: Qt in Arabic

134

السليم النموذج فصيلة وإختيار البيانات، تحليل طريق عن تتم العمل ميكانيكية

الربط ويتم البيانات، لعرض النموذج فصيلة مع بالربط العرض فصائل تقوم ثم إلحتوائها،

. ) Signals and Slots ( بإستخدام دوال اإلرسال و اإلستقبال

:Models النامذج

الفصيلة QAbstractItemModel هى فصيلة البنية األساسية املكونة لفصائل النامذج،

والتى تقوم بجلب البيانات سواء من قاعدة بيانات أو مبارشة من ملف أو من أى وحدة إدخال

بيانات، ثم وضعها ىف منوذج أو شكل معني.

وكمثال عىل ذلك نقوم بالتعامل مع ثالثة مناذج للبيانات :

.List Model منوذج القامئة-

.Table Model منوذج الجدول-

.Tree Model منوذج الشجرة-

فإذا كان لدينا بيانات مثل قامئة أسامء فيمكن وضعها ىف منوذج القامئة، أما إذا كان لدينا بيانات

مثل أسامء منتجات ، أسعار، تاريخ إنتاج فيمكن وضعها ىف منوذج الجدول،

وتعترب بيانات امللفات واملجلدات هى أشهر أمثلة لنموذج الشجرة.

Model/View Programming عرض البيانات

Page 136: Qt in Arabic

135

وتأىت كيوت مبجموعة فصائل جاهزة ترث الفصيلة QAbstractItemModel لتتعامل

مع معظم أشكال البيانات ومنها:

: QStringListModel

.QString وتستسخدم لحفظ وإدارة قامئة من العنارص النصية

: QStandardItemModel

وتستخدم لحفظ وإدارة البيانات التى تتخذ شكل جدول أو شجرى،

ويستخدم معها فصيلة QStandardItem إلدارة العنارص داخل الجدول.

: QFileSystemModel

وهى فصيلة خاصة تقدم البيانات الخاصة مبلفات و مجلدات النظام.

: QSqlQueryModel, QSqlTableModel, and QSqlRelationalTableModel

.) SQL ( وهى مجموعة فصائل إلدارة البيانات من قواعد البيانات

ماذا إذا كان شكل البيانات املراد التعامل معها التأخذ أى من األشكال السابقة ؟

ىف هذه الحالة ميكن عمل النموذج ) Model ( الخاص بك عن طريق توليد فصيلة

ترث الفصيلة QAbstractItemModel، وبها شكل أو هيكل البيانات الذى تريد.

................................................................................

Model/View Programming عرض البيانات

Page 137: Qt in Arabic

136

:Views العـــرض

الفصيلة QAbstractItemView هى فصيلة البنية األساسية املكونة لفصائل العرض ،

والتى تقوم بالربط مع فصائل النامذج ) Models ( لجلب البيانات، وتقوم كذلك بعرضها عىل

شاشة املستخدم، وتقدم لنا كيوت فصائل مختلفة لعرض البيانات منها:

: QListView

تقوم بعرض قامئة عنارص.

: QTableView

تقوم بعرض عنارص

ىف منوذج جدول.

: QTreeView

تقوم بعرض عنارص

ىف منوذج شجرى.

Model/View Programming عرض البيانات

Page 138: Qt in Arabic

137

: QModelIndex املؤرش

النموذج داخل ما عنرص إىل باإلشارة تقوم فصيلة هى QModelIndex الفصيلة

Model، وذلك للوصول إىل العنرص املطلوب لتغيري قيمته أو مسحه أو للقيام بأى إجراء آخر.

Models Classes، ويحدد مكان النامذج الفصيلة مع جميع فصائل وتتعامل هذه

QModelIndex)( حيث ، ) root و التفرع Column والعمود Row العنرص بثالث قيم ) السطر

متثل الفرع الرئيىس، ونقتبس هذا الجزء من امللفات املساعدة اآلتية مع كيوت.

QModelIndex index = model->index) Row , Column , root (; تعرف بالصيغة التالية

QModelIndex indexA =

model->index)0, 0, QModelIndex)((;

indexA تشري إىل املكان A وهو بالسطر 0 و العمود 0.

QModelIndex indexB =

model->index)1, 1, QModelIndex)((;

indexB تشري إىل املكان B وهو بالسطر 1 و العمود 1.

QModelIndex indexC =

model->index)2, 1, QModelIndex)((;

indexC تشري إىل املكان C وهو بالسطر 2 و العمود 1.

QModelIndex indexA =

model->index)0, 0, QModelIndex)((;

indexA تشري إىل املكان A وهو بالسطر 0 و العمود 0.

QModelIndex indexC =

model->index)2, 1, QModelIndex)((;

indexC تشري إىل املكان C وهو بالسطر 2 و العمود 1.

QModelIndex indexB =

model->index)1, 0, indexA(;

indexB تشري إىل املكان B وهو بالسطر 1 و العمود 0 من

.indexA التفرع

Model/View Programming عرض البيانات

Page 139: Qt in Arabic

138

لتطبيق بعض األمثلة البسيطة عىل طريقة منوذج/عرض سنقوم بفتح مرشوع جديد

عىل Qt Creator من النوع QWidget لكل مثال،

.widget.cpp وسنقوم بالتعديل فقط ىف ملف

widget.cpp :أوال : تكوين وعرض قامئة عنارص #include “widget.h“

#include “ui_widget.h“

#include >QStringListModel>

#include >QListView>

#include >QStandardItem>

#include >QModelIndex>

Widget::Widget)QWidget *parent( :QWidget)parent(,ui)new Ui::Widget(

{

ui->setupUi)this(;

QStringList strlist;

strlist >> “mohamed“ >> “ali“ >> “ahmed“ >> “samier“ >> “sami“;

QStringListModel *mymodel = new QStringListModel;

mymodel->setStringList)strlist(;

QListView *myview = new QListView)this(;

myview->setModel)mymodel(;

QModelIndex myindex;

mymodel->insertRow)mymodel->rowCount)((;

myindex = mymodel->index)mymodel->rowCount)(-1(;

mymodel->setData)myindex,“new item inserted“(;

myindex = mymodel->index)2(;

mymodel->setData)myindex, “item modified“(;

}

EXAmpleNO 29

Model/View Programming عرض البيانات

Page 140: Qt in Arabic

139

رشح الكود السابق

QStringList strlist;

strlist >> “mohamed“ >> “ali“ >> “ahmed“ >> “samier“ >> “sami“;

.QString إنشاء قامئة تضم عنارص من النوع

QStringListModel *mymodel = new QStringListModel;

،QStringListModel إلدارة فصيلة mymodel اإلعالن عن املتغري

وهى تقدم منوذج مصمم إلحتواء قامئة عنارص .

mymodel->setStringList)strlist(;

.mymodel للنموذج strlist إدخال قامئة العنارص

QListView *myview = new QListView)this(;

اإلعالن عن املتغري myview إلدارة فصيلة QListView، وهى مصممة لعرض منوذج قامئة عنارص .

myview->setModel)mymodel(;

توجيه النموذج mymodel إىل كائن عرض النموذج myview ليقوم بعرضه.

QModelIndex myindex;

اإلعالن عن املتغري myindex إلدارة فصيلة QModelIndex، وهى تقوم باإلشارة إىل العنارص .

mymodel->insertRow)mymodel->rowCount)((;

.mymodel إضافة سطر جديد ىف آخر النموذج

01234

mohamedali

ahmedsamiersami

01234

mohamedali

ahmedsamiersami

5

Model/View Programming عرض البيانات

Page 141: Qt in Arabic

140

myindex = mymodel->index)mymodel->rowCount)(-1(;

.mymodel يشري إىل آخر سطر بالنموذج myindex

mymodel->setData)myindex,“new item inserted“(;

وضع البيان new intem inserted ىف املكان املشار إليه بواسطة myindex، وهو آخر سطر بالنموذج.

myindex = mymodel->index)2(;

تغيري myindex ليشري إىل السطر رقم 2 بالنموذج ، ويعترب السطر الثالث ألن العد يبدأ من 0 ، 1 ، 2 ،..

mymodel->setData)myindex, “item modified“(;

وضع البيان item modified ىف املكان املشار إليه بواسطة myindex وهو السطر الثالث بالنموذج.

01234

mohamedali

ahmedsamiersami

5myindex

01234

mohamedali

ahmedsamiersami

5 new item insertedmyindex

01234

mohamedali

ahmedsamiersami

5 new item inserted

myindex

01234

mohamedali

samiersami

5 new item inserted

myindex

Model/View Programming عرض البيانات

Page 142: Qt in Arabic

141

widget.cpp :ثانيا : تكوين وعرض عنارص ىف جدول #include “widget.h“

#include “ui_widget.h“

#include >QStandardItemModel>

#include >QTableView>

#include >QStandardItem>

#include >QModelIndex>

Widget::Widget)QWidget *parent( :QWidget)parent(,ui)new Ui::Widget(

{

ui->setupUi)this(;

QList>QStandardItem*> itemlist;

itemlist >> new QStandardItem)“append 1“(;

itemlist >> new QStandardItem)“append 2“(;

itemlist >> new QStandardItem)“append 3“(;

itemlist >> new QStandardItem)“append 4“(;

QStandardItemModel *mymodel = new QStandardItemModel;

mymodel->setColumnCount)3(;

for)int i = 0 ; i > 6 ;i++(

{

for)int j = 0 ; j > mymodel->columnCount)( ;j++(

{

mymodel->setItem)i,j,new QStandardItem) QString)“member %0,%1“(.arg)i(.arg)j( ((;

}

}

mymodel->appendRow)itemlist(;

QTableView *myview = new QTableView)this(;

myview->setGeometry)0,0,500,300(;

myview->setModel)mymodel(;

QModelIndex myindex;

myindex = mymodel->index)2,2(;

mymodel->setData)myindex,“modified“(;

}

EXAmpleNO 30

Model/View Programming عرض البيانات

Page 143: Qt in Arabic

142

رشح الكود السابق

QList>QStandardItem*> itemlist;

itemlist >> new QStandardItem)“append 1“(;

itemlist >> new QStandardItem)“append 2“(;

itemlist >> new QStandardItem)“append 3“(;

itemlist >> new QStandardItem)“append 4“(;

.QStandardItem إنشاء قامئة تضم عنارص من النوع

QStandardItemModel *mymodel = new QStandardItemModel;

،QStandardItemModel إلدارة فصيلة mymodel اإلعالن عن املتغري

وهى تقدم منوذج مصمم إلحتواء عنارص داخل جدول أو عىل شكل شجرى.

mymodel->setColumnCount)3(;

وضع عدد أعمدة النموذج وهى 3 أعمدة.

QListView *myview = new QListView)this(;

اإلعالن عن املتغري myview إلدارة فصيلة QListView، وهى مصممة لعرض منوذج قامئة عنارص.

for)int i = 0 ; i > 6 ;i++( {

for)int j = 0 ; j > mymodel->columnCount)( ; j++ ( {

mymodel->setItem) i , j

,new QStandardItem) QString)“member %0,%1“(.arg)i(.arg)j( ((;

}

}

كود تكرارى لوضع العنارص بالرتتيب داخل كل خلية،

حيث يتكون لدينا جدول من 6 صفوف و 3 أعمدة و إضافة عنرص لكل خلية.

1

2

3

45

6

1member 0,0

member 1,0

member 2,0

member 3,0

member 4,0

member 5,0

member 0,1

member 1,1

member 2,1

member 3,1

member 4,1

member 5,1

member 0,2

member 1,2

member 2,2

member 3,2

member 4,2

member 5,2

2 3

Model/View Programming عرض البيانات

Page 144: Qt in Arabic

143

mymodel->appendRow)itemlist(;

إضافة سطر ىف آخر النموذج يحتوى عىل قامئة العنارص itemlist، ونالحظ هنا أن عدد أعمدة الجدول

ثالثة، و عدد العنارص بالقامئة itemlist أربعة، وبالتاىل فعند اإلضافة سيقوم النموذج بإضافة عمود رابع

.itemlist تلقائيا ليحتوى العنرص الرابع من القامئة

QTableView *myview = new QTableView)this(;

اإلعالن عن املتغري myview إلدارة فصيلة QTableView، وهى مصممة لعرض عنارص داخل جدول.

myview->setGeometry)0,0,500,300(;

لتحديد حجم رسم الجدول عىل الشاشة.

myview->setModel)mymodel(;

توجيه النموذج mymodel إىل كائن عرض النموذج myview ليقوم بعرضه.

QModelIndex myindex;

اإلعالن عن املتغري myindex إلدارة فصيلة QModelIndex وهى تقوم باإلشارة إىل العنارص .

myindex = mymodel->index)2,2(;

. mymodel ليشري إىل العنرص املوجود بالصف 2 و العمود 2 داخل النموذج myindex توجيه

mymodel->setData)myindex,“modified“(;

.modified للقيمة myindex تغيري قيمة العنرص املشار إليه بواسطة

1

2

3

45

6

1member 0,0

member 1,0

member 2,0

member 3,0

member 4,0

member 5,0

member 0,1

member 1,1

member 2,1

member 3,1

member 4,1

member 5,1

member 0,2

member 1,2

member 2,2

member 3,2

member 4,2

member 5,2

2 3 4

7 append 1 append 2 append 3 append 4

Model/View Programming عرض البيانات

Page 145: Qt in Arabic

144

widget.cpp :ثالثا : تكوين وعرض عنارص عىل شكل شجرى#include “widget.h“

#include “widget.h“

#include “ui_widget.h“

#include >QStandardItemModel>

#include >QTreeView>

#include >QStandardItem>

#include >QModelIndex>

#include >QDebug>

Widget::Widget)QWidget *parent( :QWidget)parent(,ui)new Ui::Widget(

{

ui->setupUi)this(;

QList>QStandardItem*> itemlist;

itemlist >> new QStandardItem)“append 1“(;

itemlist >> new QStandardItem)“append 2“(;

itemlist >> new QStandardItem)“append 3“(;

itemlist >> new QStandardItem)“append 4“(;

QStandardItemModel *mymodel = new QStandardItemModel;

mymodel->setColumnCount)2(;

QModelIndex myindex ;

for)int i = 0 ; i > 3 ;i++({

QStandardItem *item = new QStandardItem) QString)“item %0“(.arg)i( ( ;

mymodel->setItem)i,item(;

item->setColumnCount)2(;

item->insertRow)0,new QStandardItem(;

for)int j = 0 ; j > item->columnCount)( ;j++({

myindex = mymodel->index)0,j,item->index)((;

mymodel->setData)myindex,QString)“item %0,%1“(.arg)i(.arg)j( (;

}

}

mymodel->appendRow)itemlist(;

QTreeView *myview = new QTreeView)this(;

myview->setGeometry)0,0,500,300(;

myview->setModel)mymodel(;

}

EXAmpleNO 31

Model/View Programming عرض البيانات

Page 146: Qt in Arabic

145

رشح الكود السابق

QList>QStandardItem*> itemlist;

itemlist >> new QStandardItem)“append 1“(;

itemlist >> new QStandardItem)“append 2“(;

itemlist >> new QStandardItem)“append 3“(;

itemlist >> new QStandardItem)“append 4“(;

.QStandardItem إنشاء قامئة تضم عنارص من النوع

QStandardItemModel *mymodel = new QStandardItemModel;

،QStandardItemModel إلدارة فصيلة mymodel اإلعالن عن املتغري

وهى تقدم منوذج مصمم إلحتواء عنارص داخل جدول أو عىل شكل شجرى .

mymodel->setColumnCount)2(;

وضع عدد أعمدة النموذج وهى عدد 2 عمود

QModelIndex myindex;

اإلعالن عن املتغري myindex من فصيلة QModelIndex، وهى تقوم باإلشارة إىل العنارص .

for)int i = 0 ; i > 3 ;i++({

QStandardItem *item = new QStandardItem) QString)“item %0“(.arg)i( ( ;

اإلعالن عن املتغري item إلدارة فصيلة QStandardItem، وهى متثل عنرص جديد.

mymodel->setItem)i,item(;

.i داخل النموذج ىف القامئة الرئيسية ىف السطر item يتم وضع العنرص

1 2

1 2item 0

Model/View Programming عرض البيانات

Page 147: Qt in Arabic

146

item->setColumnCount)2(;

.item يتم تحديد عدد 2 عمود للعنرص

item->insertRow)0,new QStandardItem(;

.item إضافة سطر فرعى من سطر العنرص

for)int j = 0 ; j > item->columnCount)( ; j++ ({

myindex = mymodel->index)0,j,item->index)((;

.item املتفرعني من العنرص j لتشري إىل العنرص عند السطر 0 ، العمود myindex توجيه

mymodel->setData)myindex,QString)“item %0,%1“(.arg)i(.arg)j( (;

.myindex وضع القيمة املطلوبة عند العنرص املشار إليه بواسطة

}

}

بعد نهاية العملية التكرارية السابقة نحصل عىل اآلىت:

1 2item 0

item 0,0 item 0,1

1 2item 0

item 0,0 item 0,1

item 1item 1,0 item 1,1

item 2item 2,0 item 2,1

Model/View Programming عرض البيانات

Page 148: Qt in Arabic

147

mymodel->appendRow)itemlist(;

إضافة سطر ىف آخر النموذج يحتوى عىل قامئة العنارص itemlist ، ونالحظ هنا أن عدد أعمدة الجدول

إثنان، و عدد العنارص بالقامئة itemlist أربعة، وبالتاىل فعند اإلضافة سيقوم النموذج بإضافة عمودين

.itemlist ثالث و رابع تلقائيا ليحتوى العنرص الرابع من القامئة

QTreeView *myview = new QTreeView)this(;

اإلعالن عن املتغري myview إلدارة فصيلة QTreeView، وهى مصممة لعرض عنارص عىل شكل شجرى.

myview->setGeometry)0,0,500,300(;

لتحديد حجم رسم الجدول عىل الشاشة.

myview->setModel)mymodel(;

توجيه النموذج mymodel إىل كائن عرض النموذج myview ليقوم بعرضه.

................................................................................

1 2item 0

item 0,0 item 0,1

item 1item 1,0 item 1,1

item 2item 2,0 item 2,1

3 4

append 1 append 2 append 3 append 4

Model/View Programming عرض البيانات

Page 149: Qt in Arabic

148

هناك بعض الفصائل املرتبطة بعرض البيانات بأسلوب منوذج / عرض والتى مل نتطرق

لها بالرشح، مثل فصيلة QAbstractItemDelegate، وفصيلة QStyledItemDelegate، وهى

.QtDemo تقوم بعرض وتعديل البيانات رسوميا، ويوجد لها أمثلة عديدة داخل

Notes...........................................................................................................................................................................................................

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

.......................................................................................................................................................................................................... .

Model/View Programming عرض البيانات

Page 150: Qt in Arabic

149

الرسم ىف كيوت

Graphics View

Framework

Graphics View Framework الرسم ىف كيوت

Page 151: Qt in Arabic

150Graphics View Framework الرسم ىف كيوت

Page 152: Qt in Arabic

151

: Graphics View Framework الرسم ىف كيوت

، 2D ما نتحدث عنه اآلن هى الطريقة التى تعتمدها كيوت ىف الرسم ثناىئ األبعاد

وتعتمد هذه الطريقة عىل نفس إسلوب منوذج / عرض ) Model / View ( ىف إدارة العنارص،

العمل والفصائل الطريقة يلزمنا معرفة ميكانيكية بالرسم ثناىئ األبعاد بهذه ولنقوم

املطلوب التعامل معها.

هناك ثالث فصائل أساسية ال غنى عنها لتكوين هيكل متكامل للرسم ثناىئ األبعاد:

: ) QGraphicsScene Class ( فصيلة املشهد-

هى الفصيلة املسؤولة عن إحتواء و إدارة العنارص الرسومية.

: ) QGraphicsView Class ( فصيلة العرض-

هى الفصيلة املسؤولة عن عرض املشهد الكىل أوجزء منه.

: ) QGraphicsItem Class ( فصيلة العنارص الرسومية-

.QGraphicsScene هذه الفصيلة يتم التعامل معها كعنارص داخل الفصيلة

scene املشهد العام

View شاشة العرض

،QGraphicsScene ويتم التعامل معه من خالل الفصيلة ،Scene الصورة الكلية هى املشهد العام

،QGraphicsItem ويتم التعامل معه من خالل الفصيلة ،Item وأى رسم بداخلها هو عنرص

،QGraphicsView ويتم التعامل معه من خالل الفصيلة ،View وشاشة العرض للمشهد هى

،View هو موجود بالذاكرة، ويتم عرضه من خالل scene ويجب مالحظة أن املشهد العام

.Scene لعرض أى جزء من املشهد View وميكن أيضا تحريك شاشة العرض

Graphics View Framework الرسم ىف كيوت

Page 153: Qt in Arabic

152

نسب الفصيلة :

QObject ترث فصيلة

تعريف الفصيلة :

هى الفصيلة املسؤولة عن إحتواء وإدارة العنارص الرسومية،

ومتتاز هذه الفصيلة بالخواص اآلتية :

- قدرتها الرسيعة ىف إدارة أعداد كبرية جدا من العنارص الرسومية قد تصل إىل عدة ماليني

من العنارص.

- قيامها بنقل األحداث ) نقر الفأرة أو لوحة املفاتيح ( لكل عنرص رسومى.

- قيامها بإدارة حالة العنرص الرسومى من تحديد و إختيار.

: ) Declaration ( طريقة العـــالن

QGraphicsScene scene;

وظائف الفصيلة :

تحتوى هذه الفصيلة عىل مجموعة كبرية من الدوال الخاصة بإضافة العنارص الرسومية،

.addEllipse أو شكل بيضاوى ، addRect مستطيل ، addLine مثل إضافة خط

كام أن بها دالة addItem التى ميكن عن طريقها إضافة أى عنرص رسومى منحدر من

.Scene للمشهد QGraphicsItem الفصيلة

وبها أيضا الدالة ) item) x , y التى تقوم بإسرتجاع العنرص الرسومى املوجود باإلحداثيات

.Scene ودوال أخرى كثرية إلدارة العنارص الرسومية املوجودة داخل املشهد ،) x , y (

................................................................................

QGraphicsScene Class

Graphics View Framework الرسم ىف كيوت

Page 154: Qt in Arabic

153

نسب الفصيلة :

QAbstractScrollArea ترث فصيلة

QFrame ترث QAbstractScrollArea و

QWidget ترث QFrame و

تعريف الفصيلة :

هى الفصيلة املسؤولة عن عرض املشهد الكىل أو جزء منه، وهى مبثابة شاشة العرض

لفصيلة املشهد Scene، حيث أن فصيلة املشهد تكون ىف ذاكرة الجهاز وال تعرض عىل الشاشة،

ويتم عرضها من خالل هذه الفصيلة QGraphicsView، وبالتاىل ميكن لهذه الفصيلة عرض كامل

املشهد أو عرض جزء منه، وذلك عىل حسب املساحة املخصصة للعرض.

: ) Declaration ( طريقة العـــالن

QGraphicsView view;

وظائف الفصيلة :

من الدوال األساسية الخاصة بهذه الفصيلة الدالة setScene، وهى الدالة الخاصة بوضع

فصيلة املشهد داخل فصيلة العرض.

ودوال أخرى هدفها هو التحكم التام ىف جميع خصائص عرض املشهد من دوران شاشة

العرض أو عمل تكبري أو تصغري للمشهد.

................................................................................

QGraphicsView Class

Graphics View Framework الرسم ىف كيوت

Page 155: Qt in Arabic

154

نسب الفصيلة :

فصيلة مستقلة

تعريف الفصيلة :

.QGraphicsScene هذه الفصيلة يتم التعامل معها كعنارص داخل الفصيلة

: ) Declaration ( طريقة العـــالن

QGraphicsItem item;

وظائف الفصيلة :

هذه الفصيلة هى فصيلة البنية األساسية ألى عنرص رسومى ميكن وضعه داخل فصيلة

املشهد Scene، وال تستقبل فصيلة املشهد أى نوع آخر من العنارص.

للرسومات QGraphicsItem الفصيلة من مشتقة فصائل عدة كيوت قدمت وقد

األساسية مثل:

- فصيلة QGraphicsLineItem ترث فصيلة QGraphicsItem : لرسم الخطوط.

- فصيلة QGraphicsRectItem ترث فصيلة QGraphicsItem : لرسم املستطيالت.

- فصيلة QGraphicsTextItem ترث فصيلة QGraphicsItem : لرسم الحروف.

إضافتها ويتم به، الخاصة الرسم فصيلة بعمل املربمج يقوم عندما تأىت الفصيلة وأهمية هذه

كعنرص لفصيلة املشهد.

فيمكن مثال إنتاج فصيلة ترث فصيلة QGraphicsItem، وتقوم برسم سيارة، وبالتاىل ميكن إضافة

رسم السيارة للمشهد والتعامل معه كعنرص.

وتتعامل هذه الفصيلة مع العنرص من دوران أو تكبري أو تصغري، فهى تقوم بالعمل عىل العنرص

فقط وال دخل لها باملشهد أو إحداثيات املشهد.

................................................................................

QGraphicsItem Class

Graphics View Framework الرسم ىف كيوت

Page 156: Qt in Arabic

155

widget.cpp#include “widget.h“

#include “ui_widget.h“

#include >QtGui>

Widget::Widget)QWidget *parent( :

QWidget)parent(,

ui)new Ui::Widget(

{

ui->setupUi)this(;

QGraphicsScene *scene = new QGraphicsScene)0,0,2000,2000,this(;

scene->addRect)QRectF)0, 0, 100, 100((;

scene->addRect)QRectF)1800, 1800, 100, 100((;

QGraphicsView *view1 = new QGraphicsView)scene,this(;

view1->setGeometry)0,0,250,250(;

view1->setSceneRect)0,0,200,200(;

QGraphicsView *view2 = new QGraphicsView)scene,this(;

view2->setGeometry)251,0,250,250(;

view2->setSceneRect)1800,1800,200,200(;

QGraphicsView *view3 = new QGraphicsView)scene,this(;

view3->setGeometry)502,0,250,250(;

QGraphicsItem *item = scene->itemAt)50, 50(;

item->rotate)10(;

}

Qt Creator لتطبيق بعض األمثلة البسيطة عىل الرسم سنقوم بفتح مرشوع جديد عىل

. QWidget من النوع

.widget.cpp وسنقوم بالتعديل فقط ىف ملف

EXAmpleNO 32

Graphics View Framework الرسم ىف كيوت

Page 157: Qt in Arabic

156

رشح الكود السابق

QGraphicsScene *scene = new QGraphicsScene)0,0,2000,2000,this(;

اإلعالن عن املتغري scene إلدارة فصيلة QGraphicsScene، وهى عبارة عن املشهد الذى سيتم العمل

عليه، وقد تم إدخال مساحة املشهد وهى عرض 2000 نقطة و إرتفاع 2000 نقطة.

scene->addRect)QRectF)0, 0, 100, 100((;

إضافة مربع للمشهد يبدأ من اإلحداثيات ) 0 ، 0 ( وعرضه 100 نقطة وإرتفاعه 100 نقطة.

scene->addRect)QRectF)1800, 1800, 100, 100((;

إضافة مربع للمشهد يبدأ من اإلحداثيات ) 1800 ، 1800 ( وعرضه 100 نقطة وإرتفاعه 100 نقطة.

وال ننىس أننا ال نرى املشهد عىل الشاشة إال من خالل فصيلة العرض QGraphicsView، وهذا املشهد يتم

تكوينه ىف ذاكرة الجهاز، وسيكون املشهد املفرتض كالتاىل:

( 0 , 0 ) ( 2000 , 0 )

( 0 , 2000 ) ( 2000 , 2000 )

( 100 , 100 )

( 1800 , 1800 )

Scene

Graphics View Framework الرسم ىف كيوت

Page 158: Qt in Arabic

157

QGraphicsView *view1 = new QGraphicsView)scene,this(;

.scene لتكون مبثابة شاشة عرض للمشهد QGraphicsView إلدارة فصيلة view1 اإلعالن عن املتغري

view1->setGeometry) 0 , 0 , 250 , 250 (;

باإلحداثيات ووضعها ) نقطة 250 إرتفاع ، نقطة 250 عرض ( view1 العرض شاشة مساحة تحديد

.widget 0 ، 0 ( عىل النافذة الرئيسية (

view1->setSceneRect) 0 , 0 , 200 , 200 (;

تحديد املساحة املطلوب عرضها من املشهد، وهى من اإلحداثيات ) 0 ، 0 ( حتى عرض 200 نقطة وإرتفاع

200 نقطة.

عند التشغيل ستظهر شاشة العرض view1 وبها املربع املرسوم ىف أعىل يسار املشهد.

( 100 , 100 ) in scene

( 0 , 0 ) ( 250 , 0 )

( 250 , 250 )( 0 , 250 )

( 0, 0) in scene

view1

Graphics View Framework الرسم ىف كيوت

Page 159: Qt in Arabic

158

QGraphicsView *view2 = new QGraphicsView)scene,this(;

.scene لتكون مبثابة شاشة عرض للمشهد QGraphicsView إلدارة فصيلة view2 اإلعالن عن املتغري

view2->setGeometry) 251 , 0 , 250 , 250 (;

باإلحداثيات ووضعها ) نقطة 250 إرتفاع ، نقطة 250 عرض ( view2 العرض شاشة مساحة تحديد

.view1 لتظهر بجانب نافذة العرض ،widget 0 ، 251 ( عىل النافذة الرئيسية (

view2->setSceneRect) 1800 , 1800 , 200 , 200 (;

تحديد املساحة املطلوب عرضها من املشهد، وهى من اإلحداثيات ) 1800 ، 1800 ( حتى عرض 200 نقطة

وإرتفاع 200 نقطة.

( 1900, 1900) in scene

( 251, 0 ) ( 501, 0 )

( 501, 250 )( 251, 250 )

( 1800, 1800) in scene

view2

Graphics View Framework الرسم ىف كيوت

Page 160: Qt in Arabic

159

QGraphicsView *view3 = new QGraphicsView)scene,this(;

.scene لتكون مبثابة شاشة عرض للمشهد QGraphicsView إلدارة فصيلة view3 اإلعالن عن املتغري

view3->setGeometry) 502 , 0 , 250 , 250 (;

باإلحداثيات ووضعها ) نقطة 250 إرتفاع ، نقطة 250 عرض ( view3 العرض شاشة مساحة تحديد

.view2 لتظهر بجانب نافذة العرض ،widget 0 ، 502 ( عىل النافذة الرئيسية (

نالحظ هنا أنه مل يتم تحديد املساحة املطلوب عرضها من املشهد، وبالتاىل ستقوم view3 بعرض املشهد

كامال، ومبا أن مساحة املشهد ) 2000 7 2000 (، ومساحة شاشة العرض ) 250 7 250 (فقط ،

فسيظهر ىف شاشة العرض رشيط أفقى و رشيط رأىس لتحريك املشهد داخل النافذة.

QGraphicsItem *item = scene->itemAt) 50 , 50 (;

اإلعالن عن املتغري item إلدارة فصيلة QGraphicsItem، والتى تقوم بإلتقاط العنرص املوجود ىف نقطة

إحداثيات املشهد ) 50 ، 50 (، وهو املربع املوجود أعىل يسار املشهد.

item->rotate) 10 (;

.view1 يتم دوران العنرص مبقدار 10 درجات و بالتاىل سرنى هذا الشكل داخل

( 0 , 0 ) ( 250 , 0 )

( 250 , 250 )( 0 , 250 )

view1

Graphics View Framework الرسم ىف كيوت

Page 161: Qt in Arabic

160

( 0 , 0 ) ( 2000 , 0 )

( 0 , 2000 ) ( 2000 , 2000 )

( 100 , 100 )

( 1800 , 1800 )

Scene

ويكون الشكل النهاىئ للمشهد scene داخل الذاكرة كالتاىل :

Graphics View Framework الرسم ىف كيوت

Page 162: Qt in Arabic

161

واجهة الستخدام املتحركة

Animation GUI

Framework

Animation GUI Framework واجهة اإلستخدام املتحركة

Page 163: Qt in Arabic

162Animation GUI Framework واجهة اإلستخدام املتحركة

Page 164: Qt in Arabic

163

: Animation GUI Framework واجهة اإلستخدام املتحركة

واجهة اإلستخدام املتحركة هى واحدة من مميزات كيوت الفريدة، فهذه امليزة تعمل

الكائنات أساىس عىل خصائص بشكل ينصب فعملها الرسومية، الواجهة الحياة عىل إلضفاء

الرسومية من مفاتيح وصناديق نصوص ) Buttons , Text Box ( ...الخ.

وتحتاج هذه الخاصية ىف عملها للبيانات اآلتية:

. ) QObject 1 - الكائن الرسومى املطلوب العمل عليه ) الكائن البد أن يرث

.) Q_PROPERTY ( 2 - خاصية الكائن الرسومى املطلوب العمل عليها

3 - تحديد مدة الحركة و البداية والنهاية، وميكن إضافة مفاتيح keyframe ىف وسط املشهد.

-إمكانية تحريك أكرث من كائن رسومى بإحدى الطريقتني:

- الطريقة التتابعية :

أى إمكانية تحريك الكائنات الرسومية بشكل تتابعى، فال يبدأ الكائن حركته إال بإنتهاء

حركة الكائن السابق له.

- الطريقة املتوازية :

أى إمكانية تحريك الكائنات الرسومية بشكل متوازى، حيث تبدأ جميع الكائنات حركتها

ىف نفس الوقت.

وسوف يتم التعامل مبارشة مع الفصائل اآلتية:

QPropertyAnimation : هى الفصيلة املسؤولة عن تحديد الكائن الرسومى وتحديد حركته.

QSequentialAnimationGroup : تستخدم لتحريك الكائنات الرسومية بشكل تتابعى.

QParallelAnimationGroup : تستخدم لتحريك جميع الكائنات الرسومية بالتوازى زمنيا.

QAbstractAnimation

QObject

QVariantAnimation

QPropertyAnimation

QParallelAinmationGroup

QSequentialAnimationGroup

QAnimationGroup

التسلسل الوراىث لفصائل الحركة

QAnimation Classes

Animation GUI Framework واجهة اإلستخدام املتحركة

Page 165: Qt in Arabic

164

مثال : لدينا مفتاحني QPushButton هام B2 , B1 تم وضعهام عند اإلحداثيات ) 0 ، 0 ( .

املطلوب :

- وضع منوذج الحركة للمفتاح B1 من اإلحداثيات ) 0 ، 0 ( إىل اإلحداثيات ) 150 ، 150 ( مع

زيادة عرض و إرتفاع املفتاح ثم رده إىل اإلحداثيات ) 0 ، 0 ( مرة أخرى خالل 5 ثوان.

- وضع منوذج الحركة للمفتاح B2 من اإلحداثيات ) 0 ، 0 ( إىل اإلحداثيات ) 250 ، 250 ( مع

زيادة عرض و إرتفاع املفتاح خالل 3 ثوان.

- تحريك املفتاحني B2 , B1 متتاليني زمنيا مرة و متوازييا زمنيا مرة أخرى.

،QWidget من النوع Qt Creator سنقوم بفتح مرشوع جديد عىل

.widget.cpp وسنقوم بالتعديل فقط ىف ملف

widget.cppWidget::Widget)QWidget *parent( :QWidget)parent(,ui)new Ui::Widget(

{

ui->setupUi)this(;

QPushButton *B1 = new QPushButton)“Button B1“,this(;

QPushButton *B2 = new QPushButton)“Button B2“,this(;

QPropertyAnimation *B_anim1 = new QPropertyAnimation)B1, “geometry“(;

B_anim1->setDuration)5000(;

B_anim1->setKeyValueAt)0, QRect)0, 0, 150, 30((;

B_anim1->setKeyValueAt)0.8, QRect)150, 150, 200, 60((;

B_anim1->setKeyValueAt)1, QRect)0, 0, 150, 30((;

QPropertyAnimation *B_anim2 = new QPropertyAnimation)B2, “geometry“(;

B_anim2->setDuration)3000(;

B_anim2->setStartValue)QRect)0, 0, 150, 30((;

B_anim2->setEndValue)QRect)250, 250, 200, 60((;

QSequentialAnimationGroup *S_group = new QSequentialAnimationGroup;

S_group->addAnimation)B_anim1(;

S_group->addAnimation)B_anim2(;

S_group->start)(;

}

EXAmpleNO 33

Animation GUI Framework واجهة اإلستخدام املتحركة

Page 166: Qt in Arabic

165

رشح الكود السابق

QPushButton *B1 = new QPushButton)“Button B1“,this(;

QPushButton *B2 = new QPushButton)“Button B2“,this(;

.widget و إدراجهام داخل النافذة QPushButton إلدارة فصيلة B2 , B1 اإلعالن عن املتغريين

QPropertyAnimation *B_anim1 = new QPropertyAnimation)B1, “geometry“(;

اإلعالن عن املتغري B_anim1 إلدارة فصيلة QPropertyAnimation والتى تحدد منوذج الحركة للمفتاح

.B1 الخاصة باملفتاح geometry وسيقوم بالتعامل مع الخاصية B1

B_anim1->setDuration)5000(;

.setDuration يتم تحديد الفرتة الزمنية لكامل الحركة بواسطة الدالة

ويتم إدخال قيمة الزمن بامللىل ثانية، ففى هذا املثال 5000 ملىل ثانية تساوى 5 ثوان.

الدالة ) & setKeyValueAt ) qreal real, const QVariant تستقبل هذه الدالة قيمتني

.B1 الخاصة باملفتاح geometry وهى القيمة التى مترر للخاصية QVariant القيمة

القيمة real وهى تكون ما بني 0 ، 1 حيث 0 هو بداية الحركة و 1 هو نهاية الحركة.

B_anim1->setKeyValueAt) 0 , QRect) 0 , 0 , 150 , 30 ((;

يتم وضع املفتاح B1 عند اإلحداثيات ) 0 ، 0 ( وعرضه 150 نقطة وإرتفاعه 30 نقطة.

-- عند الزمن : ) 5000 7 0 ( = 0 ملىل ثانية / 1000 = 0 ثانية ) بداية الحركة (.

Button B1 30

150

( 0 , 0 )

وضع املفتاح B1 عند الثانية 0 ) أى ىف بداية الحركة (

Animation GUI Framework واجهة اإلستخدام املتحركة

Page 167: Qt in Arabic

166

B_anim1->setKeyValueAt) 0.8 , QRect) 150 , 150 , 200 , 60 ((;

يتم وضع املفتاح B1 عند اإلحداثيات ) 150 ، 150 ( وعرضه 200 نقطة وإرتفاعه 60 نقطة .

-- عند الزمن : ) 5000 7 0.8 ( = 4000 ملىل ثانية / 1000 = 4 ثانية.

B_anim1->setKeyValueAt) 1 , QRect) 0 , 0 , 150 , 30 ((;

يتم وضع املفتاح B1 عند اإلحداثيات ) 0 ، 0 ( وعرضه 150 نقطة وإرتفاعه 30 نقطة

-- عند الزمن : ) 5000 7 1 ( = 5000 ملىل ثانية / 1000 = 5 ثانية ) إنتهاء الحركة (

Button B1 30

150

( 0 , 0 )

وضع املفتاح B1 عند الثانية 5 ) أى ىف نهاية الحركة (

Button B1

( 150 , 150 )

60

200

وضع املفتاح B1 عند الثانية 4 ثانية

Animation GUI Framework واجهة اإلستخدام املتحركة

Page 168: Qt in Arabic

167

QPropertyAnimation *B_anim2 = new QPropertyAnimation)B2, “geometry“(;

اإلعالن عن املتغري B_anim2 إلدارة فصيلة QPropertyAnimation، والتى تحدد منوذج الحركة للمفتاح

.B2 الخاصة باملفتاح geometry وسيقوم بالتعامل مع الخاصية B2

B_anim2->setDuration)3000(;

يتم تحديد الفرتة الزمنية لكامل الحركة 3 ثانية.

B_anim2->setStartValue)QRect)0, 0, 150, 30((;

يتم وضع املفتاح B1 عند اإلحداثيات ) 0 ، 0 ( وعرضه 150 نقطة وإرتفاعه 30 نقطة ىف بداية الحركة.

B_anim2->setEndValue)QRect)250, 250, 200, 60((;

وضع املفتاح B1 عند اإلحداثيات ) 250 ، 250 ( وعرضه 200 نقطة وإرتفاعه 60 نقطة ىف نهاية الحركة.

Button B2 30

150

( 0 , 0 )

Button B2

( 250 , 250 )

60

200

وضع املفتاح B2 عند بداية الحركة

وضع املفتاح B2 عند نهاية الحركة

Animation GUI Framework واجهة اإلستخدام املتحركة

Page 169: Qt in Arabic

168

QSequentialAnimationGroup *S_group = new QSequentialAnimationGroup;

بعرض تقوم والتى ،QSequentialAnimationGroup فصيلة إلدارة S_group املتغري عن اإلعالن

الكائنات الرسومية بتتابع زمنى.

S_group->addAnimation)B_anim1(;

.S_group إىل منظم الحركة B_anim1 إضافة منوذج الحركة

S_group->addAnimation)B_anim2(;

.S_group إىل منظم الحركة B_anim2 إضافة منوذج الحركة

S_group->start)(;

بدأ عرض الحركة.

النتيجة هى حركة املفتاح B1 أوال وتستغرق 5 ثواىن ثم تبدأ حركة B2 وتستغرق 3 ثواىن.

للحركة املتوزية زمنيا ميكننا تغيري سطر واحد فقط ىف الكود السابق لنحصل عىل منوذجني حركة

يبدءا معا زمنيا وينهى املفتاح B2 حركته قبل املفتاح B1 بفارق 2 ثانية.

................................................................................

للحركة املتوازية يتم تغيري سطر الكود

QSequentialAnimationGroup *S_group = new QSequentialAnimationGroup;

بالسطر

QParallelAnimationGroup *S_group = new QParallelAnimationGroup;

Animation GUI Framework واجهة اإلستخدام املتحركة

Page 170: Qt in Arabic

169

QtNetwrok Module

وحدة

فصائل برمجة الشبكات

QtNetwork Module وحدة فصائل برمجة الشبكات

Page 171: Qt in Arabic

170

إدراج

#include <QtNetwork>

داخل ملفات الكود

متطلبات هذه الوحدة

إدراج

QT += network

. project.pro داخل ملف املرشوعQtNetwork Module وحدة فصائل برمجة الشبكات

Page 172: Qt in Arabic

171

برمجة الشبكات هى من أهم العنارص األساسية ألى تطبيق، ونالحظ ىف الوقت الحاىل

املواقع مع تتفاعل التى التطبيقات مثل اإلنرتنت بشبكة ربطها يتم التطبيقات معظم أن

الخادمة، وذلك إلستكشاف تحديثات التطبيق.

ولقد قدمت كيوت كل األدوات الالزمة إلجراء اإلتصاالت ونقل البيانات بني الشبكات،

وأنتجت كيوت عدة فصائل خاصة للتعامل مع برمجة الشبكات منها :

: QHostAddress فصيلة

.IP Address هى الفصيلة املسؤولة عن التعامل مع رقم العنوان الشبىك

: QHostInfo فصيلة

هى الفصيلة املسؤولة عن :

،) HostName ( باسم النطاق ) IP Address ( اإلستدالل عن رقم العنوان الشبىك

.) IP Address ( برقم العنوان الشبىك ) HostName ( أو اإلستدالل عن اسم النطاق

: QTcpSocket فصيلة

هى الفصيلة املسؤولة عن التعامل مع الربط بأجهزة الخوادم Servers ونقل البيانات

.TCP/IP عرب الشبكة بطريقة

: QTcpServer فصيلة

هى الفصيلة املسؤولة عن التعامل مع الربط بأجهزة العمالء Clients وإدارة الروابط

.TCP/IP بينهم ونقل البيانات عرب الشبكة بطريقة

: QUdpSocket فصيلة

.UDP/IP هى الفصيلة املسؤولة عن التعامل مع نقل البيانات عرب الشبكة بطريقة

والجدير بالذكر أن كيوت قد قدمت فصائل أخرى عديدة، ولكننا سنكتفى بتقديم هذه الفصائل

السابقة والتى تكفى لتوضيح ميكانيكية كيوت لربمجة الشبكات بشكل تام.

QtNetwork Module وحدة فصائل برمجة الشبكات

Page 173: Qt in Arabic

172

نسب الفصيلة :

فصيلة مستقلة

تعريف الفصيلة :

،IP Address هى الفصيلة املسؤولة عن التعامل مع رقم العنوان الشبىك

ومن مزاياها:

.IPv6 , IPv4 دعم التعامل مع العناوين من النوع -

- القيام بإستقبال العنوان IP بأى صيغة وتحويله لصيغة أخرى.

وظائف الفصيلة :

الدالة setAddress وتستخدم إلدخال العنوان الشبىك

setAddress )“127.0.0.1“(; وميكن إدخال العنوان كنص

setAddress )34322342334(; أو كرقم

الدالة toIPv4Address وتستخدم لتحويل العنوان الشبىك من نىص إىل رقمى.

QHostAddress myip)“192.168.1.1”(;

qDebug)( >> myip.toIPv4Address)(;

// this print 3232235777

الدالة toString وتستخدم لتحويل العنوان الشبىك من رقمى إىل نىص.

QHostAddress myip)3232235777(;

qDebug)( >> myip.toString)(;

// this print 192.168.1.1

................................................................................

QHostAddress Class

QtNetwork Module وحدة فصائل برمجة الشبكات

Page 174: Qt in Arabic

173

نسب الفصيلة :

فصيلة مستقلة

تعريف الفصيلة :

هى الفصيلة املسؤولة عن :

،) HostName ( باسم الجهاز املضيف ) IP Address ( البحث عن رقم العنوان الشبىك

.) IP Address ( برقم العنوان الشبىك ) HostName ( أو البحث عن اسم الجهاز املضيف

وظائف الفصيلة :

) HostName ( املضيف الجهاز باسم الشبىك العنوان والبحث عن باإلستدالل الفصيلة تقوم

بطريقتني:

الطريقة الوىل : بإستخدام الدالة lookupHost - وكمثال عىل ذلك:

qt.nokia.com إليجاد رقم العنوان الشبىك للجهاز املضيف -

QHostInfo::lookupHost)“qt.nokia.com“,

this, SLOT)printResults)QHostInfo(((;

- إليجاد اسم الجهاز املضيف للعنوان الشبىك 4.2.2.1.

QHostInfo::lookupHost)“4.2.2.1“,

this, SLOT)printResults)QHostInfo(((;

ومتتاز هذه الطريقة بالتعامل بنظام دوال اإلرسال و اإلستقبال ) Signals and Slots (، وبالتاىل

يقوم التطبيق بأداء باقى املهام إىل حني حدوث إرسال إشارة بوجود نتائج لعملية البحث.

الطريقة الثانية : بإستخدام الدالة fromName - وكمثال عىل ذلك:

qt.nokia.com إليجاد رقم العنوان الشبىك للجهاز املضيف -

QHostInfo info = QHostInfo::fromName)“qt.nokia.com“(;

ولكن هذه الطريقة تحدث تجميد للتطبيق إىل حني رجوع الدالة بنتائج، لذلك ال يفضل إستخدامها

ىف التطبيقات ذات الواجهة الرسومية منعا لحدوث تجميد لشاشة التطبيق، ولكن ميكن إستخدامها

.Console ىف تطبيقات الشاشة

QHostInfo Class

QtNetwork Module وحدة فصائل برمجة الشبكات

Page 175: Qt in Arabic

174

QHostInfo , QHostAddress مثال : لتوضيح وظائف

،QWidget من النوع Qt Creator سنقوم بفتح مرشوع جديد عىل

.widget.cpp , widget.h وسنقوم بالتعديل ىف ملف

widget.h#include >QWidget>

#include >QtNetwork> >--------- إضافة الكود

...

class Widget : public QWidget

{

...

public Q_SLOTS: >--------- إضافة الكود

void printResults)QHostInfo info(; >--------- إضافة الكود

};

widget.cpp#include >QtNetwork>

Widget::Widget)QWidget *parent( :QWidget)parent(,ui)new Ui::Widget(

{

ui->setupUi)this(;

QHostAddress ip;

ip.setAddress)“192.168.1.1“(;

qDebug)( >> ip.toString)(;

qDebug)( >> ip.toIPv4Address)(;

QHostInfo::lookupHost)“www.yahoo.com“,

this, SLOT)printResults)QHostInfo(((;

QHostInfo::lookupHost)“69.147.125.65“,

this, SLOT)printResults)QHostInfo(((;

}

void Widget::printResults)QHostInfo info(

{

foreach )QHostAddress addr , info.addresses)((

qDebug)( >> addr.toString)(;

qDebug)( >> info.hostName)(;

}

EXAmpleNO 34

QtNetwork Module وحدة فصائل برمجة الشبكات

Page 176: Qt in Arabic

175

رشح الكود السابق

QHostAddress ip;

.QHostAddress إلدارة الفصيلة ip اإلعالن عن املتغري

ip.setAddress)“192.168.1.1“(;

إعطاء ip القيمة 192.168.1.1 وهى رقم عنوان شبىك تم إدخاله لـ ip كنص.

qDebug)( >> ip.toString)(;

طباعة محتوى العنوان الشبىك املوجود بـ ip كنص .

النتيجة : ”192.168.1.1”

qDebug)( >> ip.toIPv4Address)(;

طباعة محتوى العنوان الشبىك املوجود بـ ip كرقم .

النتيجة : ”3232235777”

QHostInfo::lookupHost)“www.youtube.com“,

this, SLOT)printResults)QHostInfo(((;

تقوم lookupHost بالبحث عن جميع أرقام العناوين الشبكية ) IP Addresses ( الخاصة باسم املضيف

printResults املستقبلة للدالة البيانات بتمرير يقوم أى عنوان ، وعندما يجد www.youtube.com

لتقوم بطبعها.

QHostInfo::lookupHost)“209.85.225.136“,

this, SLOT)printResults)QHostInfo(((;

تقوم lookupHost بالبحث عن اسم املضيف ) Host Name ( صاحب العنوان الشبىك 209.85.225.136

، وعندما يجد أى عنوان يقوم بتمرير البيانات للدالة املستقبلة printResults لتقوم بطبعها.

................................................................................

QtNetwork Module وحدة فصائل برمجة الشبكات

Page 177: Qt in Arabic

176

نقل البيانات عرب الشبكات

تقدم كيوت أشهر طريقتني لنقل البيانات عرب الشبكات وهام :

.Transmission Control Protocol - TCP -1

.User Datagram Protocol - UDP -2

: TCP أوال : طريقة

،Client و جهاز مرسل Server إلمتام عملية اإلتصال البد من وجود جهاز مستقبل

ويتم نقل البيانات بني الطرفني بطريقة مسلسلة، حيث أن البيانات املرسلة تأخذ أرقام تسلسل

، وعند فقد أى جزء من البيانات يتم إرساله مرة أخرى تلقائيا، وهى تعترب طريقة آمنة لنقل

البيانات، كام يتم من خاللها تحديد الجهاز املرسل و الجهاز املستقبل.

.HTTP , FTP وهذه الطريقة تستخدم ىف

.QTcpServer , QTcpSocket وتستعمل كيوت ىف هذه الطريقة الفصيلتني

: UDP ثانيا : طريقة

ىف هذه الطريقة اليتم اإلتصال بني جهازين، ولكن تقوم UDP Sender ببث البيانات

)Broadcasting Sender( إىل نطاق معني، وميكن لكل من هم ىف هذا النطاق إستقبال البيانات

، وترسل البيانات ىف بلوكات ثابتة الحجم ) تكون ىف معظم األحيان أقل من 512 بايت (, وىف

حالة فقد بيانات خالل اإلستقبال UDP Receiver ال يتم إعادة إرسالها, وذلك لعدم وجود

ترقيم لبلوكات البيانات املرسلة, وهذه الطريقة تصلح لبث بيانات صغرية الحجم مثل أرقام

.TCP أرسع ىف نقل البيانات من UDP الطقس أو الساعة ، ونذكر أيضا أن طريقة

.QUdpSocket وتستعمل كيوت ىف هذه الطريقة الفصيلة

TCP Client TCP Server

UDP Sender UDP Receiver

QtNetwork Module وحدة فصائل برمجة الشبكات

Page 178: Qt in Arabic

177

نسب الفصيلة :

QObject ترث فصيلة

تعريف الفصيلة :

هى الفصيلة املسؤولة عن التعامل مع وصالت اإلتصال بأجهزة العمالء Clients، وإدارة

.TCP/IP اإلتصاالت بينهم، ونقل البيانات عرب الشبكة بطريقة

ماذا يحدث داخل الفصيلة ؟

وكيف تقوم الفصيلة بتنظيم الربط مع املستخدمني؟

QTcpServer Class

Server

Listen

Client

IP

Port

connectToHost

incomingConnection(int socketDescriptor)

- create QTcpSocket.

- set QTcpSocket desctiptor.

- set QTcpsocket in an internal list of pending connections.

- emit newConnection().

IP

Port

Client Request connecting to Server by IP and Port

QTcpServer

Diagram

QtNetwork Module وحدة فصائل برمجة الشبكات

Page 179: Qt in Arabic

178

يبدأ عمل الفصيلة بالدالة listen التى تأخذ املتغريات Port , IP ، ثم تنتظر الفصيلة حتى

. server بطلب اإلتصال مع الجهاز client يقوم أى جهاز عميل

IP عن طريق رقم العنوان الشبىك server بطلب اإلتصال مع الجهاز client فإذا قام جهاز عميل

ورقم مدخل و مخرج البيانات Port، تبدأ الفصيلة العمل بالخطوات اآلتية:

1 - تحدد الفصيلة رقم إلدارة عملية اإلتصال socket descriptor، وهذا الرقم هو الذى يدل

عىل عملية اإلتصال.

incomingConnection للدالة socket descriptor اإلتصال عملية رقم بتمرير تقوم - 2

وتشغيلها تلقائيا.

3 - تحتوى الدالة incomingConnection عىل كود يقوم باآلىت :

- إنشاء فصيلة QTcpSocket كفصيلة إتصال لتقوم بإدارة عملية اإلتصال.

- مترير رقم عملية اإلتصال socket descriptor للفصيلة.

.nextPendingConnection وضع الفصيلة داخل قامئة داخلية لإلتصاالت تستدعى بالدالة -

.newConnection تشغيل دالة اإلرسال -

هذا ما يحدث داخل الفصيلة، ولكن عند كتابة كود التطبيق فكل ما نحتاجه هو:

: listen الدالة

newConnection وهى تقوم بإنتظار أى طلب إتصال، وعند اإلتصال تشعل دالة اإلرسال

لتقوم ببث إشارتها، وبالتاىل ميكن ربط دالة اإلرسال بأى دالة إستقبال لعمل الالزم مع الجهاز

الطالب لإلتصال.

: nextPendingConnection الدالة

،QTcpServer وهى تقوم بإستدعاء آخر عملية إتصال من القامئة الداخلية للفصيلة

كام ميكن إدارة عملية اإلتصال بطريقة أخرى:

وهى إعادة كتابة الدالة incomingConnection، وىف هذه الحالة سنقوم بإلغاء الخطوة

رقم 3 من الرشح السابق، ويكون للمربمج حرية التعامل مع رقم إدارة عملية اإلتصال، وتعترب

هذه هى الطريقة األكرث إستخداما.

QtNetwork Module وحدة فصائل برمجة الشبكات

Page 180: Qt in Arabic

179

سنقوم بعمل مثال بسيط وهو إنشاء تطبيق خادم Server يقوم ببث رسالة إىل كل

عميل Client يقوم بالربط معه.

widget من النوع QtCreator نقوم بفتح مرشوع جديد باألداة

. server_message واسم املرشوع

Network Module وليتعامل املرشوع مع خصائص الشبكات

.server_message.pro للملف ) QT+= network ( نضيف الكود

ثم نصمم widget.ui كالتاىل:

QListView ClassObjectName:

clientlv

QTextEdit ClassObjectName:

logstextedit

QPushButton ClassObjectName:

sendbtn

QLineEdit ClassObjectName:

messagldt

QtNetwork Module وحدة فصائل برمجة الشبكات

Page 181: Qt in Arabic

180

widget.h#ifndef WIDGET_H

#define WIDGET_H

#include >QWidget>

#include >QtNetwork>

namespace Ui {

class Widget;

}

class Widget : public QWidget

{

Q_OBJECT

public:

explicit Widget)QWidget *parent = 0(;

~Widget)(;

QTcpServer *server;

QMap>QTcpSocket*,QString> users;

public Q_SLOTS:

void login)(;

void logout)(;

void on_sendbtn_clicked)(;

void updatelist)(;

private:

Ui::Widget *ui;

};

#endif // WIDGET_H

EXAmpleNO 35

QtNetwork Module وحدة فصائل برمجة الشبكات

Page 182: Qt in Arabic

181

رشح الكود السابق

#include >QtNetwork>

إدراج تعريف QtNetwork لتعريف كل الفصائل املتعلقة بالشبكات.

QTcpServer *server;

.QTcpServer إلدارة فصيلة server اإلعالن عن املتغري

QMap>QTcpSocket*,QString> users;

اإلعالن عن املتغري users إلدارة فصيلة حاوية من النوع QMap، ويحتوى كل عنرص فيها عىل كال من:

،) Value ( كقيمة QString والقيمة ، ) Key ( كمفتاح QTcpSocket القيمة

،QString كقيمة client حيث يتم تسجيل اسم املستخدم

.QTcpSocket كمفتاح ) connection ( وتسجيل مؤرش للوصلة

void login)(;

دالة إستقبال تقوم بأداء مهمتها

.client عند إستقبال الفصيلة إلشارة طلب دخول من قبل مستخدم

void logout)(;

دالة إستقبال تقوم بأداء مهمتها

.client عند إستقبال الفصيلة إلشارة خروج من قبل مستخدم

void on_sendbtn_clicked)(;

دالة إستقبال تقوم بأداء مهمتها

.sendbtn عند الضغط عىل املفتاح

void updatelist)(;

.server دالة تقوم بتحديث قامئة املستخدمني املتصلني مع الجهاز

................................................................................

QtNetwork Module وحدة فصائل برمجة الشبكات

Page 183: Qt in Arabic

182

widget.cpp#include “widget.h“

#include “ui_widget.h“

#include >QtNetwork>

#include >QStringListModel>

Widget::Widget)QWidget *parent( :

QWidget)parent(,

ui)new Ui::Widget(

{

ui->setupUi)this(;

server = new QTcpServer)this(;

server->listen)QHostAddress::Any , 4444(;

connect)server,SIGNAL)newConnection)(( , this , SLOT)login)(((;

}

Widget::~Widget)(

{

delete ui;

}

void Widget::login)(

{

QTcpSocket *newsocket = )QTcpSocket*( server->nextPendingConnection)(;

int socketnum = newsocket->socketDescriptor)(;

QString socketstr;

socketstr.setNum)socketnum(;

users.insert)newsocket , “user_“+socketstr(;

ui->logstextedit->append)users.value)newsocket(+“Logged In“(;

connect)newsocket, SIGNAL)disconnected)((, this, SLOT)logout)(((;

updatelist)(;

}

void Widget::logout)(

QtNetwork Module وحدة فصائل برمجة الشبكات

Page 184: Qt in Arabic

183

{

QTcpSocket *closesocket = )QTcpSocket*(sender)(;

ui->logstextedit->append)users.value)closesocket(+“Logged Out“(;

users.remove)closesocket(;

updatelist)(;

}

void Widget::updatelist)(

{

QStringList userlist;

foreach)QString username , users.values)((

userlist >> username;

QStringListModel *usermodel = new QStringListModel;

usermodel->setStringList)userlist(;

ui->clientlv->setModel)usermodel(;

}

void Widget::on_sendbtn_clicked)(

{

foreach)QTcpSocket *user, users.keys)((

user->write))ui->messageldt->text)(+“\n“(.toUtf8)((;

}

رشح الكود السابق

#include >QtNetwork>

#include >QStringListModel>

إدراج تعريف QtNetwork لتعريف كل الفصائل املتعلقة بالشبكات،

.QStringListModel إدراج تعريف الفصيلة

server = new QTcpServer)this(;

،QTcpServer داخل الذاكرة مبساحة الفصيلة server حجز مكان للمتغري

.this بواسطة املعامل widget ووضعه كإبن للفصيلة

QtNetwork Module وحدة فصائل برمجة الشبكات

Page 185: Qt in Arabic

184

server->listen)QHostAddress::Any , 4444(;

الشبىك العنوان عىل اإلتصال يطلب مستخدم أى وإنتظار ،socket بيانات بوابة بفتح server يقوم

. ) Port : 4444 ( و من خالل املنفذ ) IP : localhost (

connect)server,SIGNAL)newConnection)(( , this , SLOT)login)(((;

،server من newConnection ربط دالة اإلرسال

،this widget من login بدالة اإلستقبال

إشارتها اإلرسال دالة تبث ،server بـ اإلتصال بطلب Client مستخدم قام كلام الربط لهذا وكنتيجة

لتستقبلها دالة اإلستقبال login وتقوم بعمل الالزم.

.............................................................................................

login رشح محتوى الدالةQTcpSocket *newsocket = )QTcpSocket*( server->nextPendingConnection)(;

إنشاء الوصلة newsocket لتعمل كمؤرش لإلتصال ) connection ( القادم من املستخدم طالب اإلتصال،

.newsocket تقوم بإعطاء آخر وصلة إتصال ومتررها للوصلة nextPendingConnection والدالة

int socketnum = newsocket->socketDescriptor)(;

الدالة socketDescriptor تقوم بإيجاد رقم إدارة عملية اإلتصال القادم من newsocket ومتريره

.socketnum للمتغري

QString socketstr;

socketstr.setNum)socketnum(;

تقوم بتحويل رقم إدارة عملية اإلتصال إىل متغري نىص.

users.insert)newsocket , “user_“+socketstr(;

إدخال عنرص جديد للفصيلة الحاوية users يتكون من:

.) vlaue ( كقيمة ”user_“+socketstr والقيمة ) key ( كمفتاح newsocket القيمة

ui->logstextedit->append)users.value)newsocket(+“Logged In“(;

إضافة سطر نىص لـ logstextedit يفيد بدخول مستخدم جديد.

QtNetwork Module وحدة فصائل برمجة الشبكات

Page 186: Qt in Arabic

185

connect)newsocket, SIGNAL)disconnected)((, this, SLOT)logout)(((;

،newsocket من disconnected ربط دالة اإلرسال

،this widget من logout بدالة اإلستقبال

وكنتيجة لهذا الربط كلام إنقطع اإلتصال مع املستخدم Client، تبث دالة اإلرسال إشارتها لتستقبلها دالة

اإلستقبال logout وتقوم بعمل الالزم.

updatelist)(;

تقوم بتحديث قامئة املستخدمني ىف واجهة اإلستخدام للتطبيق.

.............................................................................................

logout رشح محتوى الدالةQTcpSocket *closesocket = )QTcpSocket*( sender)(;

client القادمة من مستخدم disconnected عملها عند تلقيها إشارة من دالة اإلرسال logout تبدأ الدالة

تفيد بإنقطاع اإلتصال معه.

.closesocket تقوم بإيجاد مرسل اإلشارة ويتم متريره للوصلة sender)( الدالة

ui->logstextedit->append)users.value)closesocket(+“Logged Out“(;

إضافة سطر نىص لـ logstextedit يفيد بخروج مستخدم.

users.remove)closesocket(;

.users مسح املستخدم من القامئة

updatelist)(;

تقوم بتحديث قامئة املستخدمني ىف واجهة اإلستخدام للتطبيق.

.............................................................................................

.updatelist رشح محتوى الدالةQStringList userlist;

.server إلدارة قامئة حاوية تحتوى عىل قامئة أسامء املستخدين املتصلني بـ userlist اإلعالن عن املتغري

foreach)QString username , users.values)((

userlist >> username;

.userlist إىل الفصيلة الحاوية users مترير أسامء املستخدمني من الفصيلة الحاوية

QtNetwork Module وحدة فصائل برمجة الشبكات

Page 187: Qt in Arabic

186

QStringListModel *usermodel = new QStringListModel;

،QStringListModel إلدارة فصيلة mymodel اإلعالن عن املتغري

وهى تقدم منوذج مصمم إلحتواء قامئة عنارص .

usermodel->setStringList)userlist(;

.usermodel مترير قامئة أسامء املستخدمني لـ

ui->clientlv->setModel)usermodel(;

توجيه النموذج usermodel إىل كائن عرض النموذج clientlv ليقوم بعرضه.

.............................................................................................

.on_sendbtn_clicked رشح محتوى الدالةforeach)QTcpSocket *user, users.keys)((

user->write))ui->messageldt->text)(+“\n“(.toUtf8)((;

.users إىل جميع املستخدمني املوجودين ىف القامئة messageldt بإرسال محتوى write تقوم الدالة

ونرى هنا أنه تم :

- إضافة الحرف”n\” إىل نهاية النص املراد إرساله.

.utf8 تحويل النص للصيغة -

وبدون الخطوتني السابقتني لن يتم إرسال البيانات بصورة صحيحة.

.............................................................................................

QtNetwork Module وحدة فصائل برمجة الشبكات

Page 188: Qt in Arabic

187

نسب الفصيلة :

QAbstractSocket ترث فصيلة

QIODevice التى ترث

QObject التى ترث

تعريف الفصيلة :

هى الفصيلة املسؤولة عن التعامل مع الربط بأجهزة الخوادم Servers ونقل البيانات عرب

.TCP/IP الشبكة بطريقة

Transmission Contol Protocol ( - TCP ( هى طريقة لنقل البيانات عرب الشبكات،

ولهذه الطريقة عدة مميزات منها :

- أنها طريقة موثوقة لنقل البيانات - ففى حالة فقد أية بيانات يتم بثها تلقائيا مرة اخرى.

- يتم عن طريقها توجيه اإلتصال و البيانات - يتم اإلتصال و إرسال البيانات إىل جهاز محدد.

QTcpSocket Class

Server

Listen

Client

IP

Port

connectToHostIP

Port

Client Request connecting to Server by IP and Port

HostLookupState

ConnectingState

ConnectedState

Succeed emit hostFound()

Not Succeed emit error()

Not Succeed emit error()

Succeed emit connected()

QTcpSocket

Diagram

QtNetwork Module وحدة فصائل برمجة الشبكات

Page 189: Qt in Arabic

188

كيف يحدث التصال بني املستخدم client و الخادم server ىف طريقة TCP ؟

ىف هذه الطريقة يتم اإلتصال بني األجهزة مبعرفة متغريين هامني هام :

.IP Address رقم العنوان الشبىك -

.Port Numbaer رقم منفذ الربط -

مراحل عملية اإلتصال :

: connectToHost)( عند إستخدام دالة اإلتصال -

.HostLookupState تقوم الفصيلة بالبحث عن الجهاز املضيف، وتسمى هذه املرحلة

- عند إيجاد الجهاز املضيف :

،ConnectingState يدخل اإلتصال ىف مرحلة جارى اإلتصال

وتبث دالة اإلرسال )(hostFound إشارتها.

- عند حدوث اإلتصال :

،ConnectedState يدخل اإلتصال ىف مرحلة متصل

وتبث دالة اإلرسال )(connected إشارتها.

- عند حدوث أى خطأ ىف أى مرحلة :

تبث دالة اإلرسال )(error ودالة اإلرسال )(stateChanged إشارتهام.

تقدم الفصيلة الدالة )(state للتعرف عىل حالة اإلتصال ىف أى مرحلة من املراحل السابقة:

.UnconnectedState غري متصل : state)( الوضع التلقاىئ للقيمة املرتدة من الدالة

بواسطة server الخادم الجهاز و client املستخدم الجهاز بني البيانات إستقبال و إرسال يتم

.write)( , read)(الدالتني

دالة اإلرسال )(readyRead هى أساس عملية إستقبال البيانات، حيث يتم إشعالها لتقوم ببث

إشارتها عند توافر أى بيانات مرسلة لوصلة اإلتصال.

................................................................................

QtNetwork Module وحدة فصائل برمجة الشبكات

Page 190: Qt in Arabic

189

سنقوم بعمل مثال بسيط وهو إنشاء تطبيق مستخدم Client يقوم بطلب إتصال إىل

تطبيق server السابق وإستقبال الرسائل منه.

widget من النوع QtCreator نقوم بفتح مرشوع جديد باالداة

. client_message واسم املرشوع

Network Module وليتعامل املرشوع مع خصائص الشبكات

.client_message.pro للملف ) QT+= network ( نضيف الكود

ثم نصمم widget.ui كالتاىل:

QPushButton ClassObjectName:

connectbtn

QTextEdit ClassObjectName:

messagebox

QLabel ClassObjectName:

statuslbl

QtNetwork Module وحدة فصائل برمجة الشبكات

Page 191: Qt in Arabic

190

widget.h#ifndef WIDGET_H

#define WIDGET_H

#include >QWidget>

#include >QtNetwork>

namespace Ui {

class Widget;

}

class Widget : public QWidget

{

Q_OBJECT

public:

explicit Widget)QWidget *parent = 0(;

~Widget)(;

QTcpSocket *client;

public Q_SLOTS:

void on_connectbtn_clicked)(;

void readmessage)(;

void setconnected)(;

private:

Ui::Widget *ui;

};

#endif // WIDGET_H

EXAmpleNO 36

QtNetwork Module وحدة فصائل برمجة الشبكات

Page 192: Qt in Arabic

191

رشح الكود السابق

#include >QtNetwork>

إدراج تعريف QtNetwork لتعريف كل الفصائل املتعلقة بالشبكات.

QTcpSocket *client;

. QTcpServer إلدارة الفصيلة server اإلعالن عن املتغري

void on_connectbtn_clicked)(;

دالة إستقبال تقوم بأداء مهمتها

.connectbtn عند الضغط عىل املفتاح

void readmessage)(;

دالة إستقبال تقوم بأداء مهمتها

عند إستقبال الفصيلة إلشارة دالة اإلرسال readyRead التى تبث عند وجود بيانات للقراءة.

void setconnected)(;

دالة إستقبال تقوم بأداء مهمتها

عند إستقبال الفصيلة إلشارة الدالة connected التى تبث عند نجاح عملية اإلتصال.

.............................................................................................

QtNetwork Module وحدة فصائل برمجة الشبكات

Page 193: Qt in Arabic

192

widget.cpp#include “widget.h“

#include “ui_widget.h“

#include >QtNetwork>

Widget::Widget)QWidget *parent( :QWidget)parent(,ui)new Ui::Widget(

{

ui->setupUi)this(;

client = new QTcpSocket)this(;

connect)client, SIGNAL)readyRead)((, this, SLOT)readmessage)(((;

connect)client, SIGNAL)connected)((, this, SLOT)setconnected)(((;

}

Widget::~Widget)(

{

delete ui;

}

void Widget::on_connectbtn_clicked)(

{

client->connectToHost)“localhost“, 4444(;

}

void Widget::readmessage)(

{

while)client->canReadLine)((

{

QString line = QString::fromUtf8)client->readLine)((.trimmed)(;

ui->messagebox->append)“Message :“ + line(;

}

}

void Widget::setconnected)(

{

ui->statuslbl->setText)“Connected“(;

}

QtNetwork Module وحدة فصائل برمجة الشبكات

Page 194: Qt in Arabic

193

رشح الكود السابق

#include >QtNetwork>

إدراج تعريف QtNetwork لتعريف كل الفصائل املتعلقة بالشبكات.

client = new QTcpSocket)this(;

،QTcpSocket داخل الذاكرة مبساحة الفصيلة client حجز مكان للمتغري

.this بواسطة املعامل widget ووضعه كإبن للفصيلة

connect)client, SIGNAL)readyRead)((, this, SLOT)readmessage)(((;

client من readyRead ربط دالة اإلرسال

،this widget من readmessage بدالة اإلستقبال

اإلرسال دالة تبث ،client اإلتصال وصلة من قادمة للقراءة بيانات توفرت كلام الربط لهذا وكنتيجة

readyRead إشارتها لتستقبلها دالة اإلستقبال readmessage وتقوم بعمل الالزم.

connect)client, SIGNAL)connected)((, this, SLOT)setconnected)(((;

client من connected ربط دالة اإلرسال

،this widget من setconnected بدالة اإلستقبال

وكنتيجة لهذا الربط فعند نجاح عملية اإلتصال تبث دالة اإلرسال connected إشارتها لتستقبلها دالة

اإلستقبال setconnected وتقوم بعمل الالزم.

.............................................................................................

.on_connectbtn_clicked رشح محتوى الدالةclient->connectToHost)“localhost“, 4444(;

تقوم وصلة اإلتصال client بطلب اإلتصال مع الجهاز server من خالل اسم النطاق localhost و من

خالل املنفذ ) Port ( رقم 4444 .

.............................................................................................

QtNetwork Module وحدة فصائل برمجة الشبكات

Page 195: Qt in Arabic

194

readmessage رشح محتوى الدالةwhile)client->canReadLine)((

{

QString line = QString::fromUtf8)client->readLine)((.trimmed)(;

ui->messagebox->append)“Message :“ + line(;

}

تقوم الدالة canReadLine برد القيمة true ىف حالة إستطاعتها قراءة سطر بيانات كامل،

،client بقراءة سطر البيانات القادم إىل الوصلة readLine وتقوم الدالة

.append بواسطة الدالة messagebox ثم يتم عرض سطر البيانات ىف الكائن

لىك تستطيع ،QString::fromUtf8 بالعملية UTF8 الصيغة البيانات إىل أنه تم تحويل ونالحظ هنا

كيوت التعامل معها، وبالتاىل فعند اإلستقبال نقوم بعكس العملية،ونرى ذلك ىف املثال السابق server حيث قمنا بتحويل البيانات إىل الصيغة Utf8 قبل إرسالها.

.............................................................................................

.setconnected رشح محتوى الدالةتنشط هذه الدالة عند متام نجاح عملية اإلتصال.

ui->statuslbl->setText)“Connected“(;

تقوم الدالة setText بوضع النص Connected داخل الكائن statuslbl إلظهار متام عملية اإلتصال.

.............................................................................................

QtNetwork Module وحدة فصائل برمجة الشبكات

Page 196: Qt in Arabic

195

نسب الفصيلة :

QAbstractSocket ترث فصيلة

QIODevice التى ترث

QObject التى ترث

تعريف الفصيلة :

البيانات عرب الشبكة بطريقة UDP، وكام التعامل مع نقل الفصيلة املسؤولة عن هى

علمنا سابقا فإن بث البيانات بطريقة UDP تستخدم للتطبيقات التى ميكننا فيها التجاوز عن

فقد البيانات كتطبيقات املحادثة الصوتية أو الفيديو ) Audio ,Video Chat (، فالعامل األساىس

املطلوب هنا هو الرسعة، وفقدنا بعض البيانات قد اليكون باألمر الهام.

التستخدم UDP دوال إلقامة وصلة إتصال بني الجهاز املرسل و الجهاز املستقبل،

ولكن الجهاز املرسل يقوم بإرسال البيانات عىل رقم منفذ ) Port number ( معني،

ليقوم أى جهاز UDP Receiver ىف نطاق اإلستقبال UDP Sender بإستقبال البيانات املرسلة

إىل هذا املنفذ.

QUdpSocket Class

UDP Senderon Port 4444

UDP Receiveron Port 4444

UDP Receiveron Port 4444

UDP Receiveron Port 4444

UDP Receiveron Port 4444

QtNetwork Module وحدة فصائل برمجة الشبكات

Page 197: Qt in Arabic

196

سنقوم بعمل مثال بسيط وهو إنشاء تطبيقني هام :

- مرسل بيانات UDP : وسيقوم ببث رسالة من املنفذ 4444.

- مستقبل بيانات UDP : وسيقوم بإستقبال رسالة من املنفذ 4444..............................................................................................

تطبيق مرسل البيانات :

widget من النوع QtCreator نقوم بفتح مرشوع جديد باألداة

. udp_sender واسم املرشوع

Network Module وليتعامل املرشوع مع خصائص الشبكات

.udp_sender.pro للملف ) QT+= network ( نضيف الكود

ثم نصمم widget.ui كالتاىل:

QLabel Class

QLineEdit ClassObjectName:

messageldt

QtNetwork Module وحدة فصائل برمجة الشبكات

Page 198: Qt in Arabic

197

widget.h#ifndef WIDGET_H

#define WIDGET_H

#include >QWidget>

#include >QtNetwork>

namespace Ui {

class Widget;

}

class Widget : public QWidget

{

Q_OBJECT

public:

explicit Widget)QWidget *parent = 0(;

~Widget)(;

public Q_SLOTS:

void senddata)(;

private:

Ui::Widget *ui;

QUdpSocket *udpsender;

};

#endif // WIDGET_H

رشح الكود السابق

#include >QtNetwork>

إدراج تعريف QtNetwork لتعريف كل الفصائل املتعلقة بالشبكات.

QUdpSocket *udpsender;

.QUdpSocket إلدارة فصيلة udpsender اإلعالن عن املتغري

void senddata)(;

دالة إستقبال تقوم بأداء مهمتها

عند إستقبال الفصيلة إلشارة دالة اإلرسال textChanged التى تبث عند تغيري محتوى الرسالة.

EXAmpleNO 37

QtNetwork Module وحدة فصائل برمجة الشبكات

Page 199: Qt in Arabic

198

widget.cpp#include “widget.h“

#include “ui_widget.h“

#include >QtNetwork>

Widget::Widget)QWidget *parent( :

QWidget)parent(,

ui)new Ui::Widget(

{

ui->setupUi)this(;

udpsender = new QUdpSocket)this(;

connect)ui->messageldt, SIGNAL)textChanged)QString((, this, SLOT)senddata)(((;

}

Widget::~Widget)(

{

delete ui;

}

void Widget::senddata)(

{

QString str = ui->messageldt->text)(;

QByteArray datagram;

datagram.append)str(;

udpsender->writeDatagram)datagram.data)(, datagram.size)(, QHostAddress::Broadcast, 4444(;

}

QtNetwork Module وحدة فصائل برمجة الشبكات

Page 200: Qt in Arabic

199

رشح الكود السابق

#include >QtNetwork>

إدراج تعريف QtNetwork لتعريف كل الفصائل املتعلقة بالشبكات.

udpsender = new QUdpSocket)this(;

،QUdpSocket داخل الذاكرة مبساحة الفصيلة udpsender حجز مكان للمتغري

.this بواسطة املعامل widget ووضعه كإبن للفصيلة

connect)ui->messageldt, SIGNAL)textChanged)QString((, this, SLOT)senddata)(((;

messageldt من textChanged ربط دالة اإلرسال

،this widget من senddata بدالة اإلستقبال

textChanged اإلرسال دالة تبث messageldt بالكائن املوجود النص تغري الربط كلام لهذا وكنتيجة

إشارتها لتستقبلها دالة اإلستقبال senddata وتقوم بعمل الالزم.

.............................................................................................

.senddata رشح محتوى الدالةQString str = ui->messageldt->text)(;

.messageldt وإستقباله للمحتوى النىص املوجود بالكائن str اإلعالن عن املتغري

QByteArray datagram;

اإلعالن عن املتغري datagram إلدارة مصفوفة من النوع بايت.

datagram.append)str(;

.datagram إىل املصفوفة str إضافة املتغري

udpsender->writeDatagram)datagram.data)(, datagram.size)(,

QHostAddress::Broadcast, 4444(;

datagram.size)( ذو املساحة datagram.data)( إرسال النص

QHostAddress::Broadcast إىل العنوان

من املنفذ رقم 4444.

QtNetwork Module وحدة فصائل برمجة الشبكات

Page 201: Qt in Arabic

200

تطبيق مستقبل البيانات :

widget من النوع QtCreator نقوم بفتح مرشوع جديد باألداة

. udp_receiver واسم املرشوع

Network Module وليتعامل املرشوع مع خصائص الشبكات

.udp_receiver.pro للملف ) QT+= network ( نضيف الكود

ثم نصمم widget.ui كالتاىل:

QLabel Class

QLabel ClassObjectName:

messagelbl

QtNetwork Module وحدة فصائل برمجة الشبكات

Page 202: Qt in Arabic

201

widget.h#ifndef WIDGET_H

#define WIDGET_H

#include >QWidget>

#include >QtNetwork>

namespace Ui {

class Widget;

}

class Widget : public QWidget

{

Q_OBJECT

public:

explicit Widget)QWidget *parent = 0(;

~Widget)(;

public Q_SLOTS:

void readdata)(;

private:

Ui::Widget *ui;

QUdpSocket *udpreceiver;

};

#endif // WIDGET_H

رشح الكود السابق

#include >QtNetwork>

إدراج تعريف QtNetwork لتعريف كل الفصائل املتعلقة بالشبكات.

QUdpSocket *udpreceiver;

. QUdpSocket إلدارة فصيلة udpreceiver اإلعالن عن املتغري

void readdata)(;

دالة إستقبال تقوم بأداء مهمتها

عند إستقبال الفصيلة إلشارة دالة اإلرسال readyRead التى تبث عند وجود بيانات للقراءة.

EXAmpleNO 38

QtNetwork Module وحدة فصائل برمجة الشبكات

Page 203: Qt in Arabic

202

widget.cpp#include “widget.h“

#include “ui_widget.h“

#include >QtNetwork>

Widget::Widget)QWidget *parent( :

QWidget)parent(,

ui)new Ui::Widget(

{

ui->setupUi)this(;

udpreceiver = new QUdpSocket)this(;

udpreceiver->bind)4444, QUdpSocket::ShareAddress(;

connect)udpreceiver, SIGNAL)readyRead)((,this, SLOT)readdata)(((;

}

Widget::~Widget)(

{

delete ui;

}

void Widget::readdata)(

{

while )udpreceiver->hasPendingDatagrams)(( {

QByteArray datagram;

datagram.resize)udpreceiver->pendingDatagramSize)((;

udpreceiver->readDatagram)datagram.data)(, datagram.size)((;

ui->messagelbl->setText)datagram.data)((;

}

}

QtNetwork Module وحدة فصائل برمجة الشبكات

Page 204: Qt in Arabic

203

رشح الكود السابق

#include >QtNetwork>

إدراج تعريف QtNetwork لتعريف كل الفصائل املتعلقة بالشبكات.

udpsender = new QUdpSocket)this(;

،QUdpSocket داخل الذاكرة مبساحة الفصيلة udpreceiver حجز مكان للمتغري

.this بواسطة املعامل widget ووضعه كإبن للفصيلة

udpreceiver->bind)4444, QUdpSocket::ShareAddress(;

تقوم bind بربط الوصلة udpreceiver عىل رقم املنفذ 4444،

و QUdpSocket::ShareAddress تسمح ألى تطبيق آخر بالربط عىل نفس رقم املنفذ.

connect)udpreceiver, SIGNAL)readyRead)((,this, SLOT)readdata)(((;

udpreceiver من readyRead ربط دالة اإلرسال

.this widget من readdata بدالة اإلستقبال

readyRead وكنتيجة لهذا الربط كلام توفرت بيانات للقراءة قادمة من املنفذ 4444 تبث دالة اإلرسال

إشارتها لتستقبلها دالة اإلستقبال readdata وتقوم بعمل الالزم.

.............................................................................................

.readdata رشح محتوى الدالةQByteArray datagram;

اإلعالن عن املتغري datagram إلدارة مصفوفة من النوع بايت.

datagram.resize)udpreceiver->pendingDatagramSize)((;

تغيري حجم املصفوفة datagram ليساوى حجم البيانات القادمة.

udpreceiver->readDatagram)datagram.data)(, datagram.size)((;

.datagram.size)( مبساحة datagram.data)( إستقبال البيانات و تخزينها ىف

ui->messagelbl->setText)datagram.data)((;

وضع البيانات القادمة داخل الكائن messagelbl الذى يقوم بعرض البيانات عىل واجهة التطبيق.

................................................................................

QtNetwork Module وحدة فصائل برمجة الشبكات

Page 205: Qt in Arabic

204

Notes...........................................................................................................................................................................................................

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

........................................................................................................................................................................................................... .

.......................................................................................................................................................................................................... .

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

............................................................................................................................................................................................................

QtNetwork Module وحدة فصائل برمجة الشبكات

Page 206: Qt in Arabic

205

QtSql Module

وحدة فصائل

التعامل مع قواعد البيانات

QtSql Module وحدة فصائل التعامل مع قواعد البيانات

Page 207: Qt in Arabic

206

إدراج

#include <QtSql>

داخل ملفات الكود

متطلبات هذه الوحدة

إدراج

QT += sql

. project.pro داخل ملف املرشوعQtSql Module وحدة فصائل التعامل مع قواعد البيانات

Page 208: Qt in Arabic

207

وحدة التعامل مع قواعد البيانات هى من الوحدات الهامة للمربمج والتى متكنه من

التواصل مع قواعد البيانات املختلفة، لذلك تقدم كيوت مجموعة من الفصائل التى تتعامل مع

مختلف قواعد البيانات، وسوف نقوم بعرض هذه الفصائل تبعا لألهمية كاآلىت:

: QSqlDatabase فصيلة

،SQL Database Drivers هي الفصيلة املسؤولة عن اإلتصال مع قاعدة البيانات من خالل

وتتعامل QSqlDatabase مع تسعة أنواع من قواعد البيانات وهم املوضحني بالجدول:

Qt Driver Name DataBase TypeQDB2 IBM DB2

QIBASE Borland InterBase

QMYSQL MySQL

QOCI Oracle Call Interface

QODBC Open Database ) Microsoft (

QPSQL PostgreSQL

QSQLITE2 SQLite v2.0

QSQLITE SQLite v3.0

QTDS Sybase Adaptive server

: QSqlQuery فصيلة

SQL هى الفصيلة املسؤولة عن مترير وتنفيذ عبارات لغة

مثل ) SELECT , INSERT ( إىل قاعدة البيانات .

: QSqlField فصيلة

هى الفصيلة املسؤولة عن التعامل مع حقول البيانات بقاعدة البيانات.

: QSqlError فصيلة

هى الفصيلة املسؤولة عن إعطاء تقرير املعلومات حول أخطاء قاعدة البيانات.

................................................................................

QtSql Module وحدة فصائل التعامل مع قواعد البيانات

Page 209: Qt in Arabic

208

كيف تقوم كيوت بالتواصل مع قاعدة البيانات؟

QSqlDatabase تتواصل كيوت مع قاعدة البيانات بالربط معها عن طريق الفصيلة

وبإستخدام الدوال اآلتية :

- الدالة addDatabase : لتحديد نوع قاعدة البيانات التى سيتم التعامل معها.

.) Database Server ( لتحديد مكان خادم قاعدة البيانات : setHostName الدالة -

- الدالة setDatabaseName : لتحديد اسم قاعدة البيانات.

- الدالة setUserName : إلدخال اسم املستخدم.

- الدالة setPassword : إلدخال كلمة املرور الخاصة باملستخدم.

- الدالة open : للقيام بفتح اإلتصال مع قاعدة البيانات.

QSqlDatabase db = QSqlDatabase::addDatabase)“QMYSQL“(;

db.setHostName)“dbhost“(;

db.setDatabaseName)“dbname“(;

db.setUserName)“myuser“(;

db.setPassword)“mypass“(;

db.open)(;

ثم يبدأ التعامل مع قاعدة البيانات بتمرير العبارات الخاصة بلغة SQL عن طريق الفصيلة

. exec حيث يتم مترير العبارات مبارشة بإستخدام الدالة ،QSqlQuery

QSqlQuery query;

query.exec)“INSERT INTO userpoints VALUES) 'Mahmoud' , 2000 ( “(;

أو تجهيزها قبل التمرير بواسطة الدالتني bind ، prepare، ومراحلها كاآلىت :

. SQL لتجهيز عبارة prepare تستخدم الدالة -

- ثم الدالة bind لتمرير املتغريات للعبارة .

- ثم الدالة exec لتنفيذ العبارة .

.SQL ويجب مالحظة أن هناك أكرث من طريقة لتمرير املتغريات لعبارة

QtSql Module وحدة فصائل التعامل مع قواعد البيانات

Page 210: Qt in Arabic

209

: SQL طرق مترير املتغريات لعبارة

، :varname, :varpoints كأسامء مثل prepare الطريقة األوىل : توضع املتغريات ىف الدالة

.:varname, :varpoints املتغريات بأسامئها bind ثم مترر

query.prepare)“INSERT INTO userpoints )name, points( “

“VALUES ):varname, :varpoints(“(;

query.bindValue)“:varname“, “Ali“(;

query.bindValue)“:varpoints“, 500(;

query.exec)(;

، :varname, :varpoints كأسامء مثل prepare الطريقة الثانية : توضع املتغريات ىف الدالة

ثم مترر bind املتغريات برتتيب األرقام .

query.prepare)“INSERT INTO userpoints )name, points( “

“VALUES ):varname, :varpoints(“(;

query.bindValue) 0 , “Ali“(;

query.bindValue) 1 , 500(;

query.exec)(;

الطريقة الثالثة : توضع املتغريات ىف الدالة prepare كعالمات إستفهام تدل عىل مكان وجود

املتغريات، ثم مترر bind املتغريات برتتيب األرقام .

query.prepare)“INSERT INTO userpoints )name, points( “

“VALUES ) ? , ? (“(;

query.bindValue) 0 , “Ali“(;

query.bindValue) 1 , 500(;

query.exec)(;

QtSql Module وحدة فصائل التعامل مع قواعد البيانات

Page 211: Qt in Arabic

210

الطريقة الرابعة : توضع املتغريات ىف الدالة prepare كعالمات إستفهام تدل عىل مكان وجود

املتغريات، ثم مترر bind املتغريات برتتيب الكود .

query.prepare)“INSERT INTO userpoints )name, points( “

“VALUES ) ? , ? (“(;

query.addBindValue) “Ali“ (;

query.addBindValue) 500 (;

query.exec)(;

..................................

البحار ىف سجالت قاعدة البيانات :

ىف حالة مترير عبارة SELECT من لغة SQL ) وهى العبارة الخاصة بالبحث ىف قاعدة

بيانات وإستخراج نتائج منها ( يتم التعامل معها بعدة دوال هى:

- الدالة )(next : لتشري إىل السجل التاىل.

- الدالة )(previous : لتشري إىل السجل السابق.

- الدالة )(first : لتشري إىل السجل األول.

- الدالة )(last : لتشري إىل السجل األخري.

.num لتشري إىل السجل رقم : seek)int num( الدالة -

وكام نعلم فإن جداول قواعد البيانات تتكون من سجالت، ويتكون السجل ) Record ( من

عدد من الحقول ) Fields (، وميكننا الحصول عىل القيمة املوجودة داخل كل حقل بتمرير رقم

.value) field num( الحقل املطلوب للدالة

اسم من حقلني يتكون بيانات عبارة SQL إلستخراج جدول بتمرير نقوم : ذلك مثال عىل

.id و رقم تعريف name

.users ويقوم الكود اآلىت بإستخراج جميع محتويات جدول قاعدة البيانات

QSqlQuery query)“SELECT id , name FROM users“(;

while ) query.next)( ( {

int id = query.value) 0 (.toInt)(;

QString name = query.value) 1 (.toString)(;

}

QtSql Module وحدة فصائل التعامل مع قواعد البيانات

Page 212: Qt in Arabic

211

NO Name Points

1

2

3

Mahmoud

Ali

Mohsen

2000

500

1200

عرض سجالت قاعدة البيانات :

قاعدة سجالت تعديل و لعرض به الخاصة اإلستخدام واجهة إنشاء للمربمج ميكن

البيانات، أو إستخدام الفصيلتني QSqlQueryModel ، QSqlTableModel، والتى قدمتهام

الطريقة طريقة منوذج/ السجالت وعرضها، وتتبع هذه للتعامل مع كيوت ككائنات جاهزة عرض ) Model / View Framework ( والتى تم تعريفها ىف وحدة مكونات واجهة املستخدم

.QtGui Module الرسومية

..................................

املثال :

إمكانية نقاط، مع تتكون من رقم مسلسل و اسم وعدد بيانات قاعدة إنشاء نريد

إضافة سجل جديد أو مسحه أو التعديل فيه،

ونبدأ املثال بوضع الثالثة سجالت التالية :

تتكون قاعدة البيانات من 3 سجالت و كل سجل من 3 حقول.

وسوف نقوم بإستخدام قاعدة بيانات من النوع QSQLITE، حيث أنها التحتاج إىل مضيف

.Database host قاعدة بيانات

QtSql Module وحدة فصائل التعامل مع قواعد البيانات

Page 213: Qt in Arabic

212

SQL إلنشاء قاعدة البيانات ىف املثال السابق بلغة

نتبع العبارات التالية:

CREATE TABLE userpoints)id int , name varchar)20( , points int(

INSERT INTO userpoints VALUES) 1 , “Mohamed“ , 2000(

INSERT INTO userpoints VALUES) 2 , “Ali“ , 500(

INSERT INTO userpoints VALUES) 3 , “Mohsen“ , 1200(

و سرنى اآلن كيفية إنشاء قاعدة البيانات السابقة بواسطة وحدة التعامل مع قواعد البيانات

.QtSQL Module من كيوت

widget من النوع QtCreator نقوم بفتح مرشوع جديد باألداة

. sql_module واسم املرشوع

وليتعامل املرشوع مع قواعد البيانات

.sql_module.pro للملف ) QT+= sql ( نضيف الكود

ثم نصمم widget.ui كالتاىل:

QTableView ClassObjectName:

datatableQWidget Class

QtSql Module وحدة فصائل التعامل مع قواعد البيانات

Page 214: Qt in Arabic

213

widget.cpp#include “widget.h“

#include “ui_widget.h“

#include >QtSql>

#include >QStandardItemModel>

#include >QTableView>

Widget::Widget)QWidget *parent( :

QWidget)parent(,

ui)new Ui::Widget(

{

ui->setupUi)this(;

QSqlDatabase db = QSqlDatabase::addDatabase)“QSQLITE“(;

db.setDatabaseName)“:memory:“(;

db.open)(;

QSqlQuery query;

query.exec)“create table userpoints )id int primary key,“

“name varchar)20(, points int(“(;

query.exec)“INSERT INTO userpoints VALUES)1, ‹Mahmoud›, 2000(“(;

query.prepare)“INSERT INTO userpoints )id, name, points( “

“VALUES ):id, :name, :points(“(;

query.bindValue)0, 2(;

query.bindValue)1, “Ali“(;

query.bindValue)2, 500(;

query.exec)(;

query.prepare)“INSERT INTO userpoints )id, name, points( “

“VALUES ):id, :name, :points(“(;

query.bindValue)“:id“, 3(;

query.bindValue)“:name“, “Mohsen“(;

query.bindValue)“:points“, 1200(;

query.exec)(;

EXAmpleNO 39

QtSql Module وحدة فصائل التعامل مع قواعد البيانات

Page 215: Qt in Arabic

214

int rows = 0;

QStandardItemModel *mymodel = new QStandardItemModel;

mymodel->setColumnCount)3(;

query.exec)“SELECT * FROM userpoints“(;

while )query.next)((

{

mymodel->setItem)rows , 0 ,new QStandardItem) query.value)0(.toString)( ((;

mymodel->setItem)rows , 1 ,new QStandardItem) query.value)1(.toString)( ((;

mymodel->setItem)rows , 2 ,new QStandardItem) query.value)2(.toString)( ((;

rows++;

}

ui->datatable->setModel)mymodel(;

}

رشح الكود السابق

#include >QtSql>

إدراج تعريف QtSql لتعريف كل الفصائل التى تتعامل مع قواعد البيانات .

QSqlDatabase db = QSqlDatabase::addDatabase)“QSQLITE“(;

،QSqlDatabase إلدارة فصيلة db اإلعالن عن املتغري

.QSQLite وهى وصلة ربط مع قاعدة بيانات من النوع

db.setDatabaseName)“:memory:“(;

،db كإسم لقاعدة البيانات الخاصة بوصلة الربط :memory: مترير

إنشائها يتم بيانات قاعدة مع بالتعامل يقوم QSQLite حيث بالنوع حالة خاصة هو :memory: و

والتعامل معها ىف الذاكرة.

db.open)(;

فتح وصلة الربط db إلجراء العمليات عىل قاعدة البيانات من خاللها.

QtSql Module وحدة فصائل التعامل مع قواعد البيانات

Page 216: Qt in Arabic

215

QSqlQuery query;

query.exec)“create table userpoints )id int primary key,“

“name varchar)20(, points int(“(;

query.exec)“INSERT INTO userpoints VALUES)1, ‹Mahmoud›, 2000(“(;

.exec إلنشاء جدول بقاعدة البيانات، وإضافة سجل بالطريقة املبارشة بإستخدام SQL مترير عبارتني

query.prepare)“INSERT INTO userpoints )id, name, points( “

“VALUES ):id, :name, :points(“(;

. :id, :name, :points وإضافة متغريات لها ،prepare بإستخدام الدالة SQL تحضري عبارة

query.bindValue)0, 2(;

query.bindValue)1, “Ali“(;

query.bindValue)2, 500(;

query.exec)(;

مترير املتغريات بالرتتيب :

:id رقم 0 للمتغري

:name رقم 1 للمتغري

:points رقم 2 للمتغري

query.prepare)“INSERT INTO userpoints )id, name, points( “

“VALUES ):id, :name, :points(“(;

query.bindValue)“:id“, 3(;

query.bindValue)“:name“, “Mohsen“(;

query.bindValue)“:points“, 1200(;

query.exec)(;

تحضري عبارة SQL بإستخدام الدالة prepare وإضافة متغريات لها id, :name, :points:، ومترير املتغريات

بواسطة الدالة bind بأسامء املتغريات.

QtSql Module وحدة فصائل التعامل مع قواعد البيانات

Page 217: Qt in Arabic

216

int rows = 0;

اإلعالن عن املتغري rows من النوع int ليمثل عدد سطور الجدول.

QStandardItemModel *mymodel = new QStandardItemModel;

mymodel->setColumnCount)3(;

تصميم منوذج الجدول لوضع البيانات بداخله.

query.exec)“SELECT * FROM userpoints“(;

.userpoints مبارشة إلستخراج محتويات الجدول SQL تنفيذ عبارة

while )query.next)((

{

mymodel->setItem)rows , 0 ,new QStandardItem) query.value)0(.toString)( ((;

mymodel->setItem)rows , 1 ,new QStandardItem) query.value)1(.toString)( ((;

mymodel->setItem)rows , 2 ,new QStandardItem) query.value)2(.toString)( ((;

rows++;

}

ui->datatable->setModel)mymodel(;

عملية تكرارية مستمرة : فطاملا وجدت سجالت while query.next يتم إضافة محتويات كل سجل من

.datatable ثم عرض النموذج بالجدول ،mymodel حقول داخل النموذج

نالحظ هنا إستخدام toString للقيم املمثلة للحقول query.value، حيث أن القيمة املرتدة من الدالة

القيمة تحويل ميكن سابقا، حيث الفصيلة هذه قمنا برشح وقد ،QVariant النوع من تكون value

.toString , toInt , toDouble إىل أى نوع بيانات مثل QVariant

فإذا أردنا ىف املثال السابق إجراء عملية حسابية عىل حقل points، سنقوم بتحويل القيمة املرتدة من

.int إىل النوع value الدالة

int pointsval = query.value)2(.toInt)(;

................................................................................

QtSql Module وحدة فصائل التعامل مع قواعد البيانات

Page 218: Qt in Arabic

217

الربمجـة املوازيــة

Multithreaded Programmig )QThread Class(

Multithreaded Programming الربمجة املوازيــة

Page 219: Qt in Arabic

218Multithreaded Programming الربمجة املوازيــة

Page 220: Qt in Arabic

219

الربمجة مقومات أهم من هى Multithreaded Programming املوازية الربمجة

الحديثة التى ال ميكن ألى لغة برمجة اإلستغناء عنها، وباملفهوم العادى ميكننا تعريف الربمجة

املوازية بأنها طريقة لتنفيذ أكرث من كود داخل نفس التطبيق وىف نفس الوقت.

طريقة الربمجة العادية تتم بتمرير عبارات الكود لتنفيذها بشكل تسلسىل، حيث يتم

تنفيذ عبارة الكود األوىل ثم تتبعها الثانية فالثالثة وهكذا..

نفس ىف األكواد من مجموعتني تنفيذ من املربمج لتمكن فتأىت املوازية الربمجة أما

الوقت، مام يعطى للمربمج إمكانية حل مشاكل برمجية كثرية.

وميكن أن نرى الربمجة املوازية ىف كثري من التطبيقات مثل برامج املحادثات الصوتية

واملرئية، حيث يتوجب علينا برمجة مجموعتني من األكواد ليعمال معا ىف نفس الوقت داخل

نفس التطبيق ) كود إلرسال البيانات و كود إلستقبال البيانات (، وهذا ما ميكن تحقيقه بواسطة

الربمجة املوازية.

سنكتفى والتى ،QThread الفصيلة خالل من املوازية الربمجة كيوت لنا تقدم

بتعريفها ورشح مثال بسيط يوضح كيفية التعامل معها.

................................................................................

Multithreaded Programming الربمجة املوازيــة

Page 221: Qt in Arabic

220

نسب الفصيلة :

QObject ترث فصيلة

تعريف الفصيلة :

مع تنفيذ املتوازية زمنيا الربمجة تنفيذ مجموعة من أكواد الفصيلة املسؤولة عن هى

أكواد التطبيق.

وظائف الفصيلة :

- الدالة )(run : هى الدالة التى يوضع بداخلها الكود املـراد تنفيذه بالتـوازى زمنيا مع كـود

التطبيق.

.run)( تقوم ببدء تشغيل الفصيلة لتنفذ كود الدالة : start)( الدالة -

.run)( تقوم ببث إشارتها عند بدء تنفيذ كود الدالة : started)( دالة اإلرسال -

.run)( تقوم ببث إشارتها بعد إنتهاء تنفيذ كود الدالة : finished)( دالة اإلرسال -

.run)( تقوم ببث إشارتها عند إيقاف تنفيذ كود الدالة : terminated)( دالة اإلرسال -

ميكانيكية العمل :

ليتم إستخدام هذه الفصيلة بالطريقة الصحيحة نتبع الخطوات اآلتية:

.QThread توليد كود فصيلة جديدة ترث فصيلة -

- تعريف الدالة )(run داخل النطاق العام )public( بالفصيلة الجديدة.

- كتابة الكود املطلوب تنفيذه بداخل الدالة )(run ىف امللف التفصيىل للفصيلة الجديدة.

.start)( بدأ التنفيذ عن طريق الدالة -

الدالة كود تنفيذ ويبدأ ،started)( اإلرسال دالة إشارة بث يتم start)( الدالة تشغيل وببدء

)(run، وعند اإلنتهاء يتم بث إشارة دالة اإلرسال )(finished، وىف حالة توقف التنفيذ ألى سبب

.terminated)( مفاجئ يتم بث إشارة دالة اإلرسال

وسيقوم املثال التاىل بتوضيح إمكانيات هذه الفصيلة بصورة مبسطة.

QThread Class

Multithreaded Programming الربمجة املوازيــة

Page 222: Qt in Arabic

221

مثـــال : يقوم املثال التاىل مبجموعتني منفصلتني من العمليات عىل التوازى.

املجموعة األوىل تقوم بها دالة التطبيق االساسية main، وتتمثل ىف اآلىت :

................................................................................

املجموعة الثانية تقوم بها الدالة املوازية للفصيلة Thread، وتتمثل ىف اآلىت :

وبالتاىل فعند مترير القيمة 5 للفصيلة Thread سيتم عمل إيقاف الفصيلة،

،False سوف نحصل عىل القيمة Thread و عند إختبار عمل الفصيلة

مام يؤدى إىل إنهاء التطبيق.

ويتكون التطبيق من امللفات اآلتية:

.main امللف الرئيىس و الذى يحتوى عىل دالة التطبيق الرئيسية : main.cpp

.QThread ملف تعريف الفصيلة الوارثة لفصيلة :mythread.h

.QThread ملف الكود التفصيىل للفصيلة الوارثة لفصيلة :mythread.cpp

Thread تشغيل الفصيلة

Thread إختبار عمل الفصيلة

طلب إدخال قيمة من املستخدم

إغالق التطبيق

thread مترير القيمة للفصيلة

isRunningFalse

isRunning

True

Thread إيقاف عمل الفصيلة Thread 5 =إختبار القيمة القادمة للفصيلة

!= 5

Multithreaded Programming الربمجة املوازيــة

Page 223: Qt in Arabic

222

mythread.h#ifndef MYTHREAD_H

#define MYTHREAD_H

#include >QThread>

class mythread : public QThread

{

Q_OBJECT

public:

explicit mythread)QObject *parent = 0(;

void setTestVal)int(;

void run)(;

private:

int testval;

};

#endif // MYTHREAD_H

mythread.cpp#include «mythread.h»

#include >QDebug>

mythread::mythread)QObject *parent( :

QThread)parent(

{

testval = 0;

}

void mythread::setTestVal)int i(

{

this->testval = i;

msleep)10(;

}

void mythread::run)(

{

while)testval !=5(;

qDebug)( >> «The thread finished\n»;

this->testval = 0;

}

EXAmpleNO 40

Multithreaded Programming الربمجة املوازيــة

Page 224: Qt in Arabic

223

رشح الكود السابق

mythread.h امللفclass mythread : public QThread

.QThread بأنها ترث الفصيلة mythread تعريف الفصيلة

Q_OBJECT

.QObject ليكسب الفصيلة خواص الفصيلة Q_Object إضافة املاكرو

void setTestVal)int(;

.private املوجود بالنطاق testval دالة لتقوم بإدخال قيمة املتغري

void run)(;

الدالة )(run هى الدالة الرئيسية لهذه الفصيلة.

،main حيث أننا اآلن نتكلم عن دالة تقوم بتنفيذ مجموعة أكواد بالتوازى مع الدالة الرئيسية للتطبيق

ومن هذا املنطلق ميكننا أن نعترب أن الدالة )(run هى الدالة main للفصيلة mythread، وتبدأ بتنفيذ

.main.cpp كام سرنى داخل امللف start)( األكواد املوجودة بداخلها عند إستدعاء الدالة

................................................................................

mythread.cpp امللفvoid mythread::run)(

{

while)testval !=5(;

qDebug)( >> «The thread finished\n»;

this->testval = 0;

}

الكود التفصيىل للدالة )(run، حيث تقوم while بإختبار قيم املتغري testval ىف عملية تكرارية غري منتهية،

،The thread finished وعندها يتم طباعة العبارة ،testval فقط تنتهى إذا مررت القيمة 5 إىل املتغري

.finished)( وينتهى عمل الدالة فتبث الفصيلة إشارة دالة اإلرسال ،testval ثم مترر القيمة 0 للمتغري

البد أن نالحظ األىت:

نظرآ ألن الكود ) ;) while) testval !=5 ( هو كود غري منتهى،

فإن وضعه داخل الدالة main ىف امللف main.cpp سوف يتسبب ىف تجميد شاشة التطبيق،

.main فإنه سيعمل كتطبيق منفصل واليؤثر عىل الدالة QThread بفصيلة run)( ولكن بوضعه ىف دالة

Multithreaded Programming الربمجة املوازيــة

Page 225: Qt in Arabic

224

main.cpp#include >QtCore/QCoreApplication>

#include >QTextStream>

#include >QDebug>

#include «mythread.h»

int main)int argc, char *argv[](

{

QCoreApplication a)argc, argv(;

mythread tr;

tr.start)(;

QTextStream in)stdin(;

QString val;

QObject::connect) &tr , SIGNAL)finished)(( , &a , SLOT)quit)(((;

while)tr.isRunning)((

{

qDebug)( >> «The Thread Still Alive\n»;

qDebug)( >> «Set the Value to close the thread :»;

in >> val;

tr.setTestVal)val.toInt)((;

}

return a.exec)(;

}

رشح الكود السابق

mythread tr;

.mythread إلدارة فصيلة tr اإلعالن عن املتغري

tr.start)(;

.mythread بالفصيلة run)( لتشغيل الدالة start)( الدالة

QTextStream in)stdin(;

.stdin والتعامل مع وحدة اإلدخال ،QTextStream إلدارة فصيلة in اإلعالن عن املتغري

QString val;

.QString إلدارة فصيلة val اإلعالن عن املتغري

Multithreaded Programming الربمجة املوازيــة

Page 226: Qt in Arabic

225

QObject::connect) &tr , SIGNAL)finished)(( , &a , SLOT)quit)(((;

mythread من الفصيلة finished)( كود للربط بني دالة اإلرسال

،QCoreApplication من الفصيلة quit)( بدالة اإلستقبال

،finished)( دالة اإلرسال mythread وبالتاىل فعندما تبث الفصيلة

ستقوم الفصيلة QCoreApplication بتشغيل دالة اإلستقبال )(quit والتى تنهى التطبيق.

while)tr.isRunning)((

{

qDebug)( >> «The Thread Still Alive\n»;

qDebug)( >> «Set the Value to close the thread :»;

in >> val;

tr.setTestVal) val.toInt)( (;

}

،isRunning بإختبار الدالة while تقوم

والتى ستعود دامئا بالقيمة True طاملا أن الدالة )(run ىف الفصيلة mythread مازالت تعمل،

وبالتاىل فلن تنتهى هذه العملية التكرارية حتى تعود الدالة isRunning بالقيمة False، وذلك عند إنتهاء

الدالة )(run ىف الفصيلة mythread من العمل،

.val بطلب إدخال قيمة املتغري in >> val وتقوم

private ىف بالنطاق testval املوجود املتغري القيمة املدخلة إىل بتمرير setTestVal)( الدالة ثم تقوم

.mythread الفصيلة

عند تشغيل التطبيق :

ىف حالة إدخال أى رقم ستظل العملية التكرارية ولن يحدث شئ،

أما ىف حالة إدخال الرقم 5 سيحدث اآلىت :

.mythread بالفصيلة testval سيتم متريره إىل املتغري -

.finished)( ستنهى عملها، وتبث إشارة الدالة run)( ونتيجة إلختباره ىف داخل الدالة -

- وبالتاىل سيعود إختبار الدالة isRunning بالقيمة False مام ينهى العملية التكرارية.

دالة بتشغيل QCoreApplication الفصيلة )(finished ستقوم الدالة إشارة لبث - ونتيجة

اإلستقبال )(quit والتى تنهى التطبيق.

................................................................................Multithreaded Programming الربمجة املوازيــة

Page 227: Qt in Arabic

226

بعض الكتب الهامة باللغة اإلنجليزية :Foundation of Qt Development -

C++ GUI Programming with Qt 4 )2nd Edition( -

C++ GUI Qt 4 -

Qt 4 Professional programming with C++ -

مواقع هامة :qt.nokia.com -

www.qtforum.org -

ىف حالة وجود أى مالحظات نرجو التواصل واإلتصال عىل :

[email protected] -

Page 228: Qt in Arabic

227

ملحقـــــــــات

ملحقــــــــــات

Page 229: Qt in Arabic

228

إدارة الذاكــــــــرة

Memory Managment

.) The Stack ( و ) The Heap ( أهم جزئني من الذاكرة يتم التعامل معهام هام

The Heap Memory

الحجــــم : حجم كبري يكفى لتسجيل كم هائل من البيانات و التعامل معها.

.heap يتم وضعه ىف الذاكرة ) Pointer (اإلستخدام : كل متغري يعرف مبؤرش

int *p[100];

.delete ويتم املسح بواسطة new بواسطة Heap املســــــح : توضع املتغريات ىف الذاكرة

char *string = new char[100]; >----- Heap تم حجز املساحة ىف الذاكرة

...

delete string; >----- Heap تم املسح من الذاكرة

البد من إستخدام delete ملسح املساحة املحجوزة من الذاكرة حتى ال يؤدى ذلك إىل إهدار مساحات بدون فائدة،

.Stack فينصح بوضع الفصائل و املصفوفات الكبرية بها بدال من Heap ونظرا لكرب حجم الذاكرة

The Stack Memory

الحجــــم : حجم صغري ويفضل وضع البيانات ذات الحجم الصغري بها.

.stack يتم وضعه ىف الذاكرة ) Pointer (اإلستخدام : كل متغري ال يعرف مبؤرش

int p[100];

املســــــح : يتم وضع املتغريات ىف الذاكرة stack مبجرد الدخول لنطاق الكود ) } ( ويتم مسحها منه

مبجرد الخروج منه ) { (

{

int p[100]; >----- Stack تم حجز املساحة ىف الذاكرة

...

} >----- Stack تم املسح من الذاكرة

العامة الفصيلة األب كيوتهى بوضع الذاكرة داخل لذلك فان أفضل طريقة إلدارة

)parent( ىف الذاكرة Stack، و وضع باقى األبناء و التفرعات ىف الذاكرة Heap، وبالتاىل فبمجرد

غلق الربنامج ) مسح الفصيلة األب ( يتم مسح كل األبناء بشكل تلقاىئ إلخالء الذاكرة متاما.

ملحـــــق ) ١ (

ملحقــــــــــات

Page 230: Qt in Arabic

229

هيكل بنية الفصائل ىف ىس ++

C++ Classes Structure

.) C++ Classes KeyWord ( ++نستعرض ىف البداية مفاتيح الفصائل ىف ىس

class - new - delete - public - private - protected - friend

وبعض الرموز :

) . , : , :: , -> (

.) Class Standard Structure ( الهيكل املعيارى للفصيلة

class myclass : inherites class

{

myclass)( >--- Constructor Function دالة البناء

~myclass)( >--- Destructor Function دالة الهدم

public: >--- نطاق املتغريات و الدوال العامة

private: >--- نطاق املتغريات و الدوال الخاصة

protected: >--- نطاق املتغريات و الدوال املحمية

};

myclass :: myclass)( >--- Constructor Function تفصيل دالة البناء

{

}

myclass :: ~myclass)( >--- Destructor Function تفصيل دالة الهدم

{

}

ملحـــــق ) ٢ (

ملحقــــــــــات

Page 231: Qt in Arabic

230

هيكل بنية الفصائل ىف ىس ++

C++ Classes Structure

عند اإلعالن عن مؤرش Pointer يرمز لفصيلة.

myclass *ptr;

.myclass لحجز مكان ىف الذاكرة بحجم new يتم إستخدام

ptr = new myclass;

تستخدم delete إلخالء املكان ىف الذاكرة.

delete ptr;

يستخدم الرمز ) <- ( للوصول إىل أعضاء الفصيلة

.Heap ىف حالة تعريف الفصيلة ىف الذاكرة

ptr->class_object;

يستخدم الرمز ) . ( للوصول إىل أعضاء الفصيلة

.Stack ىف حالة تعريف الفصيلة ىف الذاكرة

myclass ptr;

ptr.class_object;

................................................................................

ملحـــــق ) ٢ (

ملحقــــــــــات

Page 232: Qt in Arabic

231

Mac OS X تنصيب كيوت عىل نظام ماك

apple.com وميكنك تحميله مجانا من موقع ،xcode_iphone_sdk.dmg أوال : يتم تنصيب

qt.nokia.com وميكنك تحميله مجانا من موقع ،Qt4.7.dmg ثانيا : يتم تنصيب

ملحـــــق ) ٣ (

ملحقــــــــــات

Page 233: Qt in Arabic

232

مكان وجود جميع أدوات كيوت :

/Developer/Application/Qt .

وهذه األدوات :

Assistant.

Designer.

Linguist.

وهذه األدوات تجتمع داخل:

Qt Creator.

مكان وجود جميع أكواد أمثلة كيوت :

/Developer/Examples/Qt .

وميكنك تشغيل هذه األمثلة عن طريق

التطبيق املوجود ىف املجلد السابق :/Developer/Application/Qt/qtdemo.

ملحـــــق ) ٣ (

ملحقــــــــــات

Page 234: Qt in Arabic

233

Windowsتنصيب كيوت عىل نظام ويندوز

ميكنك تحميله مجانا من موقع qt.nokia.com وال يلزمك أى أدوات أخرى.

ملحـــــق ) ٣ (

ملحقــــــــــات

Page 235: Qt in Arabic

234

مكان وجود جميع أدوات كيوت:

C:\Qt\2010.05\qt\bin.

وهذه األدوات :

Assistant.

Designer.

Linguist.

وهذه األدوات تجتمع داخل:

Qt Creator.

Qt Creeator مكان وجود األداة

C:\Qt\2010.05\bin.

ملحـــــق ) ٣ (

ملحقــــــــــات

Page 236: Qt in Arabic

235

ملحـــــق ) ٤ (

QtCreator كيفية بدء تطبيق بواسطة الداةQt Creator نبدأ بتشغيل

File من القامئة New File or Project ثم نختار -

-ثم تظهر شاشة إختيار نوع التطبيق ) رسومى أو غري رسومى (

للتطبيق الرسومى :

Qt Gui Application نختار

للتطبيق الغري رسومى :

Qt Console Application نختار

ملحقــــــــــات

Page 237: Qt in Arabic

236

ClasName Inherits Macros , Constructors and Destructors

Level Type Function member

NON Macro

Q_OBJECT

VariablesLevel Type Name Info

Setters and Getter Function membersSetters Functions Getters Functions

Level Type Function Level Type Function

Slots and Signals

Q_SLOTS Q_SIGNALS

Level Type Function Level Type Function

ملحـــــق ) ٥ (

ملحقــــــــــات

Page 238: Qt in Arabic

237

ملحـــــق ) ٥ (ClasName Inherits

Macros , Constructors and DestructorsLevel Type Function member

NON Macro

Q_OBJECT

VariablesLevel Type Name Info

Setters and Getter Function membersSetters Functions Getters Functions

Level Type Function Level Type Function

Slots and Signals

Q_SLOTS Q_SIGNALS

Level Type Function Level Type Function

ملحقــــــــــات

Page 239: Qt in Arabic

238

ملحـــــق ) ٥ (ClasName Inherits

Macros , Constructors and DestructorsLevel Type Function member

NON Macro

Q_OBJECT

VariablesLevel Type Name Info

Setters and Getter Function membersSetters Functions Getters Functions

Level Type Function Level Type Function

Slots and Signals

Q_SLOTS Q_SIGNALS

Level Type Function Level Type Function

ملحقــــــــــات

Page 240: Qt in Arabic

239

ملحـــــق ) ٥ (ClasName Inherits

Macros , Constructors and DestructorsLevel Type Function member

NON Macro

Q_OBJECT

VariablesLevel Type Name Info

Setters and Getter Function membersSetters Functions Getters Functions

Level Type Function Level Type Function

Slots and Signals

Q_SLOTS Q_SIGNALS

Level Type Function Level Type Function

ملحقــــــــــات

Page 241: Qt in Arabic

240

بسم الله الرحمن الرحيم

وقل رب زدن علم

الختـــــام

سورة ) طه : 114 (

Page 242: Qt in Arabic

السوق معظم على تطبيقاتها وهيمنة مايكروسوفت إلستحواذ شركة * نظرا العربية وجتنيد العقول خلدمة تطبيقاتها،

* ونظرا لرؤيتنا أن كيوت هى إحدى وسائل اخلالص من هذه الهيمنة وفتح اآلفاق أمام العقول املبدعة،

* ونظرا لعدم وجود كتاب أو شرح وافى لهذه األداة باللغة العربية،

قررنا إعداد هذا الكتاب والذى يعتبر أول كتاب يتناول شرح أساسيات كيوت باللغة العربية،