Getting Started Programming with Qt/ar: Difference between revisions
No edit summary |
m (Wieland moved page Getting Started Programming with Qt - Arabic to Getting Started Programming with Qt/ar: Proper localization) |
||
(5 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
{{Cleanup | reason=Auto-imported from ExpressionEngine.}} | |||
<hr> | |||
<h1 dir="rtl" lang="ar" align="right"> الشروع في برمجة QT:</h1> | |||
<hr> | |||
<p dir="rtl" lang="ar" align="right"> مرحباً بك في عالم Qt — واجهة أدوات المستخدم الرسومية متعددة المنصات (The cross-platform GUI toolkit). في هذا الدليل، سنتعلم أساسيات QT من خلال إنشاء تطبيق مفكرة بسيطة. بعد قراءة هذا الدليل ، يجب أن تكون جاهزا للخوض في اللمحات العامة والثائق و Qt API ، والعثور على المعلومات التي تحتاج إليها لتطبيقك.</p> | |||
<hr> | |||
<h2 dir="rtl" lang="ar" align="right">مثال: Hello Notepad</h2> | |||
<hr> | |||
<p dir="rtl" lang="ar" align="right">في المثال الأول، ونحن ببساطة نقوم بإنشاء وإظهار محرر النصوص في إطار نافذة على سطح المكتب. ويمثل هذا أبسط برنامج Qt ممكن لواجهة المستخدم الرسومية.</p> | |||
<p dir="rtl" lang="ar" align="middle"> | |||
[[Image:http://doc.qt.nokia.com/4.7/images/gs1.png|محرر نصوص بسيط]] | |||
</p> | |||
<p dir="rtl" lang="ar" align="right">التالي هو البرنامج المصدر:</p> | |||
<code>#include <QApplication> | |||
#include <QTextEdit> | |||
int main(int argv, char **args) | |||
{ | |||
QApplication app(argv, args); | |||
QTextEdit textEdit; | |||
textEdit.show(); | |||
< | return app.exec(); | ||
}</code> | |||
<p dir="rtl" lang="ar" align="right">التالي شرح البرنامج سطرارا بسطر. في السطرين الأولين، نقوم بتضمين الملفات رأس (Header files) الخاضة بـ QApplication و QTextEdit - فئتين (classes) اللازمتان لهذا المثال. لجميع الطبقات في Qt ملف رأس المسمى بنفس الإسم - All Qt classes have a header file named after them.</p> | |||
<p dir="rtl" lang="ar" align="right">في السطر ٦ نقوم بإنشاء كائن QApplication. هذا الكائن يدير موارد التطبيق، وهو ضروري لتشغيل أي برنامج Qt يحتوي على واجهة المستخدم الرسومية. كما أنها تحتاج الى argv و args لأن Qt تقبل القليل من متغيدات ومدخلات التشغيل من السطر ٤ - command line arguments.</p> | |||
<p dir="rtl" lang="ar" align="right">في السطر ٨ نقوم بخلق الكائن محرر نصوص QTextEdit. محرر نصوص هو عنصر بصري - visual element - في واجهة المستخدم الرسومية. في Qt ندعو هذه العناصر بالحاجيات - widgets. ومن الأمثلة على غيرها من الحاجيات وشريط التمرير - scroll bars - أزرار الراديو - radio buttons - ، والتسميات - labels، ويمكن أيضا أن تكون الحاجيات حاوية لغيرها؛ كما في إطار التطبيق الرئيسي ، على سبيل المثال.</p> | |||
<p dir="rtl" lang="ar" align="right">السطر ٩ يظهر محرر النصوص على الشاشة في إطاره الخاص. وكما أن الحاجيات تعمل أيضا كحاويات لبعضها (على سبيل المثال لـ QMainWindow الذي يحتوي أشرطة الأدوات والقوائم وشريط المعلومات ، وغيرها من الحاجيات) ، فمن الممكن أن تظهر القطعة واحدة في الإطار الخاص بها. الحاجيات غير مرئية بطبعتها؛ لكن باستخدام الدالة show() تصبح القطعة مرئية.</p> | |||
<p dir="rtl" lang="ar" align="right">السطر ١١يجعل QApplication يدخل في حلقة حداث - event loop -. أثناء عمل تطبيق Qt، يتم إنشاء الأحداث وإرسالها إلى الحاجيات في التطبيق. وكمثال على الأحداث نقر الفأرة والضغط على لوحة المفاتيح. عند كتابة نص في حاجية محرر النصوص، يتلقى المحرر أحداث ضغط مفتاح- key pressed events - ويستجيب من خلال رسم النص المكتوب في المحرر.</p> | |||
<p dir="rtl" lang="ar" align="right">لتشغيل التطبيق ، افتح موجه الأوامر CMD ، وأدخل دليل ملف .cpp الذي لديك من البرنامج. أدخل الأوامر لتالية لبناء البرنامج.</p> | |||
<code> qmake -project | |||
qmake | |||
make</code> | |||
<p dir="rtl" lang="ar" align="right"> هذا وسوف ينشئ ملفاً تفيذياً في الدليل part1 (قد تضطر في ويندوزإلى استخدام nmake بدلا من make ، كما توضع الملف القابل للتنفيذ في part1/debug أو part1/release). qmakeهي أداة البناء في Qt، والتي تأخذ ملف الإعدادات- configuration file. qmake يولد ملف الإعدادات عندما يدفق الأمر بالدالة -project كما في السطر الأول من الأوامر السابقة.qmake بالإستعانة مع ملف الإعدادات ذي الإمتداد .pro تنتج MAKEFILE الذي سيبني البرنامج لك. لاحقا سنقوم بالكتابة ملفات .pro .</p> | |||
<h4 dir="rtl" lang="ar" align="right">لمعرقة المزيد: </h4> | |||
<p><table class="generic" dir="rtl" lang="ar" align="right"> | |||
<thead><tr class="qt-style topAlign"><th>الموضوع</th><th>انقر هنا</th></tr></thead> | |||
<tbody><tr class="odd topAlign"><td><p>الحاجيات والهندسة النوافة</p></td><td><p> | |||
<a href="http://doc.qt.nokia.com/4.7/application-windows.html">حاجيات النوافذ</a></p></td></tr> | |||
<tr class="even topAlign"><td><p>الأحداث والتعامل مع الحدث</p></td><td><p><a href="http://doc.qt.nokia.com/4.7/eventsandfilters.html">نظام الأحداث</a></p></td></tr> | |||
</tbody></table></p> | |||
<br gt;<br gt;<br gt;<br gt; | |||
<br gt;<br gt;<br gt;<br gt; | |||
<hr> | |||
<h2 dir="rtl" lang="ar" align="right">إضافة زر إنهاء</h2> | |||
<hr> | |||
<p dir="rtl" lang="ar" align="right">في تطبيق حقيقي ، وسوف تحتاج عادة أكثر من حاجية واحدة. وسوف نعرض الآن QPushButton تحت محرر النصوص. الزر وسوف ينهي تطبيق المفكرة عندالضغط عليه (أي ، عند نقره بالماوس).</p> | |||
<p dir="rtl" lang="ar" align="middle"> | |||
[[Image:http://doc.qt.nokia.com/4.7/images/gs2.png|محرر نصوص بسيط]] | |||
</p> | |||
<p dir="rtl" lang="ar" align="right">دعونا نلقي نظرة على المصدر:</p> | |||
<code>#include <QtGui> | |||
int main(int argv, char **args) | |||
{ | |||
QApplication app(argv, args); | |||
QTextEdit textEdit; | |||
QPushButton quitButton("Quit"); | |||
QObject::connect(&quitButton, SIGNAL (clicked()), qApp, SLOT (quit())); | |||
QVBoxLayout layout; | |||
layout.addWidget(&textEdit); | |||
layout.addWidget(&quitButton); | |||
QWidget window; | |||
window.setLayout(&layout); | |||
<br /> | window.show(); | ||
return app.exec(); | |||
}</code> | |||
<p dir="rtl" lang="ar" align="right">ويشمل السطر ١ على QtGui، الذي يحتوي على كافة طبقات واجهة المستخدم الرسومية في Qt.</p> | |||
<p dir="rtl" lang="ar" align="right">السطر ١٠ ويستخدم آلية الإشارات والفتحات الآلية في Qt's Signals and Slots mechanism- Qt - لإنهاء التطبيق عند دفع زر خروج - Quit button. الفتحة الآلية هي الدالة التي يمكن استدعاؤها في وقت التشغيل باستخدام اسمها (كسلسلة حرفية). الإشارة هي الدالة التي سوف تستدعي جميع الفتحات الآلية المسجلية لديها ، ونحن نستدعي السطر ١٠ لخلق التواصل بين فتحة للإشارة ولإصدار الإشارة - emit the signal.</p> | |||
quit<p dir="rtl" lang="ar" align="right">() هي فتحة من QApplication والتي تنهي التطبيق. clicked() هي إشارة في QPushButton تنبعث عندما الضغط على الزر. الدالة ثابتة QObject : : connect() تربط فتحة بإشارة. SIGANL () و SLOT() هما وحدات الماكرو التي تتخذ التوقيعات الإشارة والفتحة للتواصل. نحن بحاجة أيضا إلى إعطاء مؤشرات إلى الكائنات التي ينبغي إرسال واستقبال الإشارة.</p> | |||
<p dir="rtl" lang="ar" align="right">السطر ١٢ يخلق QVBoxLayout . وكما ذكر ، يمكن أن تحتوي الحاجيات على الحاجيات الأخرى. فمن الممكن لتعيين حدود (الموقع والحجم) الحاجية الطفل مباشرة، ولكن من الأسهل عادة إلى استخدام التخطيط - layout. التخطيط يدير حدود الحاجية الطفل. QVBoxLayout ، على سبيل المثال ، يضع الحاجيات الأطفال في صف واحد عمودي.</p> | |||
<p dir="rtl" lang="ar" align="right">سطر ١٣ و ١٤ ويضيفان محرر النصوص والزر إلى التخطيط. في السطر ١٧، وضعنا التخطيط على الحاجية.</p> | |||
<h4 dir="rtl" lang="ar" align="right">لمعرقة المزيد: </h4> | |||
<table class="generic" dir="rtl" lang="ar" align="right"> | |||
<thead><tr class="qt-style topAlign"><th>الموضوع</th><th>انقر هنا</th></tr></thead> | |||
<tbody><tr class="odd topAlign"><td><p>الإشارات والفتحات الآلية</p></td><td><p><a href="http://doc.qt.nokia.com/4.7/signalsandslots.html">Signals & Slots</a></p></td></tr> | |||
<tr class="even topAlign"><td><p>التخطيط</p></td><td><p><a href="http://doc.qt.nokia.com/4.7/layout.htm">Layout Management</a>, <a href="http://doc.qt.nokia.com/4.7/widgets-and-layouts.html">Widgets and Layouts</a>, <a href="http://doc.qt.nokia.com/4.7/examples-layouts.html">Layout Examples</a></p></td></tr> | |||
<tr class="odd topAlign"><td><p>الحاجيات المرفقة ب Qt</p></td><td><p><a href="http://doc.qt.nokia.com/4.7/gallery.html">Qt Widget Gallery</a>, <a href="http://doc.qt.nokia.com/4.7/examples-widgets.html">Widget Examples</a></p></td></tr> | |||
</tbody></table> | |||
<br gt;<br gt;<br gt;<br gt; | |||
<br gt;<br gt;<br gt;<br gt; | |||
<hr> | |||
<h2 dir="rtl" lang="ar" align="right">تفريع الفئة QWidget </h2> | |||
<hr> | |||
<p dir="rtl" lang="ar" align="right">عندما يريد المستخدم إنهاء تطبيق قد تحتاج إلى نافذة حوار تسأله ما إذا كان يرغب حقا في الخروج. في هذا المثال ، سنشئ فئة فرعية QWidget ، ونضيف فتحة لها لتواصل مع الزر إنهاء. | |||
</p> | |||
<p dir="rtl" lang="ar" align="middle"> | |||
[[Image:http://doc.qt.nokia.com/4.7/images/gs3.png|محرر نصوص بسيط]] | |||
</p> | |||
<p dir="rtl" lang="ar" align="right">التالي هو البرنامج المصدر:</p> | |||
<code>class Notepad : public QWidget | |||
{ | |||
Q_OBJECT | |||
public: | |||
Notepad(); | |||
private slots: | |||
void quit(); | |||
private: | |||
QTextEdit *textEdit; | |||
QPushButton '''quitButton; | |||
};</code> | |||
<p dir="rtl" lang="ar" align="right"> الماكرو Q_OBJECT ويجب أن يكون الأول في تعريف الفئة، ويعلن - declares - عن الفئة باعتبارها QObject (وبطبيعة الحال ، لا بد أيضا من وراثة QObject ). و QObject يضيف قدرات عدة على الطبقة العادية في C+''. خاصة ، ويمكن الاستعلام عن اسم الفئة والفتحة في وقت التشغيل. ومن الممكن أيضا للاستعلام أنواع معالم الفتحة واستدعاؤها.</p> | |||
<p dir="rtl" lang="ar" align="right">السر ١٣ يعلن عن فتحة quit(). هذا هو السهل استخدام الماكرو slots. والآن فتحة quit() يمكن أن تكون مرتبطة إلى أي إشارة مع توقيع مطابقة (أي إشارة لا تأخذ أية معالم).</p> | |||
<p dir="rtl" lang="ar" align="right">بدلا من إنشاء واجهة المستخدم الرسومية وتوصيل فتحة في الدالة main() ، سنستخدم منشئ المفكرة - Notepad's constructor.</p> | |||
<code> Notepad::Notepad() | |||
{ | |||
textEdit = new QTextEdit; | |||
quitButton = new QPushButton(tr("Quit")); | |||
connect(quitButton, SIGNAL (clicked()), this, SLOT (quit())); | |||
QVBoxLayout '''layout = new QVBoxLayout; | |||
layout->addWidget(textEdit); | |||
layout->addWidget(quitButton); | |||
setLayout(layout); | |||
setWindowTitle(tr("Notepad")); | |||
}</code> | |||
<p dir="rtl" lang="ar" align="right">كما رأيتم في تعريف الفئة ، نحن نستخدم مؤشرات QObject (textEdit وquitButton). وكقاعدة عامة ، يجب عليك دائما تخصيص QObject ق على كومة - heap - وليس نسخها.</p> | |||
<p dir="rtl" lang="ar" align="right">ونحن الآن استخدام الدالة tr() حول النصوص المرئية لدينا. هذه الدالة ضرورية عندما تريد أن يعمل برنامج في أكثر من لغة واحدة (مثل الانكليزية والصينية). ولن أخوض في التفاصيل هنا، ولكن يمكنك اتباع الرابط اللغوي Qt من معرفة المزيد الجدول.</p> | |||
<h4 dir="rtl" lang="ar" align="right">لمعرقة المزيد: </h4> | |||
<table class="generic" dir="rtl" lang="ar" align="right"> | |||
<thead><tr class="qt-style topAlign"><th>الموضوع</th><th>انقر هنا</th></tr></thead> | |||
<tbody><tr class="odd topAlign"><td><p>tr() والتدويل - internationalization</p></td><td><p><a href="http://doc.qt.nokia.com/4.7/linguist-manual.html">Qt Linguist Manual</a>, <a href="http://doc.qt.nokia.com/4.7/i18n-source-translation.html">Writing Source Code for Translation</a>, <a href="http://doc.qt.nokia.com/4.7/linguist-hellotr.html">Hello tr</a>() Example, <a href="http://doc.qt.nokia.com/4.7/internationalization.html">Internationalization with Qt</a></p></td></tr> | |||
<tr class="even topAlign"><td><p><a href="http://doc.qt.nokia.com/4.7/qtwebkit-bridge.html#qobjects">QObjects</a> and the Qt Object model (This is essential to understand Qt)</p></td><td><p><a href="http://doc.qt.nokia.com/4.7/object.html">Object Model</a></p></td></tr> | |||
<tr class="odd topAlign"><td><p>qmake و نظام البناء في Qt</p></td><td><p><a href="http://doc.qt.nokia.com/4.7/qmake-manual.html">qmake Manual</a></p></td></tr> | |||
</tbody></table> | |||
<br gt;<br gt;<br gt;<br gt; | |||
<br gt;<br gt;<br gt;<br gt; | |||
<hr> | |||
<h2 dir="rtl" lang="ar" align="right">إنشاء الملف .pro</h2> | |||
<hr> | |||
<p dir="rtl" lang="ar" align="right">على سبيل المثال، سنكتب ملف .pro الخاص بنا بدلا من استخدام qmake -project:</p> | |||
<code> HEADERS = notepad.h | |||
SOURCES = notepad.cpp main.cpp</code> | |||
<p dir="rtl" lang="ar" align="right">والأوامر التالية في CMD تقوم بالبناء:</p> | |||
<code> qmake | |||
make</code> | |||
<hr> | |||
<h2 dir="rtl" lang="ar" align="right">استخدام QMainWindow</h2> | |||
<hr> | |||
<p dir="rtl" lang="ar" align="right">تستفيد العديد من التطبيقات باستخدام QMainWindow التي لها تخطيطها الخاصة الذي يمكنك من إضافة شريط القوائم ، وأشرطة الأدوات ، وشريط الحالة. QMainWindow تحتوي على مساحة المركز الذي يمكن أن يشغلها أي نوع من الحاجيات. في حالتنا ، وسوف نضع محرر النصوص هناك.</p> | |||
<p dir="rtl" lang="ar" align="middle"> | |||
[[Image:http://doc.qt.nokia.com/4.7/images/gs4.png|محرر نصوص بسيط]] | |||
</p> | |||
<p dir="rtl" lang="ar" align="right">التالي هو تعريف المفكرة الجديد:</p> | |||
<code> #include <QtGui> | |||
class Notepad : public QMainWindow | |||
{ | |||
Q_OBJECT | |||
public: | |||
Notepad(); | |||
private slots: | |||
void open(); | |||
void save(); | |||
void quit(); | |||
private: | |||
QTextEdit *textEdit; | |||
QAction *openAction; | |||
QAction *saveAction; | |||
QAction *exitAction; | |||
QMenu '''fileMenu; | |||
};</code> | |||
<p dir="rtl" lang="ar" align="right">في المقطع التالي نسنضيف فتحتان جديدتان تمكناننا من حفظ وفتح مستند. </p> | |||
<p dir="rtl" lang="ar" align="right">في كثير من الأحيان ، في النافذة الرئيسية ، ينبغي إسناد حاجيات عدة إلى فتحة واحدة. كما في عناصر القائمة والأزرار على شريط الأدوات. لجعل هذا أسهل ، Qt توفر QAction ، والتي يمكن أن تعطى لالحاجيات عدة ، وتكون مرتبطة إلى فتحة واحدة. على سبيل المثال ، يمكن إنشاء عناصر القائمة وأزرار الأدوات QMenu و QToolBar من نفس QAction. وسوف نرى كيف يعمل هذا في قريبا.</p> | |||
<p dir="rtl" lang="ar" align="right">كما كان من قبل ، ونحن نستخدم منشئ المفكرة لإعداد واجهة المستخدم الرسومية.</p> | |||
<code> Notepad::Notepad() | |||
{ | |||
saveAction = new QAction(tr("&Open"), this); | |||
saveAction = new QAction(tr("&Save"), this); | |||
exitAction = new QAction(tr("E&xit"), this); | |||
connect(openAction, SIGNAL (triggered()), this, SLOT (open())); | |||
connect(saveAction, SIGNAL (triggered()), this, SLOT (save())); | |||
connect(exitAction, SIGNAL (triggered()), qApp, SLOT (quit())); | |||
fileMenu = menuBar()->addMenu(tr("&File")); | |||
fileMenu->addAction(openAction); | |||
fileMenu->addAction(saveAction); | |||
fileMenu->addSeparator(); | |||
fileMenu->addAction(exitAction); | |||
textEdit = new QTextEdit; | |||
setCentralWidget(textEdit); | |||
setWindowTitle(tr("Notepad")); | |||
}</code> | |||
<p dir="rtl" lang="ar" align="right">يتم إنشاء QAction مع النص الذي يجب أن تظهر على الحاجيات التي نضيفها لهم (في حالتنا ، عناصر القائمة). إذا أردنا أيضا لإضافتها إلى شريط الأدوات ، يمكن للإجراءات - Actions - أن تحوي رموزا.</p> | |||
<p dir="rtl" lang="ar" align="right">عند النقر فوق عناصر قائمة الآن ، سوف تستدعي الإجراء، وسيتم استدعاء كل فتحات المرتبطة بهذا الإجراء.</p> | |||
<h4 dir="rtl" lang="ar" align="right">لمعرقة المزيد: </h4> | |||
<table class="generic" dir="rtl" lang="ar" align="right"> | |||
<thead><tr class="qt-style topAlign"><th>الموضوع</th><th>انقر هنا</th></tr></thead> | |||
<tbody><tr class="odd topAlign"><td><p>النوافذ الرئيسية والطبقات النافذة الرئيسية</p></td><td><p><a >Application Main Window</a>, <a >Main Window Examples</a></p></td></tr> | |||
<tr class="even topAlign"><td><p>تطبيقات النوافذ الداخلية</p></td><td><p><a href="http://doc.qt.nokia.com/4.7/qmdiarea.html">QMdiArea</a>, <a href="http://doc.qt.nokia.com/4.7/mainwindows-mdi.html">MDI Example</a></p></td></tr> | |||
</tbody></table> | |||
<br gt;<br gt;<br gt;<br gt; | |||
<br gt;<br gt;<br gt;<br gt; | |||
<hr> | |||
<h2 dir="rtl" lang="ar" align="right">فتح وحفظ الملفات</h2> | |||
<hr> | |||
<p dir="rtl" lang="ar" align="right">في هذا المثال ، وسوف ننفذ وظائف الفتحات save() & load() التي أضيفت في المثال السابق.</p> | |||
<p dir="rtl" lang="ar" align="middle"> | |||
[[Image:http://doc.qt.nokia.com/4.7/images/gs5.png|محرر نصوص بسيط جدا]] | |||
</p> | |||
<p dir="rtl" lang="ar" align="right"> سنبدأ مع فتحة open():</p> | |||
<code> QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "", | |||
tr("Text Files ('''.txt);;C++ Files ('''.cpp'''.h)")); | |||
if (fileName != "") { | |||
QFile file(fileName); | |||
if (!file.open(QIODevice::ReadOnly)) { | |||
QMessageBox::critical(this, tr("Error"), | |||
tr("Could not open file")); | |||
return; | |||
} | |||
QString contents = file.readAll().constData(); | |||
textEdit->setPlainText(contents); | |||
file.close(); | |||
}</code> | |||
<p dir="rtl" lang="ar" align="right">والخطوة الأولى هي تطلب من المستخدم hلحصول على اسم الملف لفتحه. Qt تأتي مع QFileDialog ، وهي النافذة التي تمكن المستخدم من تحديد ملف. وتوضح الصورة أعلاه التافذة في نتظام تشغيل Kubuntu. الدالة ثابتة ()getOpenFileName تعرض نافذة اختيار الملف، ولا يعود - return - حتى يحدد المستخدم ملف المطلوب. والتي ترجع مسار الملف المختار أو نصا فارغا عند الإلغاء.</p> | |||
<p dir="rtl" lang="ar" align="right">إذا كان لدينا اسم الملف ، نحاول فتح الملف مع open() ، والتي ترجع صحيحا - true -إذا أمكن فتح الملف. ونحن لن نتطرق إلى معالجة أخطاء الفتح هنا، ولكن يمكنك اتباع الروابط من معرفة المزيد. إذا لم يمكن فتح الملف ، ونحن نستخدم QMessageBox لعرض نافذة حوار تظهر رسالة خطأ (انظر وصف فئة QMessageBox للمزيد من التفاصيل).</p> | |||
<p dir="rtl" lang="ar" align="right">في الحقيقة القراءة بيانات من ملف هي عملية سهلة باستخدام دالة readAll()، والتي ترجع كافة البيانات في الملف على هيأة QByteArray . و الدالة constData() تقوم بإرجاع كافة البيانات على هيأة const char* والتي تستخدم كمدخل لأحد منشئات QString. ويمكن بعد ذلك يتم عرض المحتويات في محرر النصوص. ثم ننهي باستخدام close() التي تعيد واصف الملف- file descriptor - إلى نظام التشغيل.</p> | |||
<p dir="rtl" lang="ar" align="right">الآن ، دعونا ننتقل إلى حفظ فتحة) (.</p> | |||
<code> QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"), "", | |||
tr("Text Files ('''.txt);;C''+ Files ('''.cpp '''.h)")); | |||
if (fileName != "") { | |||
QFile file(fileName); | |||
if (!file.open(QIODevice::WriteOnly)) { | |||
// error message | |||
} else { | |||
QTextStream stream(&file); | |||
stream << textEdit->toPlainText(); | |||
stream.flush(); | |||
file.close(); | |||
} | |||
}</code> | |||
<p dir="rtl" lang="ar" align="right">عندما نكتب محتويات محرر النصوص إلى الملف ، استخدام الطبقة QTextStream ، التي يشتمل الكائن QFile. QTextStream يمكنه كتابة QStrings مباشرة إلى الملف - QFile لا يقبل إلا البيانات الخام من نوع (char''') مع دالات write() التابعة لـQIODevice .</p> | |||
<h4 dir="rtl" lang="ar" align="right">لمعرقة المزيد: </h4> | |||
<table class="generic" dir="rtl" lang="ar" align="right"> | |||
<thead><tr class="qt-style topAlign"><th>الموضوع</th><th>انقر هنا</th></tr></thead> | |||
<tbody><tr class="odd topAlign"><td><p>الملفات و أدوات الإدخال والإخراج</p></td><td><p><a href="http://doc.qt.nokia.com/4.7/qfile.html">QFile</a>, <a href="http://doc.qt.nokia.com/4.7/qiodevice.html">QIODevice</a></p></td></tr> | |||
</tbody></table> | |||
<br gt;<br gt;<br gt;<br gt; | |||
<br gt;<br gt;<br gt;<br gt; |
Latest revision as of 18:20, 28 June 2015
This article may require cleanup to meet the Qt Wiki's quality standards. Reason: Auto-imported from ExpressionEngine. Please improve this article if you can. Remove the {{cleanup}} tag and add this page to Updated pages list after it's clean. |
الشروع في برمجة QT:
مرحباً بك في عالم Qt — واجهة أدوات المستخدم الرسومية متعددة المنصات (The cross-platform GUI toolkit). في هذا الدليل، سنتعلم أساسيات QT من خلال إنشاء تطبيق مفكرة بسيطة. بعد قراءة هذا الدليل ، يجب أن تكون جاهزا للخوض في اللمحات العامة والثائق و Qt API ، والعثور على المعلومات التي تحتاج إليها لتطبيقك.
مثال: Hello Notepad
في المثال الأول، ونحن ببساطة نقوم بإنشاء وإظهار محرر النصوص في إطار نافذة على سطح المكتب. ويمثل هذا أبسط برنامج Qt ممكن لواجهة المستخدم الرسومية.
التالي هو البرنامج المصدر:
#include <QApplication>
#include <QTextEdit>
int main(int argv, char **args)
{
QApplication app(argv, args);
QTextEdit textEdit;
textEdit.show();
return app.exec();
}
التالي شرح البرنامج سطرارا بسطر. في السطرين الأولين، نقوم بتضمين الملفات رأس (Header files) الخاضة بـ QApplication و QTextEdit - فئتين (classes) اللازمتان لهذا المثال. لجميع الطبقات في Qt ملف رأس المسمى بنفس الإسم - All Qt classes have a header file named after them.
في السطر ٦ نقوم بإنشاء كائن QApplication. هذا الكائن يدير موارد التطبيق، وهو ضروري لتشغيل أي برنامج Qt يحتوي على واجهة المستخدم الرسومية. كما أنها تحتاج الى argv و args لأن Qt تقبل القليل من متغيدات ومدخلات التشغيل من السطر ٤ - command line arguments.
في السطر ٨ نقوم بخلق الكائن محرر نصوص QTextEdit. محرر نصوص هو عنصر بصري - visual element - في واجهة المستخدم الرسومية. في Qt ندعو هذه العناصر بالحاجيات - widgets. ومن الأمثلة على غيرها من الحاجيات وشريط التمرير - scroll bars - أزرار الراديو - radio buttons - ، والتسميات - labels، ويمكن أيضا أن تكون الحاجيات حاوية لغيرها؛ كما في إطار التطبيق الرئيسي ، على سبيل المثال.
السطر ٩ يظهر محرر النصوص على الشاشة في إطاره الخاص. وكما أن الحاجيات تعمل أيضا كحاويات لبعضها (على سبيل المثال لـ QMainWindow الذي يحتوي أشرطة الأدوات والقوائم وشريط المعلومات ، وغيرها من الحاجيات) ، فمن الممكن أن تظهر القطعة واحدة في الإطار الخاص بها. الحاجيات غير مرئية بطبعتها؛ لكن باستخدام الدالة show() تصبح القطعة مرئية.
السطر ١١يجعل QApplication يدخل في حلقة حداث - event loop -. أثناء عمل تطبيق Qt، يتم إنشاء الأحداث وإرسالها إلى الحاجيات في التطبيق. وكمثال على الأحداث نقر الفأرة والضغط على لوحة المفاتيح. عند كتابة نص في حاجية محرر النصوص، يتلقى المحرر أحداث ضغط مفتاح- key pressed events - ويستجيب من خلال رسم النص المكتوب في المحرر.
لتشغيل التطبيق ، افتح موجه الأوامر CMD ، وأدخل دليل ملف .cpp الذي لديك من البرنامج. أدخل الأوامر لتالية لبناء البرنامج.
qmake -project
qmake
make
هذا وسوف ينشئ ملفاً تفيذياً في الدليل part1 (قد تضطر في ويندوزإلى استخدام nmake بدلا من make ، كما توضع الملف القابل للتنفيذ في part1/debug أو part1/release). qmakeهي أداة البناء في Qt، والتي تأخذ ملف الإعدادات- configuration file. qmake يولد ملف الإعدادات عندما يدفق الأمر بالدالة -project كما في السطر الأول من الأوامر السابقة.qmake بالإستعانة مع ملف الإعدادات ذي الإمتداد .pro تنتج MAKEFILE الذي سيبني البرنامج لك. لاحقا سنقوم بالكتابة ملفات .pro .
لمعرقة المزيد:
<thead></thead> <tbody> </tbody>الموضوع | انقر هنا |
---|---|
الحاجيات والهندسة النوافة | <a href="http://doc.qt.nokia.com/4.7/application-windows.html">حاجيات النوافذ</a> |
الأحداث والتعامل مع الحدث | <a href="http://doc.qt.nokia.com/4.7/eventsandfilters.html">نظام الأحداث</a> |
<br gt;<br gt;<br gt;<br gt; <br gt;<br gt;<br gt;<br gt;
إضافة زر إنهاء
في تطبيق حقيقي ، وسوف تحتاج عادة أكثر من حاجية واحدة. وسوف نعرض الآن QPushButton تحت محرر النصوص. الزر وسوف ينهي تطبيق المفكرة عندالضغط عليه (أي ، عند نقره بالماوس).
دعونا نلقي نظرة على المصدر:
#include <QtGui>
int main(int argv, char **args)
{
QApplication app(argv, args);
QTextEdit textEdit;
QPushButton quitButton("Quit");
QObject::connect(&quitButton, SIGNAL (clicked()), qApp, SLOT (quit()));
QVBoxLayout layout;
layout.addWidget(&textEdit);
layout.addWidget(&quitButton);
QWidget window;
window.setLayout(&layout);
window.show();
return app.exec();
}
ويشمل السطر ١ على QtGui، الذي يحتوي على كافة طبقات واجهة المستخدم الرسومية في Qt.
السطر ١٠ ويستخدم آلية الإشارات والفتحات الآلية في Qt's Signals and Slots mechanism- Qt - لإنهاء التطبيق عند دفع زر خروج - Quit button. الفتحة الآلية هي الدالة التي يمكن استدعاؤها في وقت التشغيل باستخدام اسمها (كسلسلة حرفية). الإشارة هي الدالة التي سوف تستدعي جميع الفتحات الآلية المسجلية لديها ، ونحن نستدعي السطر ١٠ لخلق التواصل بين فتحة للإشارة ولإصدار الإشارة - emit the signal.
quit
() هي فتحة من QApplication والتي تنهي التطبيق. clicked() هي إشارة في QPushButton تنبعث عندما الضغط على الزر. الدالة ثابتة QObject : : connect() تربط فتحة بإشارة. SIGANL () و SLOT() هما وحدات الماكرو التي تتخذ التوقيعات الإشارة والفتحة للتواصل. نحن بحاجة أيضا إلى إعطاء مؤشرات إلى الكائنات التي ينبغي إرسال واستقبال الإشارة.
السطر ١٢ يخلق QVBoxLayout . وكما ذكر ، يمكن أن تحتوي الحاجيات على الحاجيات الأخرى. فمن الممكن لتعيين حدود (الموقع والحجم) الحاجية الطفل مباشرة، ولكن من الأسهل عادة إلى استخدام التخطيط - layout. التخطيط يدير حدود الحاجية الطفل. QVBoxLayout ، على سبيل المثال ، يضع الحاجيات الأطفال في صف واحد عمودي.
سطر ١٣ و ١٤ ويضيفان محرر النصوص والزر إلى التخطيط. في السطر ١٧، وضعنا التخطيط على الحاجية.
لمعرقة المزيد:
<thead></thead> <tbody> </tbody>الموضوع | انقر هنا |
---|---|
الإشارات والفتحات الآلية | <a href="http://doc.qt.nokia.com/4.7/signalsandslots.html">Signals & Slots</a> |
التخطيط | <a href="http://doc.qt.nokia.com/4.7/layout.htm">Layout Management</a>, <a href="http://doc.qt.nokia.com/4.7/widgets-and-layouts.html">Widgets and Layouts</a>, <a href="http://doc.qt.nokia.com/4.7/examples-layouts.html">Layout Examples</a> |
الحاجيات المرفقة ب Qt | <a href="http://doc.qt.nokia.com/4.7/gallery.html">Qt Widget Gallery</a>, <a href="http://doc.qt.nokia.com/4.7/examples-widgets.html">Widget Examples</a> |
<br gt;<br gt;<br gt;<br gt; <br gt;<br gt;<br gt;<br gt;
تفريع الفئة QWidget
عندما يريد المستخدم إنهاء تطبيق قد تحتاج إلى نافذة حوار تسأله ما إذا كان يرغب حقا في الخروج. في هذا المثال ، سنشئ فئة فرعية QWidget ، ونضيف فتحة لها لتواصل مع الزر إنهاء.
التالي هو البرنامج المصدر:
class Notepad : public QWidget
{
Q_OBJECT
public:
Notepad();
private slots:
void quit();
private:
QTextEdit *textEdit;
QPushButton '''quitButton;
};
الماكرو Q_OBJECT ويجب أن يكون الأول في تعريف الفئة، ويعلن - declares - عن الفئة باعتبارها QObject (وبطبيعة الحال ، لا بد أيضا من وراثة QObject ). و QObject يضيف قدرات عدة على الطبقة العادية في C+. خاصة ، ويمكن الاستعلام عن اسم الفئة والفتحة في وقت التشغيل. ومن الممكن أيضا للاستعلام أنواع معالم الفتحة واستدعاؤها.
السر ١٣ يعلن عن فتحة quit(). هذا هو السهل استخدام الماكرو slots. والآن فتحة quit() يمكن أن تكون مرتبطة إلى أي إشارة مع توقيع مطابقة (أي إشارة لا تأخذ أية معالم).
بدلا من إنشاء واجهة المستخدم الرسومية وتوصيل فتحة في الدالة main() ، سنستخدم منشئ المفكرة - Notepad's constructor.
Notepad::Notepad()
{
textEdit = new QTextEdit;
quitButton = new QPushButton(tr("Quit"));
connect(quitButton, SIGNAL (clicked()), this, SLOT (quit()));
QVBoxLayout '''layout = new QVBoxLayout;
layout->addWidget(textEdit);
layout->addWidget(quitButton);
setLayout(layout);
setWindowTitle(tr("Notepad"));
}
كما رأيتم في تعريف الفئة ، نحن نستخدم مؤشرات QObject (textEdit وquitButton). وكقاعدة عامة ، يجب عليك دائما تخصيص QObject ق على كومة - heap - وليس نسخها.
ونحن الآن استخدام الدالة tr() حول النصوص المرئية لدينا. هذه الدالة ضرورية عندما تريد أن يعمل برنامج في أكثر من لغة واحدة (مثل الانكليزية والصينية). ولن أخوض في التفاصيل هنا، ولكن يمكنك اتباع الرابط اللغوي Qt من معرفة المزيد الجدول.
لمعرقة المزيد:
<thead></thead> <tbody> </tbody>الموضوع | انقر هنا |
---|---|
tr() والتدويل - internationalization | <a href="http://doc.qt.nokia.com/4.7/linguist-manual.html">Qt Linguist Manual</a>, <a href="http://doc.qt.nokia.com/4.7/i18n-source-translation.html">Writing Source Code for Translation</a>, <a href="http://doc.qt.nokia.com/4.7/linguist-hellotr.html">Hello tr</a>() Example, <a href="http://doc.qt.nokia.com/4.7/internationalization.html">Internationalization with Qt</a> |
<a href="http://doc.qt.nokia.com/4.7/qtwebkit-bridge.html#qobjects">QObjects</a> and the Qt Object model (This is essential to understand Qt) | <a href="http://doc.qt.nokia.com/4.7/object.html">Object Model</a> |
qmake و نظام البناء في Qt | <a href="http://doc.qt.nokia.com/4.7/qmake-manual.html">qmake Manual</a> |
<br gt;<br gt;<br gt;<br gt; <br gt;<br gt;<br gt;<br gt;
إنشاء الملف .pro
على سبيل المثال، سنكتب ملف .pro الخاص بنا بدلا من استخدام qmake -project:
HEADERS = notepad.h
SOURCES = notepad.cpp main.cpp
والأوامر التالية في CMD تقوم بالبناء:
qmake
make
استخدام QMainWindow
تستفيد العديد من التطبيقات باستخدام QMainWindow التي لها تخطيطها الخاصة الذي يمكنك من إضافة شريط القوائم ، وأشرطة الأدوات ، وشريط الحالة. QMainWindow تحتوي على مساحة المركز الذي يمكن أن يشغلها أي نوع من الحاجيات. في حالتنا ، وسوف نضع محرر النصوص هناك.
التالي هو تعريف المفكرة الجديد:
#include <QtGui>
class Notepad : public QMainWindow
{
Q_OBJECT
public:
Notepad();
private slots:
void open();
void save();
void quit();
private:
QTextEdit *textEdit;
QAction *openAction;
QAction *saveAction;
QAction *exitAction;
QMenu '''fileMenu;
};
في المقطع التالي نسنضيف فتحتان جديدتان تمكناننا من حفظ وفتح مستند.
في كثير من الأحيان ، في النافذة الرئيسية ، ينبغي إسناد حاجيات عدة إلى فتحة واحدة. كما في عناصر القائمة والأزرار على شريط الأدوات. لجعل هذا أسهل ، Qt توفر QAction ، والتي يمكن أن تعطى لالحاجيات عدة ، وتكون مرتبطة إلى فتحة واحدة. على سبيل المثال ، يمكن إنشاء عناصر القائمة وأزرار الأدوات QMenu و QToolBar من نفس QAction. وسوف نرى كيف يعمل هذا في قريبا.
كما كان من قبل ، ونحن نستخدم منشئ المفكرة لإعداد واجهة المستخدم الرسومية.
Notepad::Notepad()
{
saveAction = new QAction(tr("&Open"), this);
saveAction = new QAction(tr("&Save"), this);
exitAction = new QAction(tr("E&xit"), this);
connect(openAction, SIGNAL (triggered()), this, SLOT (open()));
connect(saveAction, SIGNAL (triggered()), this, SLOT (save()));
connect(exitAction, SIGNAL (triggered()), qApp, SLOT (quit()));
fileMenu = menuBar()->addMenu(tr("&File"));
fileMenu->addAction(openAction);
fileMenu->addAction(saveAction);
fileMenu->addSeparator();
fileMenu->addAction(exitAction);
textEdit = new QTextEdit;
setCentralWidget(textEdit);
setWindowTitle(tr("Notepad"));
}
يتم إنشاء QAction مع النص الذي يجب أن تظهر على الحاجيات التي نضيفها لهم (في حالتنا ، عناصر القائمة). إذا أردنا أيضا لإضافتها إلى شريط الأدوات ، يمكن للإجراءات - Actions - أن تحوي رموزا.
عند النقر فوق عناصر قائمة الآن ، سوف تستدعي الإجراء، وسيتم استدعاء كل فتحات المرتبطة بهذا الإجراء.
لمعرقة المزيد:
<thead></thead> <tbody> </tbody>الموضوع | انقر هنا |
---|---|
النوافذ الرئيسية والطبقات النافذة الرئيسية | <a >Application Main Window</a>, <a >Main Window Examples</a> |
تطبيقات النوافذ الداخلية | <a href="http://doc.qt.nokia.com/4.7/qmdiarea.html">QMdiArea</a>, <a href="http://doc.qt.nokia.com/4.7/mainwindows-mdi.html">MDI Example</a> |
<br gt;<br gt;<br gt;<br gt; <br gt;<br gt;<br gt;<br gt;
فتح وحفظ الملفات
في هذا المثال ، وسوف ننفذ وظائف الفتحات save() & load() التي أضيفت في المثال السابق.
سنبدأ مع فتحة open():
QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "",
tr("Text Files ('''.txt);;C++ Files ('''.cpp'''.h)"));
if (fileName != "") {
QFile file(fileName);
if (!file.open(QIODevice::ReadOnly)) {
QMessageBox::critical(this, tr("Error"),
tr("Could not open file"));
return;
}
QString contents = file.readAll().constData();
textEdit->setPlainText(contents);
file.close();
}
والخطوة الأولى هي تطلب من المستخدم hلحصول على اسم الملف لفتحه. Qt تأتي مع QFileDialog ، وهي النافذة التي تمكن المستخدم من تحديد ملف. وتوضح الصورة أعلاه التافذة في نتظام تشغيل Kubuntu. الدالة ثابتة ()getOpenFileName تعرض نافذة اختيار الملف، ولا يعود - return - حتى يحدد المستخدم ملف المطلوب. والتي ترجع مسار الملف المختار أو نصا فارغا عند الإلغاء.
إذا كان لدينا اسم الملف ، نحاول فتح الملف مع open() ، والتي ترجع صحيحا - true -إذا أمكن فتح الملف. ونحن لن نتطرق إلى معالجة أخطاء الفتح هنا، ولكن يمكنك اتباع الروابط من معرفة المزيد. إذا لم يمكن فتح الملف ، ونحن نستخدم QMessageBox لعرض نافذة حوار تظهر رسالة خطأ (انظر وصف فئة QMessageBox للمزيد من التفاصيل).
في الحقيقة القراءة بيانات من ملف هي عملية سهلة باستخدام دالة readAll()، والتي ترجع كافة البيانات في الملف على هيأة QByteArray . و الدالة constData() تقوم بإرجاع كافة البيانات على هيأة const char* والتي تستخدم كمدخل لأحد منشئات QString. ويمكن بعد ذلك يتم عرض المحتويات في محرر النصوص. ثم ننهي باستخدام close() التي تعيد واصف الملف- file descriptor - إلى نظام التشغيل.
الآن ، دعونا ننتقل إلى حفظ فتحة) (.
QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"), "",
tr("Text Files ('''.txt);;C''+ Files ('''.cpp '''.h)"));
if (fileName != "") {
QFile file(fileName);
if (!file.open(QIODevice::WriteOnly)) {
// error message
} else {
QTextStream stream(&file);
stream << textEdit->toPlainText();
stream.flush();
file.close();
}
}
عندما نكتب محتويات محرر النصوص إلى الملف ، استخدام الطبقة QTextStream ، التي يشتمل الكائن QFile. QTextStream يمكنه كتابة QStrings مباشرة إلى الملف - QFile لا يقبل إلا البيانات الخام من نوع (char) مع دالات write() التابعة لـQIODevice .
لمعرقة المزيد:
<thead></thead> <tbody> </tbody>الموضوع | انقر هنا |
---|---|
الملفات و أدوات الإدخال والإخراج | <a href="http://doc.qt.nokia.com/4.7/qfile.html">QFile</a>, <a href="http://doc.qt.nokia.com/4.7/qiodevice.html">QIODevice</a> |
<br gt;<br gt;<br gt;<br gt; <br gt;<br gt;<br gt;<br gt;