>> الصفحة الرئيسية >> مقالات ZetCode >> [8] II - كائنات 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 الإدخال والإخراج لبيانات الفئات
 

[8] II - كائنات Qt4

في هذا الدرس سنواصل الحديث عن الكائنات الرسومية لـ Qt4 .

QCheckBox

صندوق الاختيار QCheckBox هو كائن لديه حالتين: تشغيل و تعطيل. هو صندوق مع نص. اذا كان صندوق الاختيار مُختارا "تشغيل" فهذا يُعرض بعلامة صح بالصندوق.

في مثالنا سوف نعرض صندوق اختيار في النافذة. اذا كان صندوق الاختيار مُختارا يتم عرض عنوان النافذة، واذا لم يكن مختارا يتم اخفائه.



"checkbox.h"

  1.  
  2. #ifndef CHECKBOX_H
  3. #define CHECKBOX_H
  4.  
  5. #include <QWidget>
  6.  
  7. class CheckBox : public QWidget
  8. {
  9. Q_OBJECT
  10.  
  11. public:
  12. CheckBox(QWidget *parent = 0);
  13.  
  14. private slots:
  15. void showTitle(int);
  16.  
  17. };
  18.  
  19. #endif
  20.  

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



"checkbox.cpp"
  1. #include "checkbox.h"
  2. #include <QCheckBox>
  3.  
  4.  
  5. CheckBox::CheckBox(QWidget *parent)
  6. : QWidget(parent)
  7. {
  8.  
  9. QCheckBox *cb = new QCheckBox("Show Title", this);
  10. cb->setCheckState(Qt::Checked);
  11. cb->move(50, 50);
  12.  
  13. connect(cb, SIGNAL(stateChanged(int)), this, SLOT(showTitle(int)));
  14. }
  15.  
  16.  
  17. void CheckBox::showTitle(int state)
  18. {
  19. if (state == Qt::Checked) {
  20. setWindowTitle("QCheckBox");
  21. } else {
  22. setWindowTitle("");
  23. }
  24. }
  25.  


لقد عرضنا صندوق اختيار في النافذة ونربطه بالـ showTitle



cb->setCheckState(Qt::Checked);

صندوق الاختيار مُختارا عندما يبدأ البرنامج.




void CheckBox::showTitle(int state)
{
if (state == Qt::Checked) {
setWindowTitle("QCheckBox");
} else {
setWindowTitle("");
}
}

هذه تقوم بضبط عنوان النافذه وفق حاله صندوق الاختيار.



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

ملف الـ main


والنتيجة:



QListWidget

كائن القائمة QListWidget هو كائن يستخدم لعرض قائمة من المكونات.

في مثالنا سوف نوضع كيف نضيف ، نعيد تسمية أو نحذف المكونات في القائمة.



"listwidget.h"
  1.  
  2. #ifndef LISTWIDGET_H
  3. #define LISTWIDGET_H
  4.  
  5. #include <QWidget>
  6. #include <QPushButton>
  7. #include <QListWidget>
  8.  
  9. class ListWidget : public QWidget
  10. {
  11. Q_OBJECT
  12.  
  13. public:
  14. ListWidget(QWidget *parent = 0);
  15.  
  16. private slots:
  17. void addItem();
  18. void renameItem();
  19. void removeItem();
  20. void clearItems();
  21.  
  22. private:
  23. QPushButton *rename;
  24. QPushButton *remove;
  25. QPushButton *removeAll;
  26.  
  27. };
  28.  
  29. #endif
  30.  

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



"listwidget.cpp"
  1.  
  2. listwidget.cpp
  3. #include "listwidget.h"
  4. #include <QVBoxLayout>
  5. #include <QInputDialog>
  6.  
  7.  
  8. ListWidget::ListWidget(QWidget *parent)
  9. : QWidget(parent)
  10. {
  11.  
  12. QVBoxLayout *vbox = new QVBoxLayout();
  13. vbox->setSpacing(10);
  14.  
  15. // must add it to another layout.
  16. QHBoxLayout *hbox = new QHBoxLayout(this);
  17.  
  18. lw = new QListWidget(this);
  19. lw->addItem("The Omen");
  20. lw->addItem("The Exorcist");
  21. lw->addItem("Notes on a scandal");
  22. lw->addItem("Fargo");
  23. lw->addItem("Capote");
  24.  
  25. add = new QPushButton("Add", this);
  26. rename = new QPushButton("Rename", this);
  27. remove = new QPushButton("Remove", this);
  28. removeAll = new QPushButton("Remove All", this);
  29.  
  30. vbox->setSpacing(3);
  31. vbox->addStretch(1);
  32. vbox->addWidget(add);
  33. vbox->addWidget(rename);
  34. vbox->addWidget(remove);
  35. vbox->addWidget(removeAll);
  36. vbox->addStretch(1);
  37.  
  38. hbox->addWidget(lw);
  39. hbox->addSpacing(15);
  40. hbox->addLayout(vbox);
  41.  
  42. connect(add, SIGNAL(clicked()), this, SLOT(addItem()));
  43. connect(rename, SIGNAL(clicked()), this, SLOT(renameItem()));
  44. connect(remove, SIGNAL(clicked()), this, SLOT(removeItem()));
  45. connect(removeAll, SIGNAL(clicked()), this, SLOT(clearItems()));
  46.  
  47. setLayout(hbox);
  48. }
  49.  
  50. void ListWidget::addItem()
  51. {
  52. QString item = QInputDialog::getText(this, "Item",
  53. "Enter new item");
  54. item = item.simplified();
  55. if (!item.isEmpty()) {
  56. lw->addItem(item);
  57. int r = lw->count() - 1;
  58. lw->setCurrentRow(r);
  59. }
  60. }
  61.  
  62. void ListWidget::renameItem()
  63. {
  64. QListWidgetItem *curitem = lw->currentItem();
  65. int r = lw->row(curitem);
  66. QString text = curitem->text();
  67. QString item = QInputDialog::getText(this, "Item",
  68. "Enter new item", QLineEdit::Normal, text);
  69. item = item.simplified();
  70. if (!item.isEmpty()) {
  71. lw->takeItem(r);
  72. delete curitem;
  73. lw->insertItem(r, item);
  74. lw->setCurrentRow(r);
  75. }
  76. }
  77.  
  78. void ListWidget::removeItem()
  79. {
  80. QListWidgetItem *item = lw->currentItem();
  81.  
  82. if (item) {
  83. int r = lw->row(item);
  84. lw->takeItem(r);
  85. delete item;
  86. }
  87. }
  88.  
  89. void ListWidget::clearItems()
  90. {
  91. if (lw->count() != 0)
  92. lw->clear();
  93. }
  94.  


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




lw = new QListWidget(this);
lw->addItem("The Omen");
lw->addItem("The Exorcist");
lw->addItem("Notes on a scandal");
lw->addItem("Fargo");
lw->addItem("Capote);

تم انشاء قائمة و ملأهما بخمس مكونات.




void ListWidget::addItem()
{
QString item = QInputDialog::getText(this, "Item",
"Enter new item");
item = item.simplified();
if (!item.isEmpty()) {
lw->addItem(item);
int r = lw->count() - 1;
lw->setCurrentRow(r);
}
}

هذه تقوم باضافة مكون جديد للقائمة، حيث تعرض نافذة حوار والتي بدورها تقوم بارجاع النص المُدخل. ولقد ازلنا المسافات الفارغة المحتملة بالنص عن طريق simplified() . اذا كان النص المأخوذ من نافذة الحوار ليس فارغا يتم اضافته للقائمة. اخيرا نقوم بتظليل المكون الذي تم اضافته.




void ListWidget::removeItem()
{
QListWidgetItem *item = lw->currentItem();

if (item) {
int r = lw->row(item);
lw->takeItem(r);
delete item;
}
}

وهذه تقوم بحذف مكون معين من القائمة. أولا نأخذ المكون من القائمة QListWidgetItem المُختار حاليا . نحدد الصف الحالي ونحذف المكون باستخدام طريقة الـ takeItem(). لاحظ كيف اننا مسحنا الـ QListWidgetItem .



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

ملف الـ main



والنتيجة



QPixmap

QPixmap هو من الكائنات التي تسخدم للتعامل مع الصور، فهي تعرض الصور على الشاشة.

في مثالنا سوف نستخدم QPixmap لعرض صورة في النافذة.



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

ملف الهيدر



"pixmap.cpp"
  1.  
  2. #include "pixmap.h"
  3. #include <QPixmap>
  4. #include <QLabel>
  5. #include <QHBoxLayout>
  6.  
  7. Pixmap::Pixmap(QWidget *parent)
  8. : QWidget(parent)
  9. {
  10. QHBoxLayout *hbox = new QHBoxLayout(this);
  11.  
  12. QPixmap pixmap("bojnice.jpg");
  13.  
  14. QLabel *label = new QLabel(this);
  15. label->setPixmap(pixmap);
  16.  
  17. hbox->addWidget(label);
  18. setLayout(hbox);
  19. }
  20.  


هنا نعرض صورة لقلعة مشهورة موجودة في وسط سلوفاكيا



QPixmap pixmap("bojnice.jpg");

QLabel *label = new QLabel(this);
label->setPixmap(pixmap);

أنشأنا QPixmap ووضعناها داخل بطاقة label.



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

ملف الـ main


والنتيجة:



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

في مثالنا سوف نعرض ثلاث اطارات QFrame تم ترتيبها باسخدام مقسمين.



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

ملف الهيدر.



"splitter.cpp"
  1.  
  2. #include "splitter.h"
  3. #include <QFrame>
  4. #include <QSplitter>
  5. #include <QHBoxLayout>
  6.  
  7.  
  8. Splitter::Splitter(QWidget *parent)
  9. : QWidget(parent)
  10. {
  11. QHBoxLayout *hbox = new QHBoxLayout(this);
  12.  
  13. QFrame *topleft = new QFrame(this);
  14. topleft->setFrameShape(QFrame::StyledPanel);
  15.  
  16. QFrame *topright = new QFrame(this);
  17. topright->setFrameShape(QFrame::StyledPanel);
  18.  
  19. QSplitter *splitter1 = new QSplitter(Qt::Horizontal, this);
  20. splitter1->addWidget(topleft);
  21. splitter1->addWidget(topright);
  22.  
  23. QFrame *bottom = new QFrame(this);
  24. bottom->setFrameShape(QFrame::StyledPanel);
  25.  
  26. QSplitter *splitter2 = new QSplitter(Qt::Vertical, this);
  27. splitter2->addWidget(splitter1);
  28. splitter2->addWidget(bottom);
  29.  
  30. hbox->addWidget(splitter2);
  31. setLayout(hbox);
  32.  
  33. }
  34.  


هنا لدينا ثلاث اطارات و مقسمين.




QSplitter *splitter1 = new QSplitter(Qt::Horizontal, this);
splitter1->addWidget(topleft);
splitter1->addWidget(topright);

ننشئ مقسم ونضيف إليه اطارين.



QSplitter *splitter2 = new QSplitter(Qt::Vertical, this);
splitter2->addWidget(splitter1);

يمكننا أيضا اضافة مقسم لمقسم آخر.




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

ملف الـ main


والنتيجة:




QTableWidget

كائن الجدول QTableWidget هو كائن مميز يُستخدم في برامج الجدولة. يسمى كائن الشبكة أحيانا. هو واحد من أكثر الكائنات تعقيدا. هنا سوف نقوم فقط بعرض الجدول في النافذة.



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

ملف الهيدر



"table.cpp"
  1.  
  2. #include "table.h"
  3. #include <QHBoxLayout>
  4. #include <QTableWidget>
  5.  
  6. Table::Table(QWidget *parent)
  7. : QWidget(parent)
  8. {
  9. QHBoxLayout *hbox = new QHBoxLayout(this);
  10.  
  11. QTableWidget *table = new QTableWidget(25, 25, this);
  12.  
  13. hbox->addWidget(table);
  14. setLayout(hbox);
  15. }
  16.  




QTableWidget *table = new QTableWidget(25, 25, this);

هنا أنشأنا جدول بـ 25 صفا و 25 عمودا



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

ملف الـ main



والنتيجة:


إسم الكاتب تاريخ الإضافة التقييم / المقيمين زيارات الدرس
Shanx 21/01/2009 0 / 0 1183

الأكثر زيارة

 دليل تنصيب اطار عمل 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