• 0
miss y

Signalslot المرجع العربي

سؤال

post-140583-1238542203_thumb.gif

Signal and Slot

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

وصف المقال:

هذا المقال سيكون ملخص متكامل و مرجع عربي كامل لآلية Signal and Slot المبتكرة في نظام Qt. سيعتمد المقال على مراجع موثوقة مثل التوثيقات و المسودات الرسمية لـ Qt بالإضافة إلى بعض المراجع التجارية مثل الكتب التي تعتني بدراسة Qt.

هذا الملخص ليس موجزاً بل سيعمل على جمع شتات آلية Signal and Slot ليكون مرجع عربي لهذه الآلية, هذا يعني أنه موجهاً لكل مهتم و مهتمة بتقنية Qt في العالم العربي.

مدخل إلى مفهوم Signal and Slot:

بطبيعة البرامج ذات الواجهة الرسومية و التي تعتمد في بنائها على الكائنات المرئية(الزرارات و الآيكونات) أو تلك الغير مرئية و التي تعمل كأدوات مساعدة لغيرها خلف الكواليس فإن هناك آلية مسؤولة لتحقيق إتصال بين تلك الكائنات. هذا الإتصال ببساطة أو بتصور عقلي هو عبارة عن رسائل أو إشارات تُرسل من كائن إلى آخر أثناء تغير حالته الراهنة, على سبيل المثال الضغط على زرار معين أو تعبئة أو تفريغ زرار الراديو ستقوم هذه الكائنات بإرسال إشارة إلى النظام المسؤول عن البرنامج مشيرة إليه بأن حالتها الراهنة قد تغيرت. هذا ما يُعرف بالـ Signal في نظام و تقنية Qt.

بناءً على تلك الإشارة أو تلك الرسالة Signal قدْ يكون هناك استغلال لهذه الإشارة من قِبل المبرمج لتنفيذ أمر برمجي أو لإجراء عملية برمجية في البرنامج. هذا الإجراء و تحديداً في لغة ++C و تقنية Qt دائماً يكون مهيكلاً على شكل دالة Function و هي دالة عادية جداً بالنسبة للغة ++C أما بالنسبة لنظام و تقنية Qt فهي تُسمى Slot.

عملية الربط هذه بين الكائنات داخلياً في البرنامج بهذه الطريقة تُسمى اصطلاحياً بـ inter-object communication. و آلية signal and slot تعمل على تحقيق هذا الربط و هذا الإتصالات بين الكائنات في البرنامج, و التي ابتكرتها منظمة Trolltech حصرياً لتقنية Qt خالية من العيوب التي قد تكون في آليات أخرى مشابهة في بعض المكتبات الرسومية.

برنامج استهلالي:

سنقوم في هذا المثال بإلقاء نظرة على ماهية آلية Signal and Slot لفهم بعض الأشياء الأساسية و العامة من الناحية النحوية و التقنية.

برنامج التالي عبارة عن مزلاج slider و صندوق الفافة spin box قمنا بعملية ربطهم بواسطة آلية Signal and slot, بحيث إذا قمنا بتحريك المزلاج لتغيير المعيار يتأثر بهذه العملية قيمة صندوق الفافة و العكس صحيح. الصورة التالية للقطعة المهمة من الشيفرة بالإضافة إلى نافذة البرنامج اثناء التطبيق:

post-140583-1238542652_thumb.png

ما يهمنا في هذه الشيفرة هي القطعة البرمجية من السطر 26 إلى غاية السطر 33, و التي تصف لنا كيفية استعمال آلية Signal and Slot و كيفية ربط الكائنات بواسطتها.

شرح البرنامج السابق:

بعد تضمين كل الملفات المطلوبة للأصناف المستخدمة في البرنامج مثل Qwidget و QspinBox و Qslider و بعد إنشاء الكائنات و تعيين خصائصها من قيم و غير ذلك, و تصفيفهن بواسطة آلية التصفيف Layout, حان وقت الربط بين تلك الكائنات كما هو موجود من السطر 26 إلى السطر 33.

كل الأصناف في Qt وارثة شرعية من الصنف الجد الأكبر Qobject. و في هذا الصنف هناك الدالة المسؤولة عن عملية ربط الكائنات بعضها ببعض و هي الدالة connect. نعم! هناك دالة ايضاً تعمل على فصل و إلغاء هذا الإتصال و هذا الربط و هي الدالة disconnect.

الدالة connect هذه و التي هي المسؤولة عن تنظيم عملية الربط بين الكائنات بواسطة آلية Signal and Slot تتضمن اربعة خانات لكتابة و تمرير المقترحات اللازمة لعملية الربط. الخانة الأولى و هي لكائن ما و يجب أن يكون مؤشراً pointer أو مرجعاً reference, و هو الكائن الذي نريد استغلال إشارته التي يقذفها إذا طرأ عليه تغيير ما و هي الـ SIGNAL الخاصة به و هي متضمنة في الخانة الثانية بين أقواس الماكروز SIGNAL. تماماً مثل valueChanged(int) الموجودة بالبرنامج السابق و هي القطعة التالية:

post-140583-1238543421_thumb.png

الخانة الثالثة و هي مخصصة لكائن ما و يجب أن يكون مؤشراً pointer أو مرجعاً reference ايضاً. هذا الكائن هو الذي سينتظر تلك الإشارة من الكائن الأول ليقوم بتنفيذ و استدعاء الدالة المتمثلة في الخانة الرابعة و الأخيرة و هي الـ SLOT الخاصة به.

إذا الخانات للدالة connect تكون من اليسار إلى اليمين متفرقة بالفاصلة على النحو التالي:

,..,.,.,.,,..,.,.,.,.,.,.,.,.,.,,.,.,.,.,.,.,.

كائن1, الـ signal لكائن1, كائن2, الـ slto لكائن2

,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.

ملاحظة:

ربما تكون هناك حالة خاصة واحدة فقط و هي ربط signal بـ signal آخر لكائن2, بنفس الترتيب تماماً.

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

ملاحظة:

البرنامج السابق ليس برنامج نموذجياً و إنما فقط لإيصال الفكرة الأولى و مفهوم عملية الربط نحوياً و ذكر بعض الأساسيات.

سنكمل لاحقاً إن شاء الله بمشاركات متفرقة لإيصال هذا المفهوم بالكامل من الألف إلى الياء, بأوقات فراغي

إعداد و شرح خيتكم رغــد

طبعاً هنيك كم حرف مترجمتن من بعض المراجع

:happy:

الملف المصدري للبرنامج موجود بالمرفقات

سبب التعديل: إضافة الملف المصدري للبرنامج

main.rar

تم تعديل بواسطه HGB
6

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

13 إجابة على هذا السؤال .

  • 0

post-140583-1238799680_thumb.gif

Signal and Slot

كيفية ربط الكائنات

في تقنية Qt بطريقة مرئية بواسطة

Qt Designer

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

تمهيد:

المقصود من طريقة مرئية كما هو بالعنوان لهذه المشاركة هو كيفية ربط الكائنات بواسطة آلية Signal and Slot بواسطة السحب و الإفلات باستعمال الماوس, و هذا يتم في المصمم المرئي الخاص بـ Qt و المعروف باسم Qt Designer.

هذا المصمم يُثبّت تلقائياً عندما نقوم بتثبيت نظام تطوير Qt, و هو عبارة عن برنامج يسمح لنا بتصميم واجهات برامجنا الرسومية بطريقة استهلالية بسرعة و تقنية عالية. مصمم بواسطة مطوريّ نظام Qt باستعمال نظام Qt.

صورة مصغرة للبرنامج Qt Designer

في حالة التحرير و الإنشاء لهذا الدرس

post-140583-1238799850_thumb.png

موضوعنا هنا ليس حول برنامج Qt Designer و لكن سنتعرف على الحالات الأربع الرئيسية لهذا البرنامج بإيجاز بناءً على الصورة التالية للزرارت الأربع لتعين حالة البرنامج Qt Designer.

الحالات التحريرية الأربع ببرنامج Qt Designer:

post-140583-1238799903_thumb.png

من الصورة السابقة من اليسار إلى اليمين:

1 – حالة البرنامج التحريرية لإنشاء الواجهة الرسومية:

هذا المود أو هذه الحالة للبرنامج تسمح لنا بتحرير و إنشاء الكائنات الرسومية بواسطة الماوس.

2- حالة البرنامج لربط الكائنات بواسطة آلية Signal and Slot و هي الحالة التي سنهتم بها في هذه المشاركة.

3- حالة إنشاء الرفقاء أو الزملاء بمعنى آخر Buddies. و هي الحالة التي تسمح لنا بتحرير و إنشاء كائنات زميلة و مرافقة بينها و بين الرقعة النصية Label.

4- حالة تعين الترتيب النشاطي للكائنات أثناء استعمال الزرار Tab الموجود بلوحة المفاتيح. حيثُ إذا قمنا بالضغط على زرار Tab ينتقل النشاط أو تركيز البرنامج, بين الكائنات بحسب الترتيب المعمول في هذه الحالة.

عودة إلى الحالة الخاصة بآلية Signal and Slot:

الآن بعد أن قمنا و بشكل مرئي(بواسطة السحب و الإفلات) من إنشاء كلاً من الكائنات, المزلاج slider و القرص المعيار dial و تصفيفهم أيضاً بشكل مرئي بواسطة Layout...

post-140583-1238800002_thumb.png

نقوم بالضغط على زرار الحالة 2 المخصصة لعملية الربط بين الكائنات بواسطة آلية Signal and Slot. في هذه الحالة ستكون لدينا الفرصة و بواسطة السحب و الإفلات بالماوس فقط من ربط الكائنات بعضهن ببعض. الآن نقوم بتمرير مؤشر الماوس(بدون الضغط عليه) على قرص المعيار dial لنجد أن كامل مساحته ملونة باللون الأحمر الشفاف و هذا بمجرد المرور بمؤشر الماوس فقط على الكائنات أثناء وضعية و حالة تحرير Signal and Slot:

post-140583-1238800063_thumb.png

الآن نقوم بالضغط بالماوس و السحب من قرص المعيار dial إلى المزلاج slider لنجد أن هناك سهم ملازم لمؤشر الماوس مشيراً إلى المزلاج و نجد مساحة المزلاج مغطاة باللون الأحمر الشفاف ايضاً.

post-140583-1238800145_thumb.png

الآن بمجرد الإفلات سيقوم البرنامج بفتح نافذة حوار مكونة من قائمتين. من اليسار إلى اليمين-- قائمة للـ Signals الخاصة بقرص المعيار dial و قائمة مخصصة للـ Slots للكائن التاني و هو في هذه الحالة هو المزلاج slider.

نقوم بانتقاء الـ signal المناسب و هو valueChanged لقرص المعيار dial ثم نقوم باختيار الـ slot المناسب من القائمة الثانية للمزلاج slider و هو setValue.:

post-140583-1238800180_thumb.png

ملاحظة: نقوم بإختيار الخيار Show all signals and slots لإظهار الكل...

الآن نضغط على زرار الموافقة Ok لنشاهد أن عملية الربط تمت من خلال بعض التلميحات الموجودة على الكائنات بالواجهة:

post-140583-1238800284_thumb.png

نقوم باختبار برنامجنا بواسطة الأمر preview من القائمة Form لنلاحظ أننا إذا قمنا بتغير قيمة قرص المعيار يقوم بإرسال الـ signal الخاص به valueChaned مشيراً إلى تغيير قيمته و من ثم يستقبل المزلاج slider هذه الإشارة ليقوم بتنفيذ مهمته بواسطة الـ slot الخاص به و هو setValue فيتحرك استجابةً لقيمة القرص.

post-140583-1238800343_thumb.png

صورة اثناء المشاهدة للتطبيق الفعلي

الآن حاولوا تحريك المزلاج!! لن تشاهدوا أي تأثير على قيمة و حالة قرص المعيار!! لأننا ببساطة لم نقم بعمل ربط من المزلاج إلى القرص بل العكس و هذا سيكون تمرين لكم بنفس الخطوات السابقة و لكن بطريقة عكسية. من المزلاج إلى قرص المعيار...

حاولوا ربط المزلاج بالقرص كتمرين يعني...

:happy:

اختكم المخلصة: رغــد

:happy:

2

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

post-140583-1239126902_thumb.gif

Signal and Slot

مشاركة تعزيزية للمشاركة السابقة

في كيفية ربط الكائنات بطريقة

مرئية في برنامج

Qt Designer

المرسِل و المستقبل Sender and Receiver:

بكل بساطة الكائن و بشكل عام سواءً بطريقة مرئية او كتابة الشيفرة يدوياً فإن الكائن المرسِل هو ذلك الكائن الذي سيقوم بقذف الـ Signal الخاصة به و الكائن المستقبِل هو ذلك الكائن الذي سيقوم باستدعاء الـ Slot الخاصة به استجابةً لهذا الـ Signal.

تعيين الكائن المرسِل بطريقة مرئية هو الكائن الأول الذي نقوم بالضغط عليه بالماوس و السحب من جهته إلى الكائن المستقبل.

الصورة التالية ستوضح لنا بعض الأمور التي ستكون صورة و شرح تعزيزي للمشاركة السابقة:

post-140583-1239127516_thumb.png

الصورة السابقة هي عبارة عن واجهة بسيطة لعرض الوقت رقمياً و تصورياً و يجب في هذه الحالة عمل ربط بين الكائنات بواسطة Signal and Slot ليتم تغير القيم و اتجاه عقارب الساعة بانسجام و توافق زمني.

حسناً نشاهد الصورة مكونة من مجموعة كائنات مترابطين ببعض و هم:

- ساعة Analog Clock

- حقل لتحرير الوقت Time Edit

- و صندوق لفافة Spin Box لتعيين النطاق الزمني

- رقعتين نصية Label لتوضيح الكائنات للمستخدم

نلاحظ أن هناك عملية ربط تمت مسبقاً بين الساعة الزمنية Analog Clock و بين حقل تحرير الوقت Time Edit و عرفنا أنها تمت مسبقاً باللون الأزرق للسهم. نلاحظ ايضاً أن العملية و إشارة السهم تشير إلى أن المرسِل للـ Signal هي الساعة الزمنية و أن المستقبل أو المتلقي و الذي سيقوم بإستدعاء الـ Slot الخاصة به هو حقل تحرير الوقت.

أما بخصوص عملية الربط التانية, فإن المرسِل هو الكائن صندوق اللفافة المخصص لتعين النطاق الزمني الجغرافي. و المتلقي(المستقبِل) هي الساعة Analog Clock!

الجدير بالملاحظة هنا هو توضيح عملية الربط بيانياً ايضاً بواسطة السهوم و المربعات النصية التي تشير إلى اسماء الـ signals و الـ slots الخاصة بكل كائن.

,.,.,.,.,.

كيفية حذف الربط:

بكل بساطة بتحديد الكائنات المترابطين(بالضغط البسيط بالماوس على الكائنات), و من ثم الضغط على زرار delete من لوحة المفاتيح. و لكن!! في وضع تحرير آلية Signal and Slot و ليس في وضع تحرير الكائنات.

هذه رغــد , من حجرتها, قسم الـ Qt منتديات الفريق العربي

:happy:

سبب التعديل: آسفة!! إضافة طريقة حذف الربط

تم تعديل بواسطه رغـد
1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

post-140583-1239406519_thumb.gif

كيفية الربط بطريقة بيانية(بواسطة الحقول)

باستعمال المُحرر الخاص بـ

Signal and Slot

في برنامج

Qt Desinger

,.,.,.,.,.,.,.,.

عرفنا من المشاركات السابقة مفهوم آلية Signal and Slot و كيفية إستعمالها و التعامل معها ابتدائياً و بطريقة إستعمال برنامج Qt Designer و بشكل مرئي. الآن و هذا مجرد درس بسيط في كيفية استعمال Signal and Slot Editor و هو عملية ربط بيانياً (ليس بواسطة استعمال السحب و الإفلات) بواسطة انتقاء من اضافة و انتقاء من قوائم معينة.

و بعد أن عرفنا ما هو الكائن المرسِل Sender و ما هو الكائن المستقبِل(المتلقي) Receiver من المشاركات السابقة للمقال.

هنا

كيفية الربط بواسطة محرر Signal and Slot:

بكل بساطة و بعد إنشاء الكائنات اللازمة للواجهة الرسومية و بعد تعيين قيمها الإستهلالية و خصائصها و ترتيبها بطريقة نموذجية, نقوم باختيار الأمر Signal and Slot من قائمة Tools ببرنامج Qt Designer و هذا إذا لم يكن المحرر مفتوحاً مسبقاً بالبرنامج. سنشاهد أن نافذة المحرر أمامنا فارغة, و هذا إن لم تكن هناك كائنات مرتبطة ببعضها مسبقاً بواسطتنا أو بواسطة البرنامج أثناء إختيار النموذج:

صورة لمحرر Signal and Slot, فارغ تماماً ليست هناك

أي عملية ربط مسبقة أو محفوظة.

post-140583-1239406551_thumb.png

لو فرضنا أننا لا زلنا في الدرس السابق للمزلاج slider و قرص المعيار dial و نريد أن نعمل لهما ربط و لكن ليس بطريقة السحب و الإفلات بواسطة الماوس و إنما بواسطة المحرر هذا الخاص بـ Signal and Slot.

بكل بساطة نقوم بالضغط على زرار الإضافة و الذي له آيكونة علامة الزائد (+) من الصورة السابقة, حيثُ سنشاهد أن المحرر قام بإضافة صف استهلالي بدون قيم حقيقية مكوناً من أربعة عواميد كل عامود من اليسار إلى اليمين هو

- Sender

و هو اسم الكائن المرسِل

- Signal

الـ signal الخاص بالكائن المرسِل

- Receiver

و هو الكائن المستقبل(المتلقي)

- Slot

و هو الـ slot الخاصة بالكائن المتسقبل.

حسناً و بعد أن ضغطنا على زرار الإضافة, نقوم بتعبئة الصفوف بحسب الرغبة, في هذا الدرس قمتُ بعمل ربط ايضاً من قرص المعيار dial إلى المزلاج slider:

صورة لمحرر signal and slot أسناء تعبئة البيانات اللازمة

لعملية الربط بين القرص المعيار و المزلاج

post-140583-1239406560_thumb.png

نعم!, نستطيع حذف الربط في أي وقت نشاء! بواسطة الزرار الخاص بإزالة الربط و المعنون بالآيكونة المصورة لعلامة الطرح (-) من المحرر--شاهدوا الصورة السابقة للمحرر...

هذا كل شيء حول استعمال المحرر Signal and Slot في برنامج Qt Designer. تأملوا الصورة السابقة قليلاً وحاولوا التطبيق إذا تكرمتوا...

موفقين يا رب

خيتكم رغــد

2

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

post-140583-1240060024_thumb.gif

Signal and Slot

مشاركة تمهيدية

Qt Object Model

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

تنويه:

قمتُ بكتابة هذه المشاركة معتمدةً فيها مباشرةً على الملفات التوثيقية المساعدة لـ Qt.

تمهيد:

نريد أن نتصور أن تقنية و نظام Qt الرسومية أو الغير رسومية, عبارة عن إمتداد للغة ++C القياسية. هذا يعني أن Qt أضافتْ اشياء و ميزات و أداوات جديدة إلى لغة ++C القياسية, و على سبيل المثال موضوع هذا المقال الأساسي و هي آلية Signal and Slot.

أي اننا نستيطع أن نرى تقنية و نظام Qt من هذه الزاوية التي تشير إلى أن Qt و بجميع أدواتها ليست إلا إمتداداً برمجياً ناجحاً للغة ++C.

هذا الإمتداد و هذه الإضافة و الملحقات, تمت بواسطة استعمال تقنية في Qt تُسمى بـ Qt Object Model. نعم! هناك ما يُعرف بـ C++ Object Model و التي تتعلق بلغة ++C القياسية بدون اعتبار Qt.

الفرق بين C++ Object Model القياسية وَ بين Qt Object Model:

الفرق ببساطة و بإيجاز بليغ, يتجسد في النص هذا و ليس على شكل نقاط, و هو:

أن C++ Object Model ميزة نافعة و جوهرية في لغة ++C القياسية أثناء تنفيذ البرنامج at runtime و لكنها مستقرة بطبيعتها و ليست مرنة في مشاكل برمجية معينة. من ضمن هذه المشاكل البرمجية هي برمجة الواجهات الرسومية GUI و التي تتطلب مرونة عالية و أداء ممتاز في حالة الـ runtime أي اثناء تنفيذ البرنامج. لذلك! قاموا مطوري Qt بإنجاز هذه الفعالية و هذه المرونة بواسطة جمع و إستغلال سرعة لغة ++C و مرونة الـ Qt Object Model التي قاموا بابتكارها و تطويرها.

بعض الإضافات المميزة من Qt إلى ++C القياسية:

آلية Signal and Slot (و التي هي موضوع هذا المقال ).

آلية Object Properties.

الأحداث Events.

آلية ترجمة نصوص الواجهات إلى لغات عالمية Internationalization.

:

:

:

و بعض الميزات الأخرى...

معظم هذه الميزات المُضافة تُستعمل بإرتباط مع, لغة ++C القياسية و الصنف الأب QObject. لذلك نكون مضطرين أن نجعل ذلك الصنف الذي سيتضمن بعضاً من هذه المزايا و تلك الآليات (متل Signal and slot) وارثاً للصنف الأب QObject بطريقة مباشرة أو غير مباشرة.

خيتكم المخلصة: رغــد

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

post-140583-1240062970_thumb.gif

Signal and Slot

موجزاً عن نظام

Meta-Object

و المجمّع

moc

تنويه: سأقوم بكتابة هذه المشاركة معتمدة فيها كلياً تقريباً و نقلاً مباشراً من مصادر رسمية متل المسودات الرسمية و الملفات المساعدة لـ Qt.

Qt من منظور آخر (كأدوات) :

إنّ نظام Qt يتكون أو يتضمن مجموعة من الأدوات. أداوات تعمل وضائفها في سطور الأوامر, و أدوات تعمل وظائفها بطريقة مرئية, و أدوات مساعدة, و أدوات لها أدوار خاصة في حالات معينة, و هكذا...

الهدف الرئيسي من هذه الأدوات هو تسريع و تيسير عملية تطوير برامجنا بواسطة Qt.

رسمة توضيحية لمجموعة ادوات Qt

post-140583-1240062938_thumb.png

انا عاملتا

:happy:

الأدوات على شكل قائمة موجزة:

  • Qt DesignerQt Assistant

  • Qt Linguist, lupdate, lrelease

  • qmake

  • Meta-Object Compiler (moc)

  • User Interface Compiler (uic)

  • Resource Compiler (rcc)

  • Configuring Qt (qtconfig)

  • Examples and Demos Launcher

  • qt3to4 - The Qt 3 to 4 Porting Tool

  • QtDBus XML compiler (qdbusxml2cpp)

  • D-Bus Viewer


كما نشاهد بالقائمة بالأعلى, أداة تساعدنا على بناء واجهات رسومية بطريقة مرئية, و أداة مختصة للمساعدة و الوصول إلى التوثيقات النصية الرسمية لـ Qt, و أداة مسؤولة عن ترجمة نصوص الواجهات إلى لغات طبيعية(كالعربية مثلاً), أداة مسؤولة عن بناء المشروع بالكامل و نداء بعض الأدوات الأخرى لمساعدتها في هذا البناء, و أداة مسؤولة عن تحويل الواجهات الرسومية UI إلى ملفات برمجية نصية بلغة ++C...و هكذا

نظام Meta-Object:

يعتمد نظام Meta-Object في Qt على ثلاث اشياء أساسية:

- الصنف الأب QObject, و الذي يكون مفتاحاً رئيسياً لكل صنف وريث منه, ليتمكن من الإستفادة من مزايا نظام Meta-Object.

- الماكرو Q-OBJECT و الذي يكون متضمناً داخل القسم الخاص the private section من الصنف الذي نريد, لينالَ من مزايا نظام Meta-Object, و من تلك المزايا هو موضوعنا الرئيسي هنا و هي آلية Signal and Slot.

- المجمّع Meta-object complier و الذي يُختصر حرفياً بـ moc, و هو الذي يزوّد أي صنف وارث من الصنف الأب Qobject بالشيفرة البرمجية التلقائية لإستعمال ميزات و خصائص نظام Meta-Object.

كما عرفنا سابقاً أن كل الأصناف في Qt وريثة شريعة للصنف الأب Qobject و لكي تحضى برامجنا الرسومية او غير الرسومية بمزايا Qt, فإن اصنافنا المكتوبة و المعمولة بواسطتنا في برامجنا نحن, يجب أن تكون وارثة بطريقة مباشرة أو غير مباشرة من هذا النصف الأب.

و هنا نكون قدْ استعملنا مفتاحاً رئيسياً للإستفادة من نظام Meta-Object.

أيضاً من الضروري أن نكتب سطر أمر الماكرو البسيط و هو Q-OBJECT داخل القسم الخاص في قلب الصنف الذي نريد تضمين و إنشاء signals و أو slots مخصصةً له, ليشارك و يتواصل مع باقي الكائنات في البرنامج.

و هنا نكون قدْ فتحنا باباً رئيسياً للإستفادة من آلية Signal and Slot و من استعمال المجمّع moc لإنشاء و تنضيم بل للإعتراف بتلك الـ signals و تلك الـ slots المعمولة بواسطتنا للصنف الذي انشأنها.

هذا كل شيء تقريباً او بالأحرى كل شيء حول نظام Meta-object ليناسب مقالنا هذا حوْل آلية Signal and Slot.

كيفية عمل المجمّع Meta-object compiler moc:

ببساطة, يقوم المجمع moc بقراءة الملف الرأسي header file للبرنامج, إذا وجد في هذا الملف صنفاً واحداً أو أكثر يحتوي على سطر أمر الماكرو Q-OBJECT فإنه يقوم بإنتاج ملف مصدري آخر بلغة ++C يحتوي على شيفرة الـ meta-object و هي الشيفرة اللازمة لدعم آلية Signal and Slot.

بالإضافة إلى التعامل مع آلية Signal and Slot فإن المجمّع moc يدعم عملية ترجمة الواجهات الرسومية إلى لغات طبيعية مختلفة(مثل العربية) و نظام الخصائص property system و معلومات أخرى من أهمها جعل البرنامج بلغة ++C يعمل في منصات نُظم مختلفة.

هذا كل ما يلزم تمهيداً إلى الوصول اكثر إلى كيفية عمل و إنشاء أصناف تتضمن آلية Signal and Slot و كل ما يلزم للإشارة إلى moc في المشاركات اللاحقة إن شاء الله.

اختكم المخلصة: رغــد

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

ما شاء الله

مجهود رائع

لقد استخدت moc في الماضي كثيرا ، ولم اكن اعرف ما وظيفته، أما الآن فاصبح عندي فكرة اوضح.

عندي سؤال،

لماذا يجب تضمين الماكرو Q_OBJECT بشكل صريح في الصنف مع انه وارث من QObject ، ألا تكفي وراثة QObject لضمان دعم Signal and Slot ؟

قد يكون الجواب ان مطوري المكتبة تعمدو عدم وضع الماكرو Q_OBJECT في الـ QObject لزيادة السرعة، فليس من الضروري أن كل QObject بحاجة الى دعم Signal and Slot .

تم تعديل بواسطه Amjad.IT
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
لماذا يجب تضمين الماكرو Q_OBJECT بشكل صريح في الصنف مع انه وارث من QObject ، ألا تكفي وراثة QObject لضمان دعم Signal and Slot ؟

نعم تكفي الوراثة من QObject لجعل الفئة قادرة على استخدام signal/slot ، ولكن في حالة لم تعرف الماكرو Q_OBJECT فان الفئة لن تستطيع تعريف signal/slot خاصة بها .

ووظيفة moc هنا كما ذكرت الاخت رغد ، هي البحث عن ملفات الرأس والتي تحوي الماكرو Q_OBJECT ، ومن ثم يقوم بتحويل هذا الملف الى ملف سي++ قياسي . "بعد ازالة كل الماكروز مثل Q_OBJECT,signal,slots".

أيضا الماكرو Q_OBJECT يعمل كاشارة على ان الفئة بحاجة الى كائن من الفئة QMetaObject وهي فئة تحمل معلومات عن الفئة التي تحوي الماكرو Q_OBJECT ، من هذه المعلومات اسم الفئة و ال signal/slot الخاصة بهم.

وشكرا للاخت رغد على هذا الموضوع :).

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
ما شاء الله

مجهود رائع

لقد استخدت moc في الماضي كثيرا ، ولم اكن اعرف ما وظيفته، أما الآن فاصبح عندي فكرة اوضح.

عندي سؤال،

لماذا يجب تضمين الماكرو Q_OBJECT بشكل صريح في الصنف مع انه وارث من QObject ، ألا تكفي وراثة QObject لضمان دعم Signal and Slot ؟

قد يكون الجواب ان مطوري المكتبة تعمدو عدم وضع الماكرو Q_OBJECT في الـ QObject لزيادة السرعة، فليس من الضروري أن كل QObject بحاجة الى دعم Signal and Slot .

بارك الله بيك, شكراً

بخصوص الإجابة موجودة بمشاركتي السابقة...بالشق التالي

أيضاً من الضروري أن نكتب سطر أمر الماكرو البسيط و هو Q-OBJECT داخل القسم الخاص في قلب الصنف الذي نريد تضمين و إنشاء signals و أو slots مخصصةً له, ليشارك و يتواصل مع باقي الكائنات في البرنامج.

و هنا نكون قدْ فتحنا باباً رئيسياً للإستفادة من آلية Signal and Slot و من استعمال المجمّع moc لإنشاء و تنضيم بل للإعتراف بتلك الـ signals و تلك الـ slots المعمولة بواسطتنا للصنف الذي انشأنها.

إنشاء من الصفر مش الإستفادة من Signal و Slot موجودين مسبقاً و مورثين إلى اصنافنا...

و هاد بيكون إهتمامنا الحقيقي بالمشاركات الجية إن شاء الله

لأن هناك Signal and slot معمولين مسبقاً يعني predefined Signals and Slots من مطوري Qt. و لكن بنقدر ننشي و نعمل Signals and Slots لإحتياجتنا نحنا, و بنقدر نستعمل الأمر emit المسؤول عن قذف أي Signal عاملينه نحنا أو موجود ضمن الأصناف بـ Qt

و إن شاء الله رايحة تكون بمشاركات جية للموضوع

موفق يارب

:happy:

نعم تكفي الوراثة من QObject لجعل الفئة قادرة على استخدام signal/slot ، ولكن في حالة لم تعرف الماكرو Q_OBJECT فان الفئة لن تستطيع تعريف signal/slot خاصة بها .

ووظيفة moc هنا كما ذكرت الاخت رغد ، هي البحث عن ملفات الرأس والتي تحوي الماكرو Q_OBJECT ، ومن ثم يقوم بتحويل هذا الملف الى ملف سي++ قياسي . "بعد ازالة كل الماكروز مثل Q_OBJECT,signal,slots".

أيضا الماكرو Q_OBJECT يعمل كاشارة على ان الفئة بحاجة الى كائن من الفئة QMetaObject وهي فئة تحمل معلومات عن الفئة التي تحوي الماكرو Q_OBJECT ، من هذه المعلومات اسم الفئة و ال signal/slot الخاصة بهم.

وشكرا للاخت رغد على هذا الموضوع :) .

ما يحرمنا

و شاكرة لإضافتك الكريمة

:happy:

تم تعديل بواسطه رغـد
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

post-140583-1242520450_thumb.gif

تشريح الملف الرأسي

The header File

المخصص لإستعمال

آلية

Signal and Slot

اعتذار:

أولاً آسفة جداً لتأخري عن الموضوع لإنشغالي بمواضيع أخرى و ببعض الأمور الحياتية(لأ طبعاً مش افلام :happy: )

عودة إلى الموضوع:

حسناً يتبقى لنا الأشياء البسيطة, هذه المشاركة سنتعرف على الطريقة النموذجية لكتابة برنامج بسيط بلغة ++C على نحو عام و باستعمال Qt على نحو خاص. طبعاً بلا شك فإن نظام Qt مبنية تماماً بشكل نموذجي هندسي عالي الجودة. و دائما البرنامج و إن كان برنامجاً تافهاً يكون بشكل نموزجي! هذا يعني أن البرنامج يكون مقسّم إلى اقسام, هذه الأقسام بشكل أكبر هي الملفات. يتكون البرنامج (على الأقل) من ملف رأسي واحد Header File له الإمتداد h. و من ملفين مصدريين لهما الإمتداد cpp. واحداً منهما لكتابة خوارزمية و تفاصيل عمل كل شيء موجود بالملف الرأسي و الآخر هو ملف الزبون Client File و الذي يحتوي على الدالة الرئيسية main لكامل البرنامج.

ستجدون اكتر التفاصيل عن طريقة و هيكل هذه الملفات في الرابط التالي بأول المرفق مباشرةً.

الإسوارة (مرجع سريع لـ ++C)

بيزكرني ببداية انضمامي للمنتدى (كنت مستجدة) :happy:

تشريح الملف الرأسي لبرنامج بسيط بـ Qt:

نشاهد الصورة التالية لملف رأسي لصنف MyClass بشكل نموذجي و بتضمين سطور (ضرورية) من شان استعمال آلية Signal and Slot لهذا الصنف:

post-140583-1242520420_thumb.png

تشريح الشيفرة السابقة:

لا يهمنا السطر الرابع لأننا ربما لا نضطر لتضمين الملف الآب QObject إزا كنا سنضمن أحد الوارثين من الأصناف لهذا الصنف. و لكن و كما سبق و أن ذكرنا بأن استعمال Signal And slot بل و استعمال كل آليات Qt يجب أن تكون اصنافنا من أو وريثة من اصناف Qt بطريقة غير مباشرة او بطريقة مباشرة من الآب كما هو واضح في السطر رقم ستة. حسناً هذا هو المفتاح الرئيسي لإستعمال Qt بشكل عام و لكن المفتاح الضروري ايضاً لإستعمال آلية Signal and Slot و كل إمكانيات Meta Object تتجسد في السطر رقم تمانية و هو كتابة الماكروز Q_OBJECT. نعم, شرط اساسي لإنشاء Singal(s) و أو Slot(s) خاصة لأصنافنا نحن المبتكرة بواسطتنا.

حسناً, نلاحظ ايضاً جزء مهم و هو السطر الخامس عشر. وهو الجزء الذي يكون بشكل عادي public او private او protectd لكل الـ slots المُراد استعمالهن و تعريفهن. تكون هذه او تلك الـ slots تماماً و بالضبط متل أي دالة member function تعلّمناها في لغة ++C القياسية. ليس هنا أي شيء جديد.

حسناً نلاحظ في السطر التمان عشر 18 جزء خاص لكتابة توقيعات الـ signal(s) التي نريد الصنف يقوم بقذفها بواسطة الأمر emit متى ما شئنا في البرنامج. و ايضاً تماماً متل أي توقيع prototype تعلّمناه سابقاً في لغة ++C القياسية.

هذا كل شيء عن الهيك الأساسي للصنف الذي نريد منه أن يتضمن Signal(s) و أو Slot(s) معمولة بواسطتنا نحن لأغراضنا و لبرامجنا.

موفقين يارب

Bye...

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

post-140583-1242878824_thumb.gif

الطريقة النموذجية 2

آلية

Signal and Slot

تنويه:

المثال من مصدر التوثيقات الرسمية لـ Qt.

عودة إلى الملف الرأسي:

حسناً, سنتعرف الآن على كيفية إنشاء ملف رأسي لصنف مبتكر بواسطتنا و هو العداد Counter و الذي يجب أن يكون وارثاً من QObject سواء بطريقة مباشرة (هنا بالمشاركة) أو بطريقة غير مباشرة. طبعاً تعرفنا بالمشاركة السابقة مباشرة في تشريح الملف الرأسي بصورة سريعة و تجريدية الآن نريد أن نلقي نظرةً على كيفية كتابة الـ prototype للـ Slot الذي نريد إنشائه و كيفية إنشاء Signal ايضاً. نشاهد الصورة التالية:

post-140583-1242878852_thumb.png

حسناً كل شيء بالشيفرة السابقة تقريباً قد تعرفنا عليه سالفاً. و هي عبارة عن هيكل الصنف Counter و ما سنهتم له الآن في هذه الشيفرة هو السطر ستة عشرة 16 و الموجود داخل القسم الخاص بـ slots. و هو عبارة بكل بساطة عن دالة عادية member function و لكنها مميزةً بوجودها داخل هذا القسم لتكون slot في البرنامج. و ايضاً نستطيع استعمال هذه الدالة بشكل طبيعي كدالة عادية.

ايضاً السطر رقم تسعة عشر 19 سنهتم به, و هو عبارة عن توقيع او prototype إزا اردتم تسميته بهذا الشكل. و هو عبارة signal يمكننا استعماله في البرنامج لنتمكن من قذفه بواسطة الأمر emit لنشير بذلك إلى أن شيئاً ما (حالة) في البرنامج قد تغير مثلاً قيمة مربع نصي...

الإنتقال إلى الملف المصدري لكتابة تفاصيل الـ Slot:

طبعاً و كأي برنامج معمول بلغة ++C القياسية! فإننا نقوم بإنشاء الدوال الخاصة بالصنف و من ثم نقوم بتعريف و كتابة تلك التفاصيل البرمجية(خوازمية معينة) لهذه و تلك الدالة. و بما أن و كما اسلفنا سابقاً بأن الـ slot هو عبارة عن دالة عادية فإنها لها و عليها ما للدوال العادية و ما عليها. نشاهد الصورة التالية للهيكل البرمجي للـ slot المعمولة ببرنامجنا و هي setValue.

post-140583-1242878861_thumb.png

ليست هنا اي غرابة في الشيفرة السابقة و هي مجرد دالة عادية جداً و إنما عند عملية جمع البرنامج سُتعتبر هذه الدالة Slot في حالات و دالة عادية في حالات أخرى بحسب استعمالها في البرنامج و موقع الإعرابي. فمثلاً لو كانت مجرد عملية نداء لها ببساطة كالتالي:

setValue(33)

فهي مجرد دالة عادية و لكن لو كانت موجودة كإقتراح ممرراً إلى الدالة connect فإنها سُتعامل معاملة حسنة على أنها slot.

حسناً و من الشيفرة السابقة للـ slot نلاحظ أن هناك هيكل if الشرطية للتحقق من شرط معين إذا كان هذا الشرط true فإن هذا الكائن سيعين قيمة جديدة له ثم يقوم البرنامج بقذف الـ signal بواسطة الأمر emit مشيراً إلى أن قيمته الراهنة او الحالة الراهنة لهذا الكائن قد تغييرت و بذلك يتم التفاعل بين الكائنات بعضهن ببعض بالبرنامج.

حسناً لماذا لم نعيين القيمة و استعمال الأمر emit مباشرة بدون هيكل الشرط if؟

بكل بساطة هو لتجنب عملية التكرار اللامنتهي infinit loop لإننا لو قمنا بعمل ذلك بدون هذا الشرط سيقع البرنامج في عملية التكرار اللامتناهية بسبب أن الحالة ربما تكون ثابتة و ستتم عملية الدوران لهذا السبب.

كيفية عملية الربط بواسطة الدالة Connect:

الآن و بعد إنشاء كل ما سبق يمكننا إنشاء كائنات من هذا الصنف مترابطة بواسطة connect في البرنامج. نلاحظ الصورة التالية:

post-140583-1242878867_thumb.png

الجدير بالملاحظة في الصورة السابقة هو الدالة connect و تفاصيلها الإقتراحية(بين الأقواس). ايضاً و كما أسلفنا بأن الدالة connect أو بالأحرى الكائنات التي سنقوم بربطهن بهذه الآلية هما عبارة عن مرجع reference أو مؤشرات pointer لتلك الكائنات المُراد ربطهن مع بعض. كما تلاحظوا عملية إسباق الكائن a و الكائن b بعلامة المرجع &. نلاحظ أيضاً داخل اقواس الماكرو Signal مكتوبٌ فيها التوقيع العام للـ signal المعمول مخصوص بالصنف Counter و هو valueChanged. ثم نلاحظ الماكرو SLOT و يتضمن بين اقواسه الدالة الـ slot المعمولة و الموجودة ايضاً بالصنف Counter.

ملاحظة:

هناك قوانين و شروط اخرى يجب أن نرعاها اثناء عملية الربط تتعلق بالمقترحات (أنواع البيانات) الممرة داخل توقيع الـ signal او إلى slot و هناك استثناءات و ستكون على شكل نقاط إن شاء الله في المشاركات القادمة(طبعاً القوانين مجرد نقاط)...

فيلسوفة انا ...

لماذا لم نقم بكتابة خوارزمية معينة للـ Signal؟:

بكل بساطة الـ Signal مجرد إمضاءات (توقيع) يقوم نظام Qt بإدراجهن لجدول معين فقط للإشارة إليها و لقذفها بواسطة الأمر emit للإيحاء للبرنامج بأن الحالة تغيرت.

bye... إلى اللقاء في المشاركات القادمة إن شاء الله

تم تعديل بواسطه رغـد
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

post-140583-1249105808_thumb.gif

رسمة توضيحية و بعض النقاط بخصوص

آلية Signal and Slot

هذه مشاركة ستكون خاتمة للموضوع إن شاء الله

(كاتبة ملاحظة موجودة بآخر الصفحة لمجتمع Qt العربي)

مدى إمكانية ربط الكائنات بعضهن ببعض:

الرسمة التالية تشرح إمكانية ربط الكائنات بعضهن ببعض بواسطة آلية Signal and Slot.

رسمة توضيحية لمدى إمكانية ربط الكائنات

من توثيقات Qt

post-140583-1249105997_thumb.png

نلاحظ من الرسمة السابقة إمكانية ربط الكائنات بعضهن ببعض و ايضاً لاحظوا الهيكل للدالة connect و السهام الخطية بين الكائنات بالرسمة التوضحية. و هنا على شكل نقاط:

  • Signal واحد يمكنهُ الإرتباط بأكتر من Slot
  • اكتر من Siganl واحد يمْكنهُ الإرتباط بـنفس الـ Slot
  • Signal واحد يمكنه الإرتباط بـ Signal آخر
  • عملية الربط يمكنها فصلها (عاملة توضيح بهالخصوص بالمشاركات السابقة)

قانون:

  • يجب أن تكون الكائنات Objects المترابطين مع بعضهن بالدالة connect عبارة عن مؤشرات pointers أو مراجع reference لتلك الكائنات.

ملاحظة للأخوة الكرام:Sudanix و محمد (مصفوفة)

هذا الموضوع ايضاً لكم في مجتمع Qt العربي. و يمكنكم نقله(نسخه) و التعديل و الإضافة عليه بحريّة مُطلقة.

آسفة لتقصيري

اختكم رغــد

موفقين

bye

post-140583-1249106294_thumb.gif

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

يعجز اللسان عن الشكر

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

ألف شكر موضوع متميز

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .