السلام عليكم
مواصلة لمشروع ترجمة مواضيع و مقالات Developpez.com
اليوم مع Faq Qt (الأسئلة الأكثر شيوعا)
عنوان المقال الأصلي: FAQ Qt
رابط المقال الأصلي: http://qt.developpez.com/faq/
الترجمة: Djug
ملاحظة : قد تحتوي الترجمة على أخطاء علمية ( بسبب قلة احتكاكي بالـ Qt ) و/أو لغوية فلا تبخل بتصحيح الأخطاء إما بكتابة مشاركة تتشير إلى ذلك أو بإخبار أحد المشرفين
مقدمة:
ما هي الرخص الخاصة باستعمال Qt ؟
منذ صدور الإصدار الرابع توزع Qt بنوعين من الرخص : مجانية و تجارية و هذا في أنظمة التشغيل Windows linux و OSX
الرخصة المجانية المستعملة هي GPL2 حيث أن كل برنامج مكتوب بإصدار GPL يجب أن يكون هو أيضا GPL
أما بخصوص استعمال النسخة التجارية فينصح باتباع الإرشادات الموجودة في موقع الشركة المنتجة
http://www.trolltech.com/products/qt/licenses
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
أين نجد دروسا حول Qt ؟
توفر Trolltech مجموعة من الدروس الكافية و الوافية عن كل إصدار من إصداراتها
يمكنك الحصول على هذه الدروس من هنا
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
ما هي ملفات الـ header التي يجب إرفاقها لدى ترجمة برامج Qt؟
أولا تجب الإشارة إلى وجود نوعين من الـ headers
الأول هو النوع القياسي(standard ) و يتميز بالامتداد .h
أما النوع الثاني فلا يحتوي على امتداد
لكي تتم عملية الترجمة بصورة جيدة يجب أن يكون مسار الـ header المستعملة ضمن مجموعة المجلدات الـ headers المبحوث فيها
إضافة إلى أنه يجب إضافة الـ header <QXXX> استعمالك للـ class QXXX
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
عموميات:
هل فعلا استعمال Qt معقد ؟
في حقيقة الأمر استعمال Qt أسهل مما نتصور
لنأخذ المثال التالي الذي يقوم بإظهار Button يقوم بإغلاق البرنامج لدى الضغط عليه (لا يتجاوز 12 سطر)
- #include <QApplication> // ضروري لإنشاء تطبيق Qt
- #include <QPushButton> // ضروري لإنشاء Button
- int main(int argc, char **argv) // الدالة main كما هو مستعمل عادة
- {
- QApplication app(argc, argv); // استرجاع الـ arguments
- QPushButton quit("Hello World!"); //إنشاء الـ Button المعنون "Hello World"
- quit.resize(300, 40); // و نغير من حجمه
- quit.setFont(QFont("Arial", 18, QFont::Bold)); // نغير خصائص الخط المستعمل
- QObject::connect(&quit, SIGNAL(clicked()), &app, SLOT(quit())); //هنا نخبر Qt أنه يجب إنهاء البرنامج لدى عمل click على الـ button
- quit.show(); // نقوم بإظهار الـ Button
- return app.exec(); // هنا Qt يتولى أمر إرجاع القيمة المناسبة لدى انتهاء البرنامج
- }
كما تلاحظون فإنه من السهل جدا إنشاء و استعمال Button
لمزيد من التفاصيل لا يوجد أفصل من الدروس الرسمية المقدمة من شركة Trolltech
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
كيف تتم ترجمة مشروع باستعمال Qt4 ؟
يقترح مطوروا Qt4 عدة وسائل لتسهيل إدارة المشاريع باستعمال Qt4
فمثلا توجد أداة لتحويل ملقات .ui إلى ملفات c++.
و أداة أخرى لتوليد الكود اللازم لإنشاء الـ widgets
إضافة إلى وجود أداة Qmake و التي تسمح بخوصصة جميع مراحل الترجمة (مثل توليد ملف .pro و تحديد قواعد الترجمة من هذا الملف .. و استكشاف الـمترجم المستعمل و مجلد تنصيب الـ Qt ...)
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
محتوى Qt4
على ماذا تحتوي Qt4؟
قسمت Qt4 إلى عدة مكتبات فرعية مستقلة نسبيا عن بعضها البعض
• QtCore, تحتوي على المكونات الأساسية للسير الحسن لجميع مكتبات Qt
• QtGui تحتوي على المكونات الأساسية المتعلقة بالـواجهة الرسومية المستعملة من طرف باقي المكتبات
• QtNetwork تحتوي على الـ Class الخاصة بالبرمجة على الشبكة
• QtOpenGL لاستعمال OpenGL
• QtSql لاستعمال قواعد البيانات
• QtSvg لكتابة و قراءة ملفات SVG
• QtXml لكتابة و قراءة ملفات XML
• QtAssistant الـ help الخاص بالـ Qt
• Qt3Support للسماح باستعمال مكتبات الإصدار 3 من Qt
• QtTest لعمل Tests
• QtDesigner
• QtUiTools
كل واحدة من هذه المكتبات يمكن إضافتها أو إزالتها من مشاريع Qt (حسب الحاجة) علما أنه تتم إضافة QtCore و QtGui قياسيا إلى جميع المشاريع.
http://doc.trolltech.com/4.2/modules.html
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
QtCore :
لماذا نستعمل New دون إتباعها بـ Delete ؟
نلاحظ عادة في برامج مكتوبة بـ Qt4 وجود new لكن ليست متبوعة بـ Delete
يعود ذلك إلى إنه لدى إنشاء QObject نقوم بتحديد " أب" لهذا QObject (الـ Argument الأول في الـ Constructor )
هذا الأب توكل له مهمة إتلاف الابن عندما تدعو الحاجة إلى ذلك.
أغلبية (و ليس كلية) Class الـ Qt ترث بصفة مباشرة أو غير مباشرة من QObject
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
Signal و Slot
قامت Trolltech بعمل signals و slots اعتمادا على Pattern observer
هذا الـ Pattern يقوم بـ"توقع" الـ class التي تترقب Event ما
لاستعمال هذا النظام يجب التوريث من QObject إما بطريقة مباشرة أو عن طريق كائنات مستقة من QObject.
و من ثم يجب تعريف الـ macro Q_OBJECT و التي يحتاجها كل من qmake و moc لتوليد الكود اللازم لاستعمال هذه الدوال
لإنشاء signal
- signal:
- void mySignal();
و لمناداة هذا الـ signal
- emit mySignal();
يمكن ربط (connect)هذه signals مع signals أخرى أو slots
الـ slots عبارة عن دوال يكتبها المبرمج تتم مناداتها لدى الحاجة إلى ذلك
- public slots:
- void mySlot();
الـ slots عبارة عن دوال يكتبها المبرمج تتم مناداتها لدى الحاجة إلى ذلك
بعد الانتهاء من كتابة الـ slots و الـ signals تبقى عملية الربط بينها.
بما أن الربط يكون مباشرا فإنه يستحيل ربط signal بدون parameter مع slot بـ parameter
من أجل هذا يجب استعمال QSignalMapper
- connect(this, SIGNAL(monSignal(), somethingElse, SLOT(monSlot()));;
لمزيد من التفاصيل
. http://doc.trolltech.com/4.2/signalsandslots.html
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
underfined reference to 'vtable for xxx'
تظهر رسالة الخطأ هذه حي حالة ما إذا كان القسم QObject لـ class معين لم تتم إضافته لدى عمل الـ linking
حيث أنه لدى استعمال الـ macro Q_OBJECT نقوم بكتابة مجموعة من الدوال و المتغيرات و التي تكون static
يولد qmake ملفا باستعمال الأداة moc يحتوي مجموع هذه الدوال و المتغيرات
ملاحظة: يمكنك إنشاء هذا الملف يدويا و استعماله حين الترجمة و linking
http://doc.trolltech.com/4.2/qobject.html
. http://doc.trolltech.com/4.2/signalsandslots.html
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
كيف نفتح برنامجا ما باستعمال Qt ؟
تسمح Qt بفتح برنامج ما و التعامل معه و ذلك بفصل الـ class QProcess
هذه العملية تتم إما باستعمال الدالة start
أو باستعمال الدالة QProcess::execute
يجب التنويه إلى أن البرنامج المفتوح يعتبر كـ porcess ابن أي أنه لدى علق البرنامج الأب فإن البرنامج الابن يغلق بطريقة أوتوماتيكية
أما إذا أردت أن يبقى البرنامج مستغلا حتى بعد غلق البرنامج الأب فلا مفر من استعمال الدالة QProcess::startDetached
- #include <QtGui>
- class MyQPushButton : public QPushButton
- {
- public :
- //
- //text : النص الظاهر على الـ button
- //exe : الأمر المطبق لدى الضغط على الـ button.
- MyQPushButton(const QString & text,const QString & exe, QWidget * parent = 0):QPushButton (text,parent),m_exe(exe){resize(75, 30);setFont(QFont("Times", 18, QFont::Bold));};
- virtual void mouseReleaseEvent ( QMouseEvent * event )
- {
- //تطبيق الأمر في process مستقل
- QProcess::startDetached (m_exe);
- }
- private :
- QString m_exe;
- };
- int main(int argc, char* argv[])
- {
- QApplication app(argc, argv);
- QWidget w;
- QVBoxLayout vl(&w);
- //فتح صفحة web عن طريق cmd
- MyQPushButton bouton1("Open DVP / Qt","cmd /c start <a href="http://qt.developpez.com/",&w);" target="_blank">http://qt.developpez.com/",&w);</a>
- //فتح notepad
- MyQPushButton bouton2("Open notepad","notepad",&w);
- //فتح cmd
- MyQPushButton bouton3("Open CMD","cmd" ,&w);
- vl.addWidget(&bouton1);
- vl.addWidget(&bouton2);
- vl.addWidget(&bouton3);
- w.show();
- return app.exec();
- }
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
QtGUI
كيف يتم تغيير style النافذة
يكفي إضافة هذا السطر
- QApplication::setStyle(new QPlastiqueStyle);
إذا كان QPlastiqueStyle هو الـ style الذي تريده
يتبع


