الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

البداية مع Qt

رائج
بدأه الاخير زمانه في 3 نوفمبر 2008 · 52 رد · 17,996 مشاهدة · في قسم Cross Platform GUI Libraries العام
مشاركة: واتساب X فيسبوك تيليجرام
#26

اخي العزيز ...شكراُ لشرحك المميز....وارجو التوضيح

هل الـ Qt Designer و QDevelop هما بنفس البرنامج ام كل واحد منفصل عن الاخر؟ واذا كانا منفصلان فكيف يمكن التنسيق بينهما (دمج الكود مع التصميم)؟

وبالنسبة لـ البرنامج Qt SDK النسخة LGPL / Free الخاصة بالوندوز. هل يعتبر بيئة تطويرية كاملة...اي لااحتاج بعدها الي اي كومبايلر...يعني يعطيني مباشرتاً برنامج تنفيذي كامل ؟ يعمل بدون اي مكتبات اضيفها الى البرنامج او للوندوز؟

ارجو ان اجد اجابة شافية..كوني مبتديء واريد تطبيق ماشرحته حضرتك .

***من الأفضل أن تمشي ببطء إلى الأمام على أن تمشي مسرعاً إلى الخلف***

#27

ال Designer هو برنامج لتصميم الشاشات والنوافذ والنتيجة منه ستكون ملف xml ، وبعدها سيعمل مترجم داخلي uic ويقوم بتحويل ملف ال xml الى هيدر فايل لكي تستخدمه في مشروعك .

اما الـ QDevelop فهو بيئة تطوير IDE غير رسمية ، وحاليا لا ينصح باستخدامها ويكفي فقط ال Qt Creator

وبالنسبة لـ Qt SDK فهو عبارة عن مكتبة كيوتي + مترجم سي++ الموجود ضمن حزمة MinGW + بيئة التطوير Qt Creator.

ولن تحتاج الى عمل اي شيء في حالة استخدامك للـ Qt SDK .

وبالتوفيق.

تم تعديل هذه المشاركة بواسطة SudaNix في 24 يوليو 2009 في 10:14

#28

شكراً جزيلاً سيدي...بقي ان اسأل

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

دمت بود

***من الأفضل أن تمشي ببطء إلى الأمام على أن تمشي مسرعاً إلى الخلف***

#29
اقتباس
مالفرق بين النسخة المجانية من QT والنسخة التجارية..يعني انا سمعت ان السورس كود يكون مفتوح في النسخة المجانية...كيف ذلك؟...يعني انا الذي اعرفه ان بيئة التطوير تنتج برنامج تنفيذي في النهاية...فكيف تكون الحالة في البيئة التطويرية للـ QT للنسخة المجانية؟ مالذي سوف ينتج في النهاية..؟

لا فرق بينهما سوى الدعم الفني وبعض الحلول الخاصة للنسخة التجارية.

وراجع ردي قبل الاخير هنا في الموضوع حيث وضحت بشكل بسيط الفرق بين الرخص المتوفرة.

وبالنسبة لفتح السورس كود ، فالمقصود هنا ان تقوم بتوفير البرنامج التنفيذي بالاضافة الى الكود الذي قمت بكتابته ، وهذا أصبح الان غير ضروري مع الرخصة LGPL.

بالتوفيق.

#30

حاولت مع التطبيق الاول الذي شرحته حضرتك...ولكن عند الضغط على قائمة Build واختيار Build ثم من قائمة Debug اختار Start Program

تظهر لي رسالة نافذة التحذير التالية...ولا يتم تنفيذ البرنامج للاسف...فما السبب؟

[url=http://www.0zz0.com]822648946.jpg[/url]

***من الأفضل أن تمشي ببطء إلى الأمام على أن تمشي مسرعاً إلى الخلف***

#31

ما هو ال IDE الذي تستخدمه ؟

و ما هي الرسالة التي تظهر لك ؟

اذا كنت تستخدم QtCreator تأكد من انه قد تعرف على مسار Qt وهذا من خلال :

option -> tool -> Qt4

ويجب ان تظهر لك علامة "صح".

وبعد ذلك جرب عمل run للبرنامج .

بالتوفيق.

#32

بالبداية شكراً لك سيدي على مرورك

واحب ان ابين انني استخدم البرامج التالية

MinGW-3.4.2

QDevelop- V0.27

Qt 4.5.2

وقمت باكمال ضبط شاشة الـ External Tools كما في الصورة ادناه

644253919.jpg

فقط الشيء الغريب لدي ...انه حين اقوم بتشغيل برنامج الـ QDevelop تظهر لي دائماً في البداية هذه الرسالة

634894860.jpg

وشكراً لك مقدماً..

تم تعديل هذه المشاركة بواسطة ahmed arkan في 27 يوليو 2009 في 18:45

***من الأفضل أن تمشي ببطء إلى الأمام على أن تمشي مسرعاً إلى الخلف***

#33

طيب عدل مسار ملفات الهيدر لكيوتي من داخل الـ option

نسخ الـ SDK تختلف عن النسخ القديمة في ترتيب الملفات ، وهذا الـ IDE كان يعتمد على الترتيب القديم ، لذلك قم بضبط مسار مجلد include.

امر اخر لماذا تستخدم هذه البيئة ؟ هي ضعيفة جدا مقارنة بـ QtCreator وليست بيئة رسمية.

اذا كنت قد حملت ال SDK ستجد برنامج QtCreator في قائمة البرامج .

عموما اذا كنت تريد استخدام ال QDevelop فلا بأس ، لكن عليك تعديل المسارات لكي يعمل معك.

الى اللقاء.

#34
اقتباس
امر اخر لماذا تستخدم هذه البيئة ؟ هي ضعيفة جدا مقارنة بـ QtCreator وليست بيئة رسمية.

اذا كنت قد حملت ال SDK ستجد برنامج QtCreator في قائمة البرامج .

بما انني مبتديء في هذا المجال ...فسوف اعتمد على الله وعلى كلامك هذا ... واتجه الى بيئة QtCreator ... وحقاً اني ارى هذه البيئة سلسة ...

مع الشكر الجزيل لك سيدي.

***من الأفضل أن تمشي ببطء إلى الأمام على أن تمشي مسرعاً إلى الخلف***

#35

السلام عليكــم ورحمـة الله وبركاتــه ،،

سنكون برنامج بسيط لعرض الصور

كما في الصورة

post-47438-1249795192_thumb.jpg

البرنامج ينقصه الكثير من الامور فلقد كتبته على عجالة و احببت ان اضعه هنا قبل ان يصابني الكسل :lol:

سنستخدم الاداة QLabel لعرض الصورة

QLabel is used for displaying text or an image.

كون مشروع جديد ، انا استخدمت QDevelop ، سيكون المشروع من نوع Application with Main Menu .

افتح ال Qt Designer و صمم البرنامج كما في الصورة

post-47438-1249795232_thumb.jpg

الان اضف الكود ،،

ملف الهدر سيكون كاملا كالأتي:

#ifndef IMAGEVIEWERIMPL_H
#define IMAGEVIEWERIMPL_H
//
#include <QMainWindow>
#include <QMessageBox>
#include <QFileDialog>
#include <QLabel>
#include <QScrollArea>
#include <QTimer>
#include "ui_imageViewer.h"
//
class ImageViewerImpl : public QMainWindow, public Ui::ImageViewer
{
Q_OBJECT
public:
ImageViewerImpl( QWidget * parent = 0, Qt::WFlags f = 0 );
private:
QStringList filenames;
int i;
QTimer *timer;
private slots:
void Open();
void ShowImage();
void AutoShow();
void EnableTimer();
};
#endif

عندما يختار المستخدم خيار open من ال menu سيظهر له dialog لأختار ملف (او ملفات صور) سيتم عرض الصورة وايضا يتم اضافتها الى ال ListWidget ، حيث سننتقل بين الصور عن طريق الضغط على اسم الصورة في ال ListWidget و ايضا سيكون لدينا check box بعنوان Auto Show عند الضغط عليه سيتم عرض الصور بصورة تلقائية عن طريق استخدام Timer سينتقل بين الصور كل 5 ثواني.

افتح ملف ال .cpp

اولا سنضيف ال connect التي سنحتاجها

ImageViewerImpl::ImageViewerImpl( QWidget * parent, Qt::WFlags f) 
: QMainWindow(parent, f)
{
setupUi(this);

label->setAlignment(Qt::AlignCenter);
timer = new QTimer(this);

connect(timer, SIGNAL(timeout()), this, SLOT(AutoShow()));

connect(actionOpen,SIGNAL(triggered(bool)), this , SLOT(Open()));
connect(actionExit,SIGNAL(triggered(bool)), qApp , SLOT(quit()));

connect(checkBox, SIGNAL(stateChanged(int)), this, SLOT(EnableTimer()));

connect(listWidget, SIGNAL(itemSelectionChanged()), this, SLOT(ShowImage()));
}

دالة Open ستكون مسئولة عن اظهار dialog للمستخدم لأختار ملف الصورة عن طريق استخدام QFileDialog ثم عرض الصورة داخل QLabel ثم اضافة اسماء الملفات التي تم اختيارها الى ال ListWidget .

void ImageViewerImpl::Open()
{
filenames = QFileDialog::getOpenFileNames( this,
tr("Open File"),
QDir::currentPath(),
tr("Image files (*.jpg *.bmp);; All files(*.*)"));
if (filenames.count()<1)
{
return;
}
i = filenames.count(); 
QString filename = filenames[0];
QImage image(filename);
if (image.isNull()) 
{
QMessageBox::information(this, tr("Image Viewer"),tr("Error"));
return;
}
label->setPixmap(QPixmap::fromImage(image));
listWidget->clear();
foreach (QString string, filenames)
{
listWidget->addItem(string);
}
}

الان عندما يضغط المستخدم على اسم صورة في ال listWidget يجب ان تعرض الصورة في ال QLabel ،،

في الكود الذي في الاعلى ، اضفنا connect خاصة ب ListWidget

connect(listWidget, SIGNAL(itemSelectionChanged()), this, SLOT(ShowImage()));

عندما يضغط المستخدم على اسم صورة ،، اشارة itemSelectionChanged ستتولد ، وبالتالي ستتنفذ دالة ShowImage التي قمنا بربطها معها.

دالة ال ShowImage ستقوم بعرض الصورة كما في دالة Open

void ImageViewerImpl::ShowImage()
{
QImage image(listWidget->currentItem()->text());
if (image.isNull()) 
{
QMessageBox::information(this, tr("Image Viewer"),tr("Error"));
return;
}
label->setPixmap(QPixmap::fromImage(image));
}

الان بقي لدينا ال Timer ، عند تأشير ال check box سنقوم بتشغيل المؤقت،،

ايضا في ال connect التي في الاعلى كان لدينا connect خاصة ب check box ، هذه

connect(checkBox, SIGNAL(stateChanged(int)), this, SLOT(EnableTimer()));

أي عندما يضغط المستخدم على ال check box ستتنفذ دالة EnableTimer و التي ستكون كالتالي:

void ImageViewerImpl::EnableTimer()
{
if(checkBox->isChecked()==true)
timer->start(5000);
else
timer->stop();
}

سنقوم بتشغيل المؤقت كل 5 ثواني.

بقي الان الشيء الاخير ، وهو ان نضيف الكود داخل ال timer ،،

ايضا اضفنا connect خاصة بالمؤقت وهي

connect(timer, SIGNAL(timeout()), this, SLOT(AutoShow()));

أي عند كل 5 ثواني ستتنفذ دالة AutoShow ، وستكون هذه الدالة كالأتي:

void ImageViewerImpl::AutoShow()
{
if(listWidget->count() >= 0)
{
if(listWidget->currentRow() == i-1)
listWidget->setCurrentRow(0);
else
listWidget->setCurrentRow(listWidget->currentRow()+1);
}
}

في هذه الدالة فقط قمنا بتغيير العنصر المؤشر ضمن ال listWidge الى العنصر التالي ،،

اذن كيف ستتغير الصورة المعروضة و نحن لم نقوم بتغيير الصورة المعروضة داخل الكود الخاص بالمؤقت؟؟

في داخل المؤقت نحن سنقوم فقط بتغيير العنصر المؤشر في ال ListWidget وبالتالي ستنطلق اشارة itemSelectionChanged ، وهذه الاشارة سبق وان عالجناها بربطها بدالة ShowImage و التي هي من ستقوم بتغيير الصورة المعروضة في ال QLabel الى الصورة التالية.

التطبيق في المرفقات.

ممكن نطور البرنامج مستقبلا ،،

كما ذكرت حبيت اضعه بسرعة لأن لدي وقت فراغ وقبل ان يصيبني الكسل ،،

المشكلة الاساسية في التطبيق هو اذا كانت الصورة كبيرة لن تظهر كاملة في ال QLabel ، لم اجد الخاصية التي تقوم بتصغير الصورة على حجم ال QLabel ،، ممكن استخدام Scroll Area لكي نتمكن من مشاهدة الصورة كاملة.

ايضا ضمن ال Display Widgets هناك widget اسمها Graphics view ، اسمها يوحي انه ممكن استخدامها في عرض الصور لكني للأن لا اعرف كيفية استخدامها.

ImageViewer.rar

تم تعديل هذه المشاركة بواسطة الاخير زمانه في 9 أغسطس 2009 في 11:37

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#36

السلام عليكــم ورحمـة الله وبركاتــه ،،

جزاك الله خيرا اخي الاخير زمانه

فعلا مجتهد في هذا القسم و ال Qt اكثر من رائعة و عملاق قادم للصدارة

تحياتي

#37

وعليكم السلام ورحمة الله وبركاته..

رائع اخي الكريم :happy:

وبالنسبة للصور فيمكن ان تعرضها على QScrollArea حتى تظهر الصورة كاملة وفي نفس الوقت حجم النافذة يكون مناسب.

تعليق بسيط على الدالة AutoShow() والتي تعمل على اختيار الصورة التالية ، كان ممكن تستفيد من المعامل % وتختصرها في سطر واحد :

 

listWidget[color= #000000;]-[color= #000000;]>setCurrentRow[color= #000000;]([color= #000000;](listWidget[color= #000000;]-[color= #000000;]>count[color= #000000;]([color= #000000;]) [color= #000000;]>= [color= #ff0000;]0[color= #000000;]) ?[color= #000000;](listWidget[color= #000000;]-[color= #000000;]>currentRow[color= #000000;]([color= #000000;]) [color= #000000;]+ [color= #ff0000;]1[color= #000000;]) [color= #000000;]% listWidg
et[color= #000000;]-[color= #000000;]>count[color= #000000;]([color= #000000;])[color= #000000;]:[color= #ff0000;]0 [color= #000000;]);

و لو حبيت تطوره مستقبلا ، ممكن تضع ال listWidget في QDockWidget حتى يستطيع المستخدم فتحها وقفلها ،،

ايضا اضف عمليات ال zoom وال rotate ، ولا بأس ببعض الفلاتر البسيطة :wink:

بارك الله فيك ، ونفع بعلمك..

بالتوفيق.

#38

شكرا اخواني على المرور ،،

مشكور اخي احمد على ملاحضاتك،،

بالمناسبة هل موقع qt-ar.org لا يعمل ؟؟

اردت وضع الدرس هناك لكن الموقع لم يفتح

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#39

نعم ، وان شاء الله سيرجع في هذا الاسبوع.

شكرا لك.

#40

ماشاء الله مفيد و الكل يحتاج هذي الدروس

و شكراً لك و لصحاب المنتدى و المشرفين

اتمنى تثبيت الموضوع

#41
الاخير زمانه كتب:

السلام عليكــم ورحمـة الله وبركاتــه

التطبيق هذه المرة سيكون عبارة عن الة حاسبة بسيطة بأربع عمليات

post-47438-1226414706_thumb.jpg

الجديد هو التعامل مع ال Combo Box

وهو الذي سيحوي على اسماء العمليات.

- كون مشروع جديد و انتقل الى ال Qt Designer .

- اضف 2 labels ,, 2 Line Edit ,, ComboBox ,, Push Button

- اضغط بالزر الايمن على ال combo box و اختر Edit Items

post-47438-1226414727_thumb.jpg

من النافذة التي ستظهر اضغط على علامة + لأضافة عنصر جديد ،، اضف اربع عناصر كما في الصورة

post-47438-1226414738_thumb.jpg

اخزن البرنامج وانتقل الى QDevelop ..

في ملف الهيدر اضف ..

post-47438-1226414749_thumb.jpg

وفي ملف السورس

اضف الكود

post-47438-1226414763_thumb.jpg

void DialogCalc::calcResult()
{
long Num1,Num2;
Num1 = txtNum1->text().toLong();
Num2 = txtNum2->text().toLong();
if(comboBox->itemText(comboBox->currentIndex()) =="Add")
QMessageBox::information(this ,"Result",QString::number(Num1 + Num2));
else 
if(comboBox->itemText(comboBox->currentIndex()) =="Sub")
QMessageBox::information(this ,"Result",QString::number(Num1 - Num2));
else 
if(comboBox->itemText(comboBox->currentIndex()) =="Mul")
QMessageBox::information(this ,"Result",QString::number(Num1 * Num2));
else
if(comboBox->itemText(comboBox->currentIndex()) =="Div")
QMessageBox::information(this ,"Result",QString::number(Num1 / Num2));
}

في هذه الدالة ،، اولا نحول القيمة المدخلة من string الى قيمة عددية عن طريق استخدام الدالة toLong() ،

من ال Assistant ،، هذه الدالة

long QString::toLong ( bool * ok = 0, int base = 10 ) const
Returns the string converted to a long using base base, which is 10 by default and must be between 2 and 36, or 0. Returns 0 if the conversion fails.
If a conversion error occurs, *ok is set to false; otherwise *ok is set to true.
If base is 0, the C language convention is used: If the string begins with "0x", base 16 is used; if the string begins with "0", base 8 is used; otherwise, base 10 is used.
Example:
	 QString str = "FF";
	 bool ok;
	 long hex = str.toLong(&ok, 16);	 // hex == 255, ok == true
	 long dec = str.toLong(&ok, 10);	 // dec == 0, ok == false

ثم بعد ذلك نحدد أي عملية مختارة و على اساسها نقوم اما بالجمع او الطرح او ...

وعندما نعرض القيمة نعيد تحويلها الى string ثم نعرضها ب MessageBox ،،

التحويل الى string عن طريق QString::numbe .

مشكوووووووووووووور جدااااااااااا علي الافادة بجد الدرس اكتر من رائع

ربنا يكرمك ويوفقك

#42

السلام عليكم ورحمة الله وبركاته

أخى فعلا موضوع جميل جدا

وأرجوا منك الأستمرار لأنى مبتدأ فى ال c++ والكيو تى

ولا أفهم شئ من المواقع الاجنبية

فأرجوا منك أن تكمل دروسك

وأرجوا من الأخوة من لديهم خبرة فى ال QT

مساعدتى فى هذا الموضوع

/index.php?showtopic=245278

لا أستطيع أن أطبق الأسكاين على مشروع اخر من عملى

#43

السلام عليكم

يعطيك العافية اخي الكريم

هل هذا الدرس يمكن تطبيقة على الـ QT SYMBIAN

لكي يعمل على أجهزة ال (NOKIA) وشكراً ؟

.

#44

وعليكم السلام ورحمة الله وبركاته ،

بالطبع يمكن ذلك.

قم بتحميل اخر اصدار Qt SDK من الموقع http://qt.nokia.com لكي تحصل على نسخ كيوتي لسطح المكتب وللسمبيان وغيره.

#45

أخي الكريم لو تفضلت ماهو البرنامج الذي يجب تحميله هذا الموقع قمت بفتحه أكثر من مرة

ويوجد أكثر من برنامج للـ QT SDK

انا اعمل على ال visual studio 2010 ونظام التشغيل لدي هو vista

واريد البيئة التي من خلالها يمكنني تطوير برنامج لأجهزة النوكيا

بارك الله فيك ,...

تم تعديل هذه المشاركة بواسطة lo2i في 24 يوليو 2011 في 14:47

.

#46

لن تحتاج فيجوال ستديو ، هناك بيئة تطوير اسمها Qt Creator تأتي مع ال SDK .

التحميل لويندوز من هنا :

http://qt.nokia.com/downloads/sdk-windows-cpp-offline

الحجم هو 1.7 جيجا بايت.

وهذه محتويات ال SDK ، للمعلومية فقط .

Qt libraries version 4.7.3

Symbian and MeeGo simulators

Qt Creator IDE version 2.2.1

Qt Mobility version 1.1.3

Qt development tools

Remote compilers

#47

تمام ,, جاري التحميل

شكراً لك :)

.

#48

السلام عليكم

أولا مشكور أخي على الشرح

أما سؤالي هو أنه لدي QListView فكيف أضيف لها مجموعة أخرى من الخانات مثال هذه الصورة

Sans_titre.png

كما ترى هناك خانة المستخدم , و الحالة و المعرف الخ ...

سؤالي الثانى هو أنا أستعمل QStatusBar لكن ماذا أفعل كي أضيف واحدة أخرى

شكرا على المساعدة

#49

وعليكم السلام ورحمة الله وبركاته ،

اقتباس
أما سؤالي هو أنه لدي QListView فكيف أضيف لها مجموعة أخرى من الخانات مثال هذه الصورة

هذه الفئة QListView تعتمد على عرض البيانات الموجودة في model (مثلا QAbstractItemModel او اي من مشتقاتها) ، وبالتالي يجب عليك أولا تجهيز model بالبيانات التي تريدها وبالهيدر الذي تريده أيضا.

وفي بعض الحالات يكون استخدام QListWidget مناسب اكثر ، نظرا لان البيانات تكون بداخله ، لذلك اقترح لك التعامل مع QListWidget

اقتباس
سؤالي الثانى هو أنا أستعمل QStatusBar لكن ماذا أفعل كي أضيف واحدة أخرى

غالبا يفضل وجود كائن واحد من هذه الفئة ، لكن أن اردت يمكنك استخدام QWidget بدلا من QMainWindow (والتي توفر لك كائن واحد فقط من هذه الفئة QStatusBar وتكون في اسفل النافذة) وانشاء ما تراه مناسب.

كحل مناسب يمكنك استخدام QMainWindow واستخدام ال QStatusBar الموجود ، وكذلك استخدام QToolBar وتحديد مكانه في الاسفل ، او استخدام QDockWidget ان اردت خصائص وتحكم افضل.

#50

شكرا لك على الرد أنا أستعمل QListView و أسستعمل كموديل QStandardItemModel و الذي هو بدوره مكون من مجموعة من QStandardItem أما أنا أريد أن أعرف كيف أصنع قائمة متعددة الخانات أو هل أستطيع القيام بها عن طريق QListWidget ؟؟

مواضيع مشابهة