>> الصفحة الرئيسية >> مقالات ZetCode >> [4] القوائم وشريط الأدوات في Qt4

الأقسام الرئيسية

 التنصيب والاعداد التنصيب والاعداد
 دروس متقدمة دروس متقدمة
 سلسلة دروس للمبتدئين سلسلة دروس للمبتدئين
 اساسيات لغة سي++ اساسيات لغة سي++
 مقالات ZetCode مقالات ZetCode
 

جديد الدروس

 الوحدة QtUiTools (واجهة المستخدم ديناميكية التوليد)
التاريخ 04/07/2009 الوحدة QtUiTools (واجهة المستخدم ديناميكية التوليد)
 Qt and Phonon
التاريخ 04/07/2009 Qt and Phonon
 تتمة الرسائل ومربعات الحوار في qt
التاريخ 04/07/2009 تتمة الرسائل ومربعات الحوار في qt
 مدخل الى xml في Qt
التاريخ 04/07/2009 مدخل الى xml في Qt
 الإدخال والإخراج لبيانات الفئات
التاريخ 04/07/2009 الإدخال والإخراج لبيانات الفئات
 

[4] القوائم وشريط الأدوات في Qt4

في هذا الدرس سوف نتحدث عن القوائم menus وشريط الأدوات toolbar في برامج وتطبيقات الـ Qt


القائمه هي واحدة من أكثر الأجزاء التي نراها في التطبيقات ، فهي تلك المجموعة من الأوامر الواقعة في قوائم مختلفة بالجزء الأعلى من الكثير من البرامج. بينما في تطبيقات لوحة التحكم "console" عليك أن تتذكر كل تلك الأوامر ، هنا لدينا معظم هذه الأوامر مرتبة في أجزاء منطقية. القوائم ترتب الأوامر- التي تستخدمها في التطبيق- في مجموعات. وشريط الأدوات يوفر وصول سريع لأكثر الأوامر استخداما.


قائمة بسيطة

مثالنا الأول يعرض قائمة بسيطة:

  1. #ifndef SIMPLEMENU_H
  2. #define SIMPLEMENU_H
  3.  
  4. #include <QMainWindow>
  5.  
  6. class SimpleMenu : public QMainWindow
  7. {
  8. public:
  9. SimpleMenu(QWidget *parent = 0);
  10.  
  11. };
  12.  
  13. #endif
  14.  

هذا هو الهيدر لمثالنا

  1. #include "simplemenu.h"
  2. #include <QMenu>
  3. #include <QMenuBar>
  4. #include <QApplication>
  5.  
  6.  
  7.  
  8. SimpleMenu::SimpleMenu(QWidget *parent)
  9. : QMainWindow(parent)
  10. {
  11.  
  12. QAction *quit = new QAction("&Quit", this);
  13.  
  14. QMenu *file;
  15. file = menuBar()->addMenu("&File");
  16. file->addAction(quit);
  17.  
  18. connect(quit, SIGNAL(triggered()), qApp, SLOT(quit()));
  19.  
  20. }
  21.  


هنا لدينا شريط قوائم menubar ، وعمل أو أكشن "action" . وحتى نتعامل مع القوائم يجب أن نرث من الكائن QMainWindow .


QAction *quit = new QAction("&Quit", this);

هذه التعليمة تنشئ QAction وهو كائن يمثل العمل الذي سينجز . كل كائن QMenu لديه كائن QAction أو أكثر.


QMenu *file;
file = menuBar()->addMenu("&File");

هنا أنشأنا كائن من الـ QMenu واضفنا قائمة الـ File
file->addAction(quit)

وأضفنا عمل (أكشن) داخل القائمة
connect(quit, SIGNAL(triggered()), qApp, SLOT(quit()));

وربطنا حدث الخروج معه، اذا اخترناه من القائمة نخرج من البرنامج


  1. #include "simplemenu.h"
  2. #include <QDesktopWidget>
  3. #include <QApplication>
  4.  
  5. void center(QWidget &widget)
  6. {
  7. int x, y;
  8. int screenWidth;
  9. int screenHeight;
  10. int width, height;
  11. QSize windowSize;
  12.  
  13. QDesktopWidget *desktop = QApplication::desktop();
  14.  
  15. width = widget.frameGeometry().width();
  16. height = widget.frameGeometry().height();
  17.  
  18. screenWidth = desktop->width();
  19. screenHeight = desktop->height();
  20.  
  21. x = (screenWidth - width) / 2;
  22. y = (screenHeight - height) / 2;
  23.  
  24. widget.move( x, y );
  25. }
  26.  
  27.  
  28. int main(int argc, char *argv[])
  29. {
  30. QApplication app(argc, argv);
  31.  
  32. SimpleMenu window;
  33.  
  34. window.setWindowTitle("Simple menu");
  35. window.show();
  36. center(window);
  37.  
  38. return app.exec();
  39. }
  40.  

ملف الـ main



والنتيجة



أيقونات icons ، اختصارات shotrcut ، فواصل separators

في المثال التالي سوف نعزز تطبيقنا السابق باضافة الأيقونات إلى القوائم وسنستخدم الاختصارات والفواصل.

  1. #ifndef ANOTHERMENU_H
  2. #define ANOTHERMENU_H
  3.  
  4. #include <QMainWindow>
  5.  
  6. class AnotherMenu : public QMainWindow
  7. {
  8. public:
  9. AnotherMenu(QWidget *parent = 0);
  10.  
  11. };
  12.  
  13. #endif
  14.  

هذا ملف الهيدر للمثال


  1. #include "anothermenu.h"
  2. #include <QMenu>
  3. #include <QMenuBar>
  4. #include <QApplication>
  5.  
  6.  
  7.  
  8. AnotherMenu::AnotherMenu(QWidget *parent)
  9. : QMainWindow(parent)
  10. {
  11.  
  12. QPixmap newpix("new.png");
  13. QPixmap openpix("open.png");
  14. QPixmap quitpix("quit.png");
  15.  
  16. QAction *newa = new QAction(newpix, "&New", this);
  17. QAction *open = new QAction(openpix, "&Open", this);
  18. QAction *quit = new QAction(quitpix, "&Quit", this);
  19. quit->setShortcut(tr("CTRL+Q"));
  20.  
  21. QMenu *file;
  22. file = menuBar()->addMenu("&File");
  23. file->addAction(newa);
  24. file->addAction(open);
  25. file->addSeparator();
  26. file->addAction(quit);
  27.  
  28. connect(quit, SIGNAL(triggered()), qApp, SLOT(quit()));
  29.  
  30. }
  31.  


في مثالنا لدينا قائمة واحدة وثلا أعمال. العمل quit الوحيد الذي سيقوم فعليا بعمل اذا اخترناه. أنشأنا أيضا فاصل ، واختصار [CTRL+Q] سوف ينهي البرنامج .

QPixmap newpix("new.png");
QPixmap openpix("open.png");
QPixmap quitpix("quit.png");

هذه الصور التي سنستخدمها في القوائم كأيقونات


QAction *newa = new QAction(newpix, "&New", this);
QAction *open = new QAction(openpix, "&Open", this);
QAction *quit = new QAction(quitpix, "&Quit", this);

وهذه التعليمة أضفنا في باني العمل (constructor) صورة كوسيط أول


quit->setShortcut(tr("CTRL+Q"));
هنا ننشئ اختصار للوحة المفاتيح. عند ضغطنا لهذا الاختصار سوف نطلق عمل الخروج والذي سيتولى بدوره انهاء البرنامج.


file->addSeparator();

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



  1. #include "anothermenu.h"
  2. #include <QDesktopWidget>
  3. #include <QApplication>
  4.  
  5. void center(QWidget &widget)
  6. {
  7. int x, y;
  8. int screenWidth;
  9. int screenHeight;
  10. int width, height;
  11. QSize windowSize;
  12.  
  13. QDesktopWidget *desktop = QApplication::desktop();
  14.  
  15. width = widget.frameGeometry().width();
  16. height = widget.frameGeometry().height();
  17.  
  18. screenWidth = desktop->width();
  19. screenHeight = desktop->height();
  20.  
  21. x = (screenWidth - width) / 2;
  22. y = (screenHeight - height) / 2;
  23.  
  24. widget.move( x, y );
  25. }
  26.  
  27.  
  28. int main(int argc, char *argv[])
  29. {
  30. QApplication app(argc, argv);
  31.  
  32. AnotherMenu window;
  33.  
  34. window.setWindowTitle("Another menu");
  35. window.show();
  36. center(window);
  37.  
  38. return app.exec();
  39. }
  40.  

ملف الـ main


النتيجة


قائمة الاختيارات

في المثال التالي سوف ننشئ قائمة اختيار و التي هي عبارة عن قائمة من الأعمال مع كل عمل مربع اختيار.
هذا الخيار سوف يتحكم بظهور شريط الحالة في مثالنا.


  1. #ifndef CHECKABLE_H
  2. #define CHECKABLE_H
  3.  
  4. #include <QMainWindow>
  5.  
  6. class CheckableMenu : public QMainWindow
  7. {
  8. public:
  9. CheckableMenu(QWidget *parent = 0);
  10.  
  11. };
  12.  
  13. #endif
  14.  

ملف الهيدر

  1. #include "checkable.h"
  2. #include <QMenu>
  3. #include <QMenuBar>
  4. #include <QStatusBar>
  5. #include <QApplication>
  6.  
  7.  
  8. Checkable::Checkable(QWidget *parent)
  9. : QMainWindow(parent)
  10. {
  11.  
  12. viewst = new QAction("&View statusbar", this);
  13. viewst->setCheckable(true);
  14. viewst->setChecked(true);
  15.  
  16. QMenu *file;
  17. file = menuBar()->addMenu("&File");
  18. file->addAction(viewst);
  19.  
  20. statusBar();
  21.  
  22. connect(viewst, SIGNAL(triggered()), this, SLOT(toggleStatusbar()));
  23. }
  24.  
  25.  
  26. void Checkable::toggleStatusbar()
  27. {
  28. if (viewst->isChecked())
  29. statusBar()->show();
  30. else
  31. statusBar()->hide();
  32. }
  33.  




viewst = new QAction("&View statusbar", this);
viewst->setCheckable(true);
viewst->setChecked(true);

أنشأنا عمل وجعلناه قابل للاختيار باستخدام setCheckable() . وجعلنا هذا الخيار هو المُختار


if (viewst->isChecked())
statusBar()->show();
else
statusBar()->hide();

وداخل الـ toggleStatusbar نحدد ما اذا كان هذا العمل قد اختير ونخفي أو نعرض شريط الأدوات تبعا لذلك


  1. #include "checkable.h"
  2. #include <QDesktopWidget>
  3. #include <QApplication>
  4.  
  5. void center(QWidget &widget)
  6. {
  7. int x, y;
  8. int screenWidth;
  9. int screenHeight;
  10.  
  11. int WIDTH = 250;
  12. int HEIGHT = 170;
  13.  
  14. QDesktopWidget *desktop = QApplication::desktop();
  15.  
  16. screenWidth = desktop->width();
  17. screenHeight = desktop->height();
  18.  
  19. x = (screenWidth - WIDTH) / 2;
  20. y = (screenHeight - HEIGHT) / 2;
  21.  
  22. widget.setGeometry(x, y, WIDTH, HEIGHT);
  23. }
  24.  
  25.  
  26. int main(int argc, char *argv[])
  27. {
  28. QApplication app(argc, argv);
  29.  
  30. Checkable window;
  31.  
  32. window.setWindowTitle("Checkable menu");
  33. window.show();
  34. center(window);
  35.  
  36. return app.exec();
  37. }
  38.  

ملف الـ main



النتيجة


QToolBar

فئة الـ QToolBar توفر لوحة قابلة للحركة تحتوي على مجموعة من متحكمات توفر وصول سريع لأعمال التطبيقات كتلك الموجودة في القوائم.


  1. #ifndef TOOLBAR_H
  2. #define TOOLBAR_H
  3.  
  4. #include <QMainWindow>
  5.  
  6. class Toolbar : public QMainWindow
  7. {
  8. Q_OBJECT
  9.  
  10. public:
  11. Toolbar(QWidget *parent = 0);
  12.  
  13. };
  14.  
  15. #endif

وهذا ملف الهيدر



  1. #include "toolbar.h"
  2. #include <QToolBar>
  3. #include <QApplication>
  4. #include <QIcon>
  5. #include <QAction>
  6.  
  7.  
  8. Toolbar::Toolbar(QWidget *parent)
  9. : QMainWindow(parent)
  10. {
  11. QPixmap newpix("new.png");
  12. QPixmap openpix("open.png");
  13. QPixmap quitpix("quit.png");
  14.  
  15. QToolBar *toolbar = addToolBar("main toolbar");
  16. toolbar->addAction(QIcon(newpix), "New File");
  17. toolbar->addAction(QIcon(openpix), "Open File");
  18. toolbar->addSeparator();
  19. QAction *quit = toolbar->addAction(QIcon(quitpix),
  20. "Quit Application");
  21.  
  22. connect(quit, SIGNAL(triggered()), qApp, SLOT(quit()));
  23.  
  24. }
  25.  


ننشئ شريط أدوات ولا ننسى أن نرث من كائن الـ QMainWindow حتى نتمكن من انشاء شريط الأدوات.


QToolBar *toolbar = addToolBar("main toolbar");

addToolBar() تنشئ شريط أدوات وترجع مؤشر اليه


toolbar->addAction(QIcon(newpix), "New File");
toolbar->addAction(QIcon(openpix), "Open File");
toolbar->addSeparator();

هنا أضفنا عملين وفاصل لشريط الأدوات


  1. #include "toolbar.h"
  2. #include <QDesktopWidget>
  3. #include <QApplication>
  4.  
  5. void center(QWidget &widget)
  6. {
  7. int x, y;
  8. int screenWidth;
  9. int screenHeight;
  10.  
  11. int WIDTH = 250;
  12. int HEIGHT = 170;
  13.  
  14. QDesktopWidget *desktop = QApplication::desktop();
  15.  
  16. screenWidth = desktop->width();
  17. screenHeight = desktop->height();
  18.  
  19. x = (screenWidth - WIDTH) / 2;
  20. y = (screenHeight - HEIGHT) / 2;
  21.  
  22. widget.setGeometry(x, y, WIDTH, HEIGHT);
  23. }
  24.  
  25.  
  26. int main(int argc, char *argv[])
  27. {
  28. QApplication app(argc, argv);
  29.  
  30. Toolbar window;
  31.  
  32. window.setWindowTitle("QToolBar");
  33. window.show();
  34. center(window);
  35.  
  36. return app.exec();
  37. }
  38.  

ملف الـ main


والنتيجة


هيكل تطبيق

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

هذا المثال سيكون مبني أساسا على الـ QMainWindow


  1. #ifndef SKELETON_H
  2. #define SKELETON_H
  3.  
  4. #include <QMainWindow>
  5.  
  6. class Skeleton : public QMainWindow
  7. {
  8. Q_OBJECT
  9.  
  10. public:
  11. Skeleton(QWidget *parent = 0);
  12.  
  13. };
  14.  
  15. #endif
  16.  

ملف الهيدر للمثال


  1. #include "skeleton.h"
  2. #include <QToolBar>
  3. #include <QApplication>
  4. #include <QIcon>
  5. #include <QAction>
  6. #include <QMenu>
  7. #include <QMenuBar>
  8. #include <QStatusBar>
  9. #include <QTextEdit>
  10.  
  11.  
  12. Skeleton::Skeleton(QWidget *parent)
  13. : QMainWindow(parent)
  14. {
  15. QPixmap newpix("new.png");
  16. QPixmap openpix("open.png");
  17. QPixmap quitpix("quit.png");
  18.  
  19. QAction *quit = new QAction("&Quit", this);
  20.  
  21. QMenu *file;
  22. file = menuBar()->addMenu("&File");
  23. file->addAction(quit);
  24.  
  25. connect(quit, SIGNAL(triggered()), qApp, SLOT(quit()));
  26.  
  27. QToolBar *toolbar = addToolBar("main toolbar");
  28. toolbar->addAction(QIcon(newpix), "New File");
  29. toolbar->addAction(QIcon(openpix), "Open File");
  30. toolbar->addSeparator();
  31. QAction *quit2 = toolbar->addAction(QIcon(quitpix),
  32. "Quit Application");
  33.  
  34. QTextEdit *edit = new QTextEdit(this);
  35.  
  36. setCentralWidget(edit);
  37.  
  38. statusBar()->showMessage("Ready");
  39.  
  40. connect(quit, SIGNAL(triggered()), qApp, SLOT(quit()));
  41. connect(quit2, SIGNAL(triggered()), qApp, SLOT(quit()));
  42. }
  43.  


هنا أنشأنا قائمة ، شريط أدوات ، وشريط حالة



QTextEdit *edit = new QTextEdit(this);

setCentralWidget(edit);

ننشئ QTextEdit ونضعها في الجزء الوسطي من الـ QMainWindow



  1. #include "skeleton.h"
  2. #include <QDesktopWidget>
  3. #include <QApplication>
  4.  
  5. void center(QWidget &widget)
  6. {
  7. int x, y;
  8. int screenWidth;
  9. int screenHeight;
  10.  
  11. int WIDTH = 350;
  12. int HEIGHT = 250;
  13.  
  14. QDesktopWidget *desktop = QApplication::desktop();
  15.  
  16. screenWidth = desktop->width();
  17. screenHeight = desktop->height();
  18.  
  19. x = (screenWidth - WIDTH) / 2;
  20. y = (screenHeight - HEIGHT) / 2;
  21.  
  22. widget.setGeometry(x, y, WIDTH, HEIGHT);
  23. }
  24.  
  25.  
  26. int main(int argc, char *argv[])
  27. {
  28. QApplication app(argc, argv);
  29.  
  30. Skeleton window;
  31.  
  32. window.setWindowTitle("Application skeleton");
  33. window.show();
  34. center(window);
  35.  
  36. return app.exec();
  37. }
  38.  

ملف الـ main



والنتيجه


والحمدلله رب العالمين
حمدا كما ينبغي لجلال وجهه وعظيم سلطانه

أتمنى أن أكون وُفقت في هذا الدرس الصغير
والله ولي التوفيق

إسم الكاتب تاريخ الإضافة التقييم / المقيمين زيارات الدرس
Shanx 21/12/2008 27 / 3 1285

الأكثر زيارة

 دليل تنصيب اطار عمل Qt ، حزمة MinGW ، بيئة التطوير QDevelop
الزيارات 4282 دليل تنصيب اطار عمل Qt ، حزمة MinGW ، بيئة التطوير QDevelop
 اعداد وتنصيب Qt
الزيارات 4068 اعداد وتنصيب Qt
 التطوير السريع للتطبيقات Rapid Application Development
الزيارات 3762 التطوير السريع للتطبيقات Rapid Application Development
 دليل تنصيب اطار عمل Qt ، حزمة MinGW ، بيئة التطوير Eclipse
الزيارات 3745 دليل تنصيب اطار عمل Qt ، حزمة MinGW ، بيئة التطوير Eclipse
 C++ In a Nutshell
الزيارات 3151 C++ In a Nutshell
 

الأكثر تصويتـا

 اعداد وتنصيب Qt
نتيجة التصويت 41 من 6 شخص اعداد وتنصيب Qt
 الدرس الاول : كتابة اول برنامج
نتيجة التصويت 41 من 6 شخص الدرس الاول : كتابة اول برنامج
 تخطيط البرامج Program Layout
نتيجة التصويت 40 من 6 شخص تخطيط البرامج Program Layout
 دوال المستوى العالي لبرمجة تطبيقات متعددة المسالك
نتيجة التصويت 30 من 3 شخص دوال المستوى العالي لبرمجة تطبيقات متعددة المسالك
 التطوير السريع للتطبيقات Rapid Application Development
نتيجة التصويت 30 من 5 شخص التطوير السريع للتطبيقات Rapid Application Development
 
 

سكربت story-script v1 برمجة bwady.com تطوير SudaNix