Getting Started Programming with Qt/ar: Difference between revisions

From Qt Wiki
Jump to navigation Jump to search
(Add "cleanup" tag)
 
(One intermediate revision by one other user not shown)
Line 61: Line 61:
  QPushButton quitButton("Quit");
  QPushButton quitButton("Quit");


  QObject::connect(&quitButton, SIGNAL (clicked()), qApp, SLOT (quit()));
  QObject::connect(&quitButton, SIGNAL (clicked()), qApp, SLOT (quit()));


  QVBoxLayout layout;
  QVBoxLayout layout;
  layout.addWidget(&textEdit);
  layout.addWidget(&textEdit);
  layout.addWidget(&quitButton);
  layout.addWidget(&quitButton);


  QWidget window;
  QWidget window;
  window.setLayout(&layout);
  window.setLayout(&layout);


  window.show();
  window.show();
Line 82: Line 82:
<table class="generic" dir="rtl" lang="ar" align="right">
<table class="generic" dir="rtl" lang="ar" align="right">
<thead><tr class="qt-style topAlign"><th>الموضوع</th><th>انقر هنا</th></tr></thead>
<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 &amp;amp; Slots</a></p></td></tr>
<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="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>
<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>
Line 185: Line 185:
<code> Notepad::Notepad()
<code> Notepad::Notepad()
  {
  {
  saveAction = new QAction(tr("&amp;Open"), this);
  saveAction = new QAction(tr("&Open"), this);
  saveAction = new QAction(tr("&amp;Save"), this);
  saveAction = new QAction(tr("&Save"), this);
  exitAction = new QAction(tr("E&amp;amp;xit"), this);
  exitAction = new QAction(tr("E&xit"), this);


  connect(openAction, SIGNAL (triggered()), this, SLOT (open()));
  connect(openAction, SIGNAL (triggered()), this, SLOT (open()));
Line 193: Line 193:
  connect(exitAction, SIGNAL (triggered()), qApp, SLOT (quit()));
  connect(exitAction, SIGNAL (triggered()), qApp, SLOT (quit()));


  fileMenu = menuBar()->addMenu(tr("&amp;File"));
  fileMenu = menuBar()->addMenu(tr("&File"));
  fileMenu->addAction(openAction);
  fileMenu->addAction(openAction);
  fileMenu->addAction(saveAction);
  fileMenu->addAction(saveAction);
Line 217: Line 217:
<h2 dir="rtl" lang="ar" align="right">فتح وحفظ الملفات</h2>
<h2 dir="rtl" lang="ar" align="right">فتح وحفظ الملفات</h2>
<hr>
<hr>
<p dir="rtl" lang="ar" align="right">في هذا المثال ، وسوف ننفذ وظائف الفتحات save() &amp; load() التي أضيفت في المثال السابق.</p>
<p dir="rtl" lang="ar" align="right">في هذا المثال ، وسوف ننفذ وظائف الفتحات save() & load() التي أضيفت في المثال السابق.</p>
<p dir="rtl" lang="ar" align="middle">
<p dir="rtl" lang="ar" align="middle">
[[Image:http://doc.qt.nokia.com/4.7/images/gs5.png|محرر نصوص بسيط جدا]]
[[Image:http://doc.qt.nokia.com/4.7/images/gs5.png|محرر نصوص بسيط جدا]]
Line 248: Line 248:
  // error message
  // error message
  } else {
  } else {
  QTextStream stream(&amp;file);
  QTextStream stream(&file);
  stream << textEdit->toPlainText();
  stream << textEdit->toPlainText();
  stream.flush();
  stream.flush();

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;