Professional Documents
Culture Documents
C Pluse Pluse in QT
C Pluse Pluse in QT
ایٗ وشبة ثش ٌشفش ٝاص آٔٛصؽ ٞبی خٛة آلبی وبٔجیض اػذصاد ٜاػز عی كلجشی و ٝثب ایـ ٖٛؿذ لشاس ؿذ ٜوٝ
ایٗ وشبة سا ث ٝكٛسر pdfا٘شـبس ثذیٓ ایٗ وشبة وبٔال سایٍبٖ اػز
اٌش ٔـىّی ثٛد ثب ایٕیُ ٞبی ثبال سٕبع ثٍیشیذ سب دس اِٚیٗ فشكز اكالف ؿٛد اٌش ٓٞغّظ أالیی ٞؼز ثٝ
ثضسٌی خٛدس ٖٛثجخـیذ
ٔبیّٓ اص أشٚص عجك سؼبسیف ِ ٚیؼز ثٙذی روش ؿذ ٜدس ادأ ٝسٛضیلبر آٔٛصؽ ٞبیی س ٚثشای ثش٘بٔٛ٘ ٝیؼی
اسائ ٝثذیٓ ؤ ٝبیُ ثٛدْ دس ٚة ػبیز خٛدْ الذاْ ث ٝا٘شـبس آٔٛصؽ ٞب و ٓٙوٌ ٝفشٓ دس ا٘ؼٕٗ Qtثب C++
ٞبی ثش٘بٔٛ٘ ٝیغ ثبؿ ٝثیـشش ٔٛسد اػشفبد ٜلشاس ٔیٍیش ٜو ٝا٘ـبهلل ٕٞیٙغٛس ٓٞخٛاٞذ ثٛد
ٞذف اص ایٗ آٔٛصؽ ٞب آؿٙبیی ثب أىب٘بسی ٞؼز و ٝدس ٔQTیش٘ٛیٓ اػشفبد ٜوٙیٓ و ٝؿبُٔ وذ ٘ٛیؼی وٕشش /
خشٚػی ٚعشف ٞبی ثیـشش ٚدس ٟ٘بیز اػشفبد ٜدس دّشفشْ ٞبی ٔٛسد ٘ظش...
كبَ ٔٗ ِیؼشی اص آٔٛصؽ ٞب س ٚدس ٘ظش داسْ و ٝث ٝكٛسر صیش ؿشٚع ث ٝآٔٛصؽ خٛا ٓٞوشد.
ٔؼشفی ٚوبس ؿجى / ٝداّ٘ٛد فبیُ ثش اػبع دشٚسىُ ٞبی FTPٚ HTTP
٘ل ٜٛافضٚدٖ دیٍش وشبثخب٘ٞ ٝبی C++دس ٔلیظ ٚ Qt Creatorاػشفبدٕٞ ٜشا ٜثب وشبثخب٘Qtٝ
ٚاٌ ٝخذا ثخٛاد ثؼذ اص ث ٝاسٕبْ سػ٘ٛذٖ ایٗ ٔٛاسد ٔیشیٓ سٚی ٔجبكض كشف ٝای سش سب اعالػبر ػبٔغ سشی دس
ایٗ ساثغ ٝدس اخشیبس دٚػشبٖ لشاس ثذیٓ.
٘ؼخ Qt ٝثشای ایٗ آٔٛصؽ خٛاٞذ ثٛد : Qt 5.2ثب وبٔذبیّش MSVC2012.ٚ MinGW
ٕٞـٙیٗ آٔٛصؽ ٞبی الصْ ثشای اسسجبط ثشلشاس وشدٖ د IDE ٚلذسسٕٙذ C++یؼٙی ٚ VS2012 ٚ Qt
2013س ٚا٘ـباهلل آٔٛصؽ خٛا ٓٞداد.
اتتذا الزهِ تَضیحاتی در راتطِ تا ایٌکِ QTچیِ ٍ چرا تایذ ازش استفادُ کٌین رٍ هیذم:
ٕٞب٘غٛس ؤ ٝی دا٘یذ أشٚص ٜسٛػؼ٘ ٝشْ افضاس ٚث ٝسٚص سػب٘ی ٞبی آٖ دس ا٘ٛاع دّشفشْ ٞب اص لجیُ Linux ,
ٕٞ ٚ Windows , Mac OS Xـٙیٗ دّشفشْ ٞبی ٔٛثبیّی ٚسجّشی اص لجیُ Andoird , IOS ,
c + +با کیوتی آموزش |Page6
... ٚ Backberryثب ػشػز ثؼیبس صیبدی د٘جبَ ٔی ؿٛد ؛ ٕٞـٙیٗ آسصٚی اوظش ثش٘بٔٛ٘ ٝیؼبٖ ایٗ اػز وٝ
یه صثبٖ ٚیظ ٜثب سٕبٔی لبثّیز ٞب ٕٟٔ ٚشش اص ٕٝٞدـشیجب٘ی اص ٚ Objective Oriented
Performanceثبال سٕٞ ٚشا ٜثب یه ٕٝٞIDEوبس ٚ ٜػزاة دس اخشیبس داؿش ٝثبؿٙذ و ٝدس ایٗ
كٛسر ث ٝػبی سؼشث ٝوشدٖ سٕبٔی ٔلیظ ٞبی ثش٘بٔٛ٘ ٝیؼی دس ایٗ صٔیٞ ٝٙب دیـٟٙبد ٔیى ٓٙخیّی سا ٜدٚسی
٘شٚیذ صیشا ثب اػشفبد ٜاص ٔلیظ ثش٘بٔٛ٘ ٝیؼی Qtو ٝدـشـٓ ی ٝصثبٖ غِٛی ٔظُ ٚ C++اػشبد ٜسمشیجب ٕٝٞ
آسصٞٚبی ؿٕب دس ثش٘بٔٛ٘ ٝیؼی فشأ ٓٞی ؿٛد.
دس ساثغ ٝثب سٛا٘بیی ٞب ٚلذسر صثبٖ C++آؿٙب ٞؼشیذ ایٙى ٝیه صثبٖ ٔبدس $دبی #ٝاػز ٚخٛد ٔؼشمیٓ ثذٖٚ
ٔشىی ٚ ٚاثؼش ٝثٛدٖ ی ٝث ٝػیؼشٓ ػبُٔ یب صثبٖ ثش٘بٔٛ٘ ٝیؼی دیٍشی وبس خٛدؽ س ٚا٘ؼبْ ٔی دٞذ ,دس ایٗ ٔیبٖ
عی ایٗ ػبَ ٞب و ٝصثبٖ ٞبی ثش٘بٔٛ٘ ٝیؼی دیـشفش ٝثؼیبس صیبدی س ٚداؿشٙذ عٛسی و ٝثش٘بٔٛ٘ ٝیؼبٖ ث ٝساكشی
ٔیشٛا٘ٙذ سٛػظ صثبٖ ٞبی ٔظُ ... ٚ C#ثش٘بٔٞ ٝبی ٔٛسد ٘ظش خٛد سا دس وٕششیٗ صٔبٖ ثب ٔلیظ ٌ ٚشافیه لبثُ
سٛػٟی سِٛیذ وٙٙذ و ٝسٕبٔی ایٗ ٔٛاسد ثبػض ؿذ ٜثٛد صثبٖ C++اص ٘ظش ثش٘بٔٛ٘ ٝیؼبٖ ثی كٛكّ ٝیه صثبٖ
ػخز ٚخٛاػشبس كبَ كٛكّ ٝدسػز كؼبثی اص عشف ثش٘بٔٛ٘ ٝیغ ٔی ثبؿذ ثٙب ثش ایٗ دالیُ ػخشی ٕٞ ٚـٙیٗ
ػبد٘ ٜجٛدٖ عشاكی سٛػظ ایٗ صثبٖ ؿبیذ دِیّی ثشای وٓ سً٘ ؿذٖ ایٗ صثبٖ دس عشاكی ٚسِٛیذ فشْ ٞب ٚ
خشٚػی ٞبی لٛی ثٛد و ٝرسب ٞش وؼی و ٝثب ایٗ صثبٖ ٚالؼب وبس وشدٔ ٜیذا٘ذ و ٝؿٙیٗ ٘یؼز ! صیشا ث ٝسٟٙبیی
سىٕیُ ٚػبٔغ اػز فمظ ٚلز ٚوذ ٘ٛیؼی ثیـششی ثشای سِٛیذ خشٚػی ٞبی ٔـبث ٝدس صثبٖ ٞبی دیٍشی
ٕٞـ C# ٖٛسا داسد ؛ كبَ ؿىبس وٙیٓ ؟ آیب ثب ایٗ كبَ ثش٘بٔٛ٘ ٝیؼی ثب ػشػز وٓ دس ایٗ صثبٖ خٛاٞبٖ
خٛدؽ س ٚداس ٜ؟
ػٛاة ػٛاَ س ٚای ٍٝ٘ٛٙدبػخ ٔیذْ :اٚال ٘یبصی ٘یؼز ث ٝوذ ٘ٛیؼی صیبد ٚػخز ؿٕ٘ٛٞ ٖٛغٛس و ٝصثبٖ ٞبی
دیٍ ٝدس عی ایٗ ػبِٟب دیـشفز وشد ٜصثبٖ ٓٞ C++خبِی اص دیـشفز ٘جٛد٘ ٚ ٜؼجز ث ٝلجُ ثؼیبس سٛإ٘ٙذ ٚ
خٛد وفبػز ,دس ایٗ ٔیبٖ ٘ ٝسٟٙب دس ساثغ ٝثب لبثّیز ٞب ٔٛاسد صیبدی دس ٘ؼخٞ ٝبی 11ایٗ صثبٖ سفغ ٚسٛػؼٝ
داد ٜؿذ ٜاػز دس وٙبس ایٗ IDEثؼیبس ػزاثی و ٝث ٝداد ثش٘بٔٛ٘ ٝیؼبٖ ٔ ٚـشبلبٖ ایٗ صثبٖ أٚذ ٜث٘ ٝبْ ! Qtثب
آٚای $وی یٛر #یب ویٛر؛
ٕٝٞؿیض ػبد ٜسش ,سٚا٘شش ٚػزاثشش ؿذ ٚ ٜػشػز ثش٘بٔٛ٘ ٝیؼی ٚعشاكی فشْ ٞب ٚلبِت ثٙذی ٞبی دیـشفش ٝوٝ
لجال ٘یبص ث ٝوذ ٘ٛیؼی ٞبی ثؼیبس صیبدی داؿز ثؼیبس ثٟشش اص لجُ ؿذ ٜث ٝعٛسی و ٝث ٝػشئز ٔیش ٓ٘ٛثٍٓ ٔٗ
c + +با کیوتی آموزش |Page7
خٛدْ و ٝثؼیبس ػخز دؼٙذ ٞؼشٓ دس ٍ٘ب ٜا َٚوبس ثب Qtس ٚدؼٙذیذْ ,ایٗ ٔلیظ ثش خالف ٔلیظ ٞبی VS
ثٞ ٝیؾ ػٛٙاٖ ػیبػز ا٘للبسی ثٛدٖ س٘ ٚذاسد ٚفمظ ٚیٙذٚص ٘یؼز و ٝاص لذسسٕٙذسشیٗ IDEایٗ دٚس ٜصٔٝ٘ٛ
دـشیجب٘ی ٔیىٙذ ثّى ٝػیؼشٓ ػبُٔ ٞبی لذسسٕٙذ ی٘ٛیىؼی ٔظُ Mac OS X ٚ Linux Ubuntuایٗ ٔلیظ
ثش٘بٔٛ٘ ٝیؼی خبسق اِؼبد ٜس ٚوبٔال دـشیجب٘ی ٔیى ٚ ٗٙایٗ دس اثشذای وبس ث ٝسٟٙبیی اسصؿٕٙذ اػز.
اص لبثّیز ٞبیی وٕ٘ ٝیـ ٝاصؿ ٖٛث ٝایٗ ساكشی ؿـٓ دٛؿی وشد ٔی سٛاٖ ث ٝلبثّیز Cross platformثٛدٖ
ثش٘بٔٞ ٝبی سِٛیذ ؿذ ٜسٛػظ C++/Qtاؿبس ٜوشد و ٝؿٕب ث ٝساكشی ٔیش٘ٛیذ خشٚػی س ٚدس ػیؼشٓ ػبُٔ
ٔٛسد ٘ظشس ٖٛدسیبفز ٚوبٔذبیُ وٙیذ كشی ػیؼشٓ ػبُٔ ٞبیی ٔظُ Android ٚ IOSو ٝأشٚص ٜثش٘بٔٝ
٘ٛیؼی ٔٛثبیُ ٓٞیؼٛسایی ثبصاسؽ ٌشٔٝ
قاتلیت ّا در طراحی :لبثّیز عشاكی فٛق اِؼبد ٜثب ٕٞ ٚ QMLـٙیٗ دـشیجب٘ی اص HTML ٚ CSSیىی
دیٍ ٝاص ٔضایبی ٞ Qtؼشؾ ؤ ٝیش٘ٛیذ ثش٘بٔش ٖٛس ٚثششو٘ٛیذ ٔظال فشم وٙیذ یه فشْ عشاكی ٔیىٙیذ دس كبِز
ػبدی خبِی اص ٚ styleافىز ٞبی ٚیظٞ ٜؼز ثشای ایٗ وبس ٔیش٘ٛیذ ثب اػشفبد ٜاص CSS ٚ HTMLثش٘بٔشٖٛ
س ٚث ٝعٛس ؿٍفز اٍ٘یضی عشاكی وٙیذ.
اػشفبد ٜاص لبثّیز ٞبی HTMLیىی اص ثٟششیٗ ٚػزاثششیٗ ٔٛاسدی ٔیش ٝ٘ٛثبؿ ٝو ٝدس ثش٘بٔٛ٘ ٝیؼی
Mobile ٚDesktopخیّی خیّی ػزاة خٛاٞذ ثٛد ٕٝٞایٗ لبثّیز ٞب دػز ث ٝدػز ٔ ٓٞیذٖ سب ثش٘بٔٝ
٘ٛیغ ػخشی ٞبی C++س ٚفشأٛؽ و ٚ ٝٙثب ػالل ٝسٕبْ ثش٘بٔؾ س ٚعشاكی ٚدس ٟ٘بیز سی ٞش دّشفشٔی وٝ
دٚػز داس ٜوبٔذبیُ و.ٝٙ
یِ چکیذُ کلی از تعریف ایي هحیط :دیٍ٘ ٝیبصی ٘خٛاٞذ ثٛد ثشیٗ ػشاؽ Objective-Cثشای سِٛیذ
٘شْ افضاس ٞبی MAC OS X ٚ IOSیب ٘یبصی ٘یؼز ثشیذ ػشاؽ Javaثشای سِٛیذ ٘شْ افضاس ٞبی Android
یب ٘یبصی ٘یؼز ثشیذ ػشاؽ صثبٖ ٞبی ثذثخشی ٔظُ VBیب C#ثشای سِٛیذ ثش٘بٔٞ ٝبی ٚیٙذٚصی ! ٚدس ٟ٘بیز
٘یبصی ٘یؼز فمظ ٔؼجٛس ثبؿیذ ثشای كٙؼز ػخز افضاس اص C++اػشفبد ٜوٙیذ ثّى ٝثب داؿشٗ ػّٓ یه صثبٖ
لذسسٕٙذی ٔظُ ٔ C++یش٘ٛیذ ثب یه سیش ؿٙذیٗ ٘ـبٖ سٕٞ ٚـیٗ ثض٘یذ و ٝخذا ثذا٘ذ و ٝؿ ٝؿٛد!!!
یبدْ ٘ش ٜثٍٓ ؤ ٝیش٘ٛیذ عشاكی ٚة ٓٞداؿش ٝثبؿیذ ٞبٔٙظٛسْ اص ٕٝٞوبس ٜثٛدٖ یؼٙی ٚالؼب ٕٝٞوبسػز
c + +با کیوتی آموزش |Page8
دغ ؿذ یبد ٌیشی صثبٖ ٚC++آؿٙبیی ثب ٔلیظ Qtو ٝیه ٘ٛع فشیٓ ٚسن ٚیظ ٜای ثشای ایٗ صثبٖ اػز
ثش٘بٔش ٖٛس ٚثششو٘ٛیذ كبال ثب دس ٘ظش داؿشٗ ایٙى ٝاعالػبر HTML , CSS , QML , JavaScriptسٚ
ٓٞداسیذ دیٍ ٝؿ ٝثٟشش ٞشعٛس ؤٟ ٝشث٘ٛشٔ ٖٛی خٛاد ٔب٘ٛس ثذیٗ و ٝدس ٟ٘بیز ٔٙؼش ث ٝیه خشٚػی ٔمبثُ
ٔیـٛد :لذسر ,ػشػز ,ویفیز ,اسسجبط ٔؼشمیٓ ثب ػخز افضاس ! ٚدس وٙبس ایٗ ٔلیظ ثب ویفیز ثبال ٕٞ ٚـٙیٗ
عشاكی ٔذسٖ ٕٝٞ ٚ ٕٝٞدس خشٚػی ٟ٘بیی ثش٘بٔ ٝؿٕب كغ خٛاٞذ ؿذ.
قثل از ضرٍع کار تْترُ تَضیحاتی در راتطِ تا ایٌکِ کذام ٍیرایص از Qtرٍ تایذ داًلَد کٌیذ
رٍ تذم تِ صَرت زیر:
٘ىش: ٝثشای اػشفبد ٜاص ٔ Qtب د ٚسٚؽ داسیٓ و ٝدس ایٗ د ٚسٚؽ یىیؾ سایٍبٖ ٞؼز ٚیىیؾ ؿبُٔ ٞضیٝٙ
ای دس ساثغ ٝثب ِیؼب٘غ ٞ IDEؼشؾ ,دس ساثغ ٝثب ایٗ دٛٔ ٚسد ثبیذ ثٍٓ ٞیؾ سفبٚسی آٖ ؿٙب٘ی ثیٗ ایٗ د٘ ٚؼخٝ
دِٛی ٚسایٍبٖ ٚػٛد ٘ذاس ٜث ٝػض ٘ٛع وبٔذبیُ ا ٖٚو ٝدس ٘ؼخ ٝدِٛی ؿٕب ٔیش٘ٛیذ خشٚػی staticثٍیشیذ ٚ
سٟٙب دس كٛسر دشداخز ٞضیٔ ٝٙیش٘ٛیذ ثش٘بٔش ٖٛدس كبِز Staticس ٚث ٝفشٚؽ ثشػ٘ٛیذ ,فؼال ٔیشیٓ ػشاؽ
٘ؼخ ٝسلز ٔؼٛص LGPLو ٝث ٝؿٕب اػبص ٜوبٔذبیُ ث ٝكٛسر دایٙبٔیىی سٔ ٚیذ.ٜ
حاال از کجا داًلَد کٌین ٍ کذٍم ًسخِ رٍ تایذ داًلَد کٌین تِ صَرت زیر ّستص:
ٔب دس ثخؾ داّ٘ٛد ػبیز سػٕی Qtا٘ٛاع ٔخشّفی اص ٚیشایؾ ٞبی ا ٖٚسا ٔیجیٙیٓ و ٝدس ِیٙه سػٕی ٔٛػٛد
ٞؼز:
http://qt-project.org/downloads
c + +با کیوتی آموزش |Page9
لجُ اص ٕٝٞؿیض ثبیذ ػیؼشٓ ػبّٔی و ٝؿٕب سٚی ا ٖٚوبس ٔیىٙیذ سٔ ٚـخق وٙیذ ٞشؿٙذ االٖ 99دسكذ سٚی
ٚیٙذٚص وبس ٔیىٙیذ ِٚی ٚلشی دیٍ ٝاػٓ ٔC++یبد ٚػظ سٛس ٚخذا ِٚؾ وٙیذ ایٗ ػیؼشٓ ػبُٔ س ٚثشیذ سٚی
Linuxیىٓ ث ٝخٛدس ٖٛسغییش سلٛالر ثذیٗ ٓٞاص ِلبػ سٚكی سبطیش داس ٓٞ ٜسؼشثٔ ٝیىٙیذ ٚایٗ خٛث.ٝ
ث ٝعٛس وّی ٔؼٙی ػٛٙاٖ ِیٙه ٞبی لبثُ دسیبفز ث ٝكٛسر ٔمبثُ صیش ٔؼٙی ٔیـٛد:
ٔظال ) : Qt 5.3.0 for Windows 64-bit (VS 2013, OpenGL, 589 MBیؼٙی ؿی ؟
خت Qt 5.3.0و٘ ٝبْ ٘ ٚؼخ ٝثش٘بٔٞ ٝؼز ٛ٘ ٖٕٛٞ for Windowsع ػیؼشٓ ػبُٔ ٞؼز و ٝسٚؽ
ثبیذ ٘لت وٙیذ ٔ 64-bitؼٕبسی ػیؼشٓ ػبُٔ ٘لت ؿذٞ ٜؼشؾ دلز وٙیذ ؿبیذ CPUؿٕب 64ثیشی ثبؿٝ
ِٚی اٌ٘ ٝؼخ32 ٝثیشی ػیؼشٓ ػبُٔ س٘ ٚلت وشدیٗ ثبیذ دس ایٗ كبِز 32ثیشی Qtس ٚدسیبفز ٘ ٚلت وٙیذ
ٚ! VS 2013یب ٛ٘ MinGW 4.8ع وبٔذبیّش ٕٞشا ٜثب ٞ Qtؼشؾ ٛٔ ٚسد آخش اٌ OpenGL ٝسٚ
٘ؼخ ٝؿٕب ثبؿ ٝیؼٙی Qtؿٕب اص ٓٞ OpenGLدـشیجب٘ی ٔیى.ٝٙ
دس كٛسسی و ٝاص سیستن عاهل ٍیٌذٍز اػشفبدٔ ٜیىٙیذ ٘ؼخٞ ٝبی Qt 5.3.0 for Windowsسٚ
ثبیذ دسیبفز ٘ ٚلت وٙیذ.
دس كٛسسی و ٝاص سیستن عاهل لیٌَکس ) (Ubuntuاػشفبدٔ ٜیىٙیذ ٘ؼخٞ ٝبی Qt 5.3.0 for
Linuxس ٚثبیذ دسیبفز ٘ ٚلت وٙیذ.
دس كٛسسی و ٝاص سیستن عاهل هکیٌتاش ) (Mac OS Xاػشفبدٔ ٜیىٙیذ ٘ؼخٞ ٝبی Qt 5.3.0 for
Macس ٚثبیذ دسیبفز ٘ ٚلت وٙیذ.
كبال سٛضیلبر دس ثبس ٜػضئیبر ٘ؼخٞ ٝب ثشای داّ٘ٛد ٘ :ؼخٞ ٝبی 32ثیشی ٔ ٖٕٛٞؼٕبسی ٞ x86ؼشٙذ ٘ ٚؼخٝ
ٞبی 64ثیشی ٕٟٔ ٖٕٛٞ ٓٞبسی ٞ x64ؼشٙذ.
دس كبِز ػبدی ؿٕب ٔیش٘ٛیذ سٚی ػیؼشٓ ػبُٔ ٞبی دػىشبدی وبس وٙیذ ٚثش٘بٔش ٖٛس ٚوبٔذبیُ وٙیذ ِٚی اٌ٘ ٝیبص
ث ٝوبٔذبیُ ثش٘بٔ ٝسٚی ػیؼشٓ ػبُٔ ٞبی Android ٚ IOSداسیذ ثبیذ ٘ؼخٞ ٝبی صیش س ٚداّ٘ٛد وٙیذ :
c + +با کیوتی آموزش | P a g e 10
ثشای ٔ Androidیش٘ٛیذ اص ٘ؼخ Qt 5.3.0 for Android Windows ٝثشای اػشفبد ٜدس
ٔلیظ ٍیٌذٍز داّ٘ٛدؽ وٙیذ.
ثشای ٔ Androidیش٘ٛیذ اص ٘ؼخ Qt 5.3.0 for Android for Linux ٝثشای اػشفبد ٜدس
ٔلیظ لیٌَکس داّ٘ٛدؽ وٙیذ.
ثشای IOSكشٕب ثبیذ ػیؼشٓ ػبُٔ ٔه داؿش ٝثبؿیذ ٘ ٚؼخ Qt 5.3.0 for iOS ٝس ٚداّ٘ٛد وٙیذ ٕٞ ,ـٙیٗ
ٔیش٘ٛیذ Qt 5.3.0 for Androidس ٓٞ ٚثشای وبٔذبیُ ثشای ا٘ذسٚیذ دس ٔلیظ ٔه داّ٘ٛد وٙیذ ٚیب ٞش
دٚی ٝایٟٙبسٔ ٚیش٘ٛیذ ث ٝكٛسر Qt 5.3.0 for Android and iOSدسیبفز وٙیذ.
یه ٘ىش : ٝؿ ٖٛػیؼشٓ ػبُٔ Mac ٚ IOSثذسش اص ٔبیىشٚػبفز ا٘للبس عّت ٞؼشٙذ ثٕٞ ٝیٗ خبعش ثشای
وبٔذبیُ ثش٘بٔٞ ٝبی Mac ٚ IOSكشٕب ثبیذ ػیؼشٓ ػبُٔ ٔه داؿش ٝثبؿیذ سب ثش٘ٛیذ ثش٘بٔٞ ٝبی ٔشثٛط ثٝ
Appleس ٚوبٔذبیُ وٙیذ.
سٛػ : ٝالصْ ٘یؼز ؿٕب ثشای ٞش وذاْ اص دّشفشْ ٞب دٚثبسٛ٘ ٜیؼی ٚوذ ٘ٛیؼی ٔؼذد ا٘ؼبْ ثذیٗ خیبِش ٖٛساكز
ؿٕب ٔیش٘ٛیذ ثشای ؿشٚػجشای ٚیٙذٚص یب ِیٛٙوغ ی٘ ٝؼخٛٔ ٝسد ٘ظش س ٚدسیبفز وٙیذ ٚثش٘بٔش ٖٛس ٚثٛٙیؼیذ دس
ٟ٘بیز و ٝدیذیٗ ٘یبص ٞؼز سٚی ػیؼشٓ ٞبی ٔظُ MAC ٚ IOSیب Androidوبٔذبیُ ٚآصٔبیؾ وٙیذ
اٛ٘ٚلز ثٟشش٘ ٜؼخٔ ٝشثٛع ٝس ٚدسیبفز ٚدشٚط ٜخٛدس ٖٛس ٚثٚ ٝػیّ٘ ٝؼخٛٔ ٝسد ٘ظشس ٚ Import ٖٛوبٔذبیُ
ٕ٘بییذ.
كبال دس ایٗ آٔٛصؽ ٔٗ للذ داسْ اص ٘ؼخٞ ٝبی ٚیٙذٚصی اػشفبد ٜو ٓٙسب ساكز سش ثش٘ٛیذ اصؽ اػشفبدٜ
وٙیذ$.دس ساثغ ٝثب ٘لجؾ دس ٚیٙذٚص سٛضیلبسی ٕ٘یذْ ؿ ٖٛساكشِٚ ٝی ثشای ِیٛٙوغ ثؼذ اص اسٕبْ آٔٛصؽ ٞب
دػشٛسار ٚػّٕیبر الصْ س ٚخٛاٌ ٓٞفز و ٝؿغٛس ٞؼشٙذ(
خت ثشای ؿشٚع ٘ؼخQt 5.3.1 for Windows 32-bit (MinGW 4.8.2, OpenGL, 734 MB) ٝ
یب ٔیش٘ٛیذ ایٗ س ٚداّ٘ٛد وٙیذ)Qt 5.3.1 for Windows 32-bit (VS 2013, 626 MB
فمظ اٌ٘ ٝؼخ VS2010 ٝیب ٚ VS2012یب 2013س ٚداّ٘ٛد ٔیىٙیذ كشٕب ثبیذ ٔ Visual Studioشثٛط ثٝ
ا٘ ٖٚؼخ ٝیب ٞ SDKبی ٔشثٛع ٝسٚی ػیؼشٕش٘ ٖٛلت ثبؿ.ٝ
c + +با کیوتی آموزش | P a g e 11
ٔٗ اص وبٔذبیّش MinGWاػشفبدٔ ٜیىٙیٓ راسب ٔظُ VSخیّی دش دسدػش ٘یؼز ثشا ٕٞیٗ!
دسساثغ ٝثب ِیٛٙوغ ٔ ٚخلٛكب ٓٞ Ubuntuث ٝسٚؽ صیش ػُٕ وٙیذ :ثش فشم ایٙى ٝفبیُ qt-
opensource-linux-x64-5.3.0.runس ٚداّ٘ٛد وشد ٜثبؿیذ اٌش لشاسؽ ثذیٗ دس دٛؿٝ
ٚDownloadsدػشٛس صیش س ٚس Terminal ٛثٛٙیؼیذ :
cd /home/USER/Downloads
ث ٝػبی ایٗ USERو ٝایٙؼب یٛصس ٔٗ ٞؼز یٛصسی و ٝس ٚػیؼشٓ خٛدسٞ ٖٛؼز س ٚثٛٙیؼیذ اِجش ٝدلز وٙیذ
لجّؾ ثبیذ سٛػظ su -سٚر ؿذ ٜثبؿیذ!
./qt-opensource-linux-x64-5.3.0.run
root@USER-Aspire-4720Z:/home/USER/Downloads# ./qt-opensource-
linux-x64-5.3.0.run
ٚدس ٔشاكُ ثؼذی Wizardثشای ٘لت ٔیبد ثبال ٚثمیٔ ٝشاكّؾ ٕٞب٘ٙذ آٔٛصؽ ٞبی ٚیٙذٚصی ٞؼشؾ.
c + +با کیوتی آموزش | P a g e 12
ٔیشیٓ ػش اكُ ٔغّت ٚوبس ثب ٚ Qtسٛضیلبر دس ساثغ ٝثب ا٘ٛاع دشٚطٞ ٜب
ثشای ؿشٚع ثٛٙٔ ٝی ٌ ٚ Fileضیٔ New File or Project ٝٙشاػؼ ٝوٙیذ.
c + +با کیوتی آموزش | P a g e 13
كبال دس ایٗ لؼٕز ؿٕب ا٘ٛاع دشٚطٞ ٜب ٚفبیُ ٞبیی ؤ ٝیش٘ٛیذ سٛػظ Qtایؼبد وٙیذ ثب سٛػ ٝث٘ ٝؼخ ٝای وٝ
٘لت وشدیٗ فؼبَ ٚلبثُ ا٘شخبة ٞؼشؾ و ٗٔ ٝدس ایٗ أٛصؽ ٞب اص دشٚطQt Widgets Application ٜ
اػشفبدٔ ٜیى ٚ ٓٙسمشیجب ٔیـٌ ٝفز اػشب٘ذاسدسشیٗ كبِز دشٚط ٜثشای عشاكی فشْ ٞؼز ثب ثمیٛٔ ٝاسد اص لجیُ Qt
Consoleیب ...فؼال وبسی ٘ذاسیٓ.
كبَ ثب ادأ ٝایٗ ٔشكّ ٝث ٝكٛسر صیش ٘بْ دشٚطٔ ٚ ٜؼیشی ؤ ٝبیُ ٞؼشیذ دشٚط ٜدس أ ٖٚىبٖ رخیش ٜثـ ٝسٚ
ا٘شخبة وٙیذ
c + +با کیوتی آموزش | P a g e 14
خت دس ایٗ ٔشكّ ٝؿٕب ٔیش٘ٛیذ ٘ٛع والع ٕٞ ٚـٙیٗ ٞیذس ٞبسٔ ٚـخق وٙیذ عجك سلٛیش صیش ادأ ٝثذیٗ:
c + +با کیوتی آموزش | P a g e 15
دس ٟ٘بیز سبییذ وٙیذ سب دشٚط ٜؿٕب ث ٝكٛسر سلٛیش صیش ایؼبد ثـ:ٝ
خت سب ایٙؼب ٔب فمظ ی ٝدشٚط ٜاص ٘ٛع QtWidgetsایؼبد وشدیٓ و ٝؿبُٔ ٚ Main Windowوالع ٚ
ٞیذس ٞبی اػشب٘ذاسد ثشای ؿشٚع وبس ٚثش٘بٔٛ٘ ٝیؼی ٞؼشؾ.
c + +با کیوتی آموزش | P a g e 16
ثجیٙیذ دس دشٚطٞ ٜبی ٔ Qtب ؿٙذ ٘ٛع فبیُ دشٚط ٜای داسیٓ ثب دؼ٘ٛذ ٞبی .pro ٚ .priوٞ ٝش دٚی ایٗ فبیُ
ٞب سٛػظ Qtلبثُ ؿٙبػبیی ٞؼشٙذ ٚث ٝػٛٙاٖ فبیُ اكّی دشٚط ٜؿٕب دس ٘ظش ٌشفشٔ ٝیـ٘ٛذ.
اٌش سٚی فبیُ MyProject.proوّیه وٙیذ ث ٝكٛسر صیش ؿبُٔ وذ ٞبیی ٞؼشؾ:
#-------------------------------------------------
#
# Project created by QtCreator 2014-01-15T08:19:15
#
#-------------------------------------------------
TARGET = MyProject
TEMPLATE = app
\SOURCES += main.cpp
mainwindow.cpp
! فشأٛؽ ٘ىٙیذ فبیُ .pro كبال ٔٗ ث ٝكٛسر صیش سٛضیلبسؾ سٔ ٚیذْ سب ٔشٛػٚ ٝػٛد ایٗ وذ ٞب ثـیذ
ٕٟٔششیٗ لؼٕز دشٚطٞ ٜؼشؾ و ٝدس فشاخٛا٘ی فبیُ ٞب ٚسفش٘غ ٞب ٔٔ ٕٟٝظال ٔٗ اٌ ٝثخٛاْ اص دیشبثیغ ٚ
اػشفبد ٜو ٓٙدس ایٗ لؼٕز ثبیذ ا َٚفشاخٛا٘یؾ و.ٓٙ دػشٛسار SQL
c + +با کیوتی آموزش | P a g e 17
#-------------------------------------------------
#
دشٚط ٜػبخش ٝؿذ ٜسٛػظ ویٛر دس سبسیخ ( # Project created by QtCreator 2014-01-15T08:19:15
)فالٖ
#
#-------------------------------------------------
QT ایٗ لؼٕز ٔشثٛط ث ٝفشاخٛا٘ی ٔٛاسد الصْ ٞؼز ی ٝؿیضی ٔظُ سفش٘غ ٌیشی دس ٚیظٚاَ اػشذی ٛو ٝث ٝكٛسر ( += core gui
)وذ ٘ٛؿشٔ ٝیـٝ
)و ٝدس ٚیظٚاَ اػشذی ٓٞ ٛدیذیٗ فشاخٛا٘ی ٔیى٘Namespace ٝٙبْ دشٚط ٜس ٚث ٝكٛسر ( TARGET = MyProject
TEMPLATE = app )لبِت ثٙذی(
\SOURCES += main.cpp
)ٞؼشؾ س ٚفشاخٛا٘ی ٔیىٙذ mainػٛسع اكّی و ٝؿبُٔ سبثغ ( mainwindow.cpp
FORMS )فبیُ ٚلؼٕشی و ٝؿبُٔ عشاكی ٞؼشؾ س ٚفشاخٛا٘ی ٔیىٙذ( += mainwindow.ui
خت ثؼذ اص ایٗ فبیُ ٔب ؿٙذ دٛؿ ٝث٘ ٝبٟٔبی Forms ٚ Headers , Sourcesداسیٓ و ٝث ٝكٛسر صیش
سٛضیلبسـٔ ٛ٘ٛیذْ.
دٛؿٚ Headers ٝظیف ٍٝ٘ ٝداسی سٕبْ فبیُ ٞبی C++اص ٘ٛع .hیب ٕٞبٖ hederس ٚثش ػٟذ ٜداسد.
دٛؿٚ Sources ٝظیف ٍٝ٘ ٝداسی سٕبْ فبیُ ٞبی C++اص ٘ٛع .cppیب ٕٞبٖ Sourceس ٚثش ػٟذٜ
داسد.
دٛؿٚ Forms ٝظیف ٍٝ٘ ٝداسی سٕبْ فبیُ ٞبی ٔشثٛط ث ٝعشاكی س ٚداس ٜدؼ٘ٛذ فبیُ ٞبی عشاكی دس ویٛر
ٞuiؼشٙذ ث ٝكٛسر mainwindow.uiو ٝفبیُ دیضایٗ دشٚط ٜؿٕب ث ٝػٛٙاٖ یه فشْ دس ٘ظش ٌشفش ٝؿذٜ
اػز.
c + +با کیوتی آموزش | P a g e 18
٘ىش ٗٔ : ٝللذْ ای ٝٙو ٝدس ػبد ٜسشیٗ كبِز آٔٛصؿش ٚاسائ ٝثذْ ث ٝخبعش ایٙى ٝافشاد ؿبوی اص وذ ٘ٛیؼی صیبد
C++وٕی دیذٌبٞـ ٖٛس ٚدس ساثغ ٝثب ایٗ صثبٖ سغییش ثذٖ ثذ ٘یؼزٔ ...خلٛكب ا٘ٚبیی ن ٔیٍٗ وی كٛكّٝ
داس ٜسٞ C++ ٛضاس خظ وذ ثٛٙیؼ ٝسب ی ٝدیغبْ ٕ٘بیؾ ثذ!!!ٜ
ػیٍٙبَ یب اػالر ٞب ؿیٗ ؟ ث ٝؿ ٝدسدی ٔیخٛسٖ ؟ ٔؼّٕب ؿٕب ثشای ایؼبد یه سخذاد دس یه صٔبٖ ثب اطش
ٌزاسی ثش سٚی یه وٙششَ یب Objectا٘شظبس ای ٛٙداسیٗ و ٝا ٖٚؿیء دس لجبَ فـشد ٜؿذٖ یب ٞش سٚیذاد دیٍٝ
ای یه ػىغ اِؼّٕی ٘ـ ٖٛثذٔ ٜظال سٚی یه دوٕ ٝای وّیه ٔیىٙیذ ا٘شظبس داسیذ ی ٝدیغبٔی دس سٚیذاد
Clickedإ٘ ٖٚبیؾ داد ٜثـٙٔ ٝظٛس اص Slot ٚ Signalدس ساثغ ٝثب ایٗ ٔؼبئُ ٞؼشؾ و ٝكبال دس ایٗ ٔیبٖ
ثشای كذا صدٖ اص Signalاػشفبدٔ ٜیىٙیٓ ٚاص Slotثشای دسیبفز دػشٛس ٚػُٕ وشدٖ.
ٔٗ للذ داسْ ثشای ؿشٚع وبس سٚی یه فشٔی 2سب دوٕ ٝایؼبد و ٚ ٓٙسٚی ایٗ دٚسب دوٕ ٝاص 2سٚیذاد
)(Clickedوّیه ؿذٖ اػشفبد ٜو.ٓٙ
خت ث ٝلؼٕز Formsدس دشٚط ٜثشیذ ٚسٚی فبیُ mainwindow.uiدٚثبس وّیه وٙیذ سب ٔلیظ
عشاكی فشٔش ٖٛس ٚثجیٙیذ ث ٝكٛسر صیش د ٚسب دوٕ ٝثب ػُٕ Drag and Dropسٚی فشْ خٛدْ ایؼبد ٔیىٓٙ
دس كٛسسی و ٝوبٔذبیُ ٚاػشا وٙیذ دوٕٞ ٝبی ایؼبد ؿذ ٜس ٚسٚی فشٔشٔ ٖٛیجیٙیذ ِٚی ثذٞ ٖٚیؾ ػّٕی !
c + +با کیوتی آموزش | P a g e 19
ثش خالف ٚ Visual Studioصثبٖ C#و ٝسٚی ٞ Objectب وّیه ٔیىٙیذ ٚسبثغ ٔشثٛط ث ٝسٚیذاد اٖٚ
ػبخشٔ ٝیـ ٚ ٝؿٕب ؿشٚع ٔیىٙیذ ث ٝثش٘بٔٛ٘ ٝیؼی دس Qtؿٙیٗ ؿیضی ٚػٛد ٘ذاس ٜدس وُ سٛی C++وّیه
وذ وذ ثٛٙیغ ثی ٔؼٙی ٝثبیذ و ٛٞٛثىٙی سب ثش٘ٛی دػشٛس ثذی ث ٝسٚیذاد ٞبِٚ ....ی ٔٗ ی ٝسٚؽ ػبد ٜسشی سٚ
ثٟشٔ ٖٛیٍٓ ث ٝكٛسر صیش سٚی وٙششَ ساػز وّیه ٔیىٙیٓ ٌ ٚضی Go to Slot ٝٙس ٚا٘شخبة ٔیىٙیٓ.
c + +با کیوتی آموزش | P a g e 20
خت كبال عجك سلٛیش صیش ٔـبٞذٔ ٜیىٙیذ و ٝسٕبْ سخذاد ٞبی ٔشثٛط ث ٝوٙششَ ٔٛسد ٘ظش ؿٕب لبثُ ا٘شخبة
ٞؼشٙذ ٔب دس ایٗ ثخؾ الصٔ ٝاص سٚیذاد Click ٜاػشفبد ٜوٙیٓ دغ سٚؽ وّیه وٙیذ ٚثشیذ ٔشكّ ٝثؼذ.
c + +با کیوتی آموزش | P a g e 21
خت كبال ایٙؼب سبثغ ٔشثٛط ث ٝػُٕ وّیه ؿذٖ سٚی ایٗ دوٕ ٝایؼبد ؿذ.ٜ
)(void MainWindow::on_pushButton_clicked
{
}
دس فبیُ mainwindow.hوذ صیش اضبف ٝؿذ ٜو ٝسؼشیف ٔ Slotشثٛط ث ٝوٙششَ ٔیجبؿذ.
private slots:
;)(void on_pushButton_clicked
ٔٙظٛس اص ٘ pushButtonبْ ٕٞبٖ دوٕ ٝای ٞؼشؾ و ٝسٚؽ وّیه ٔیـٔ ٝؼّٕب ٘بْ دوٕ ٝثؼذی
pushButton_2خٛاٞذ ثٛد ! ؿٕب ٔیش٘ٛیذ ایٗ سبثغ س ٚثذ ٖٚػّٕیبسی و ٝدس سلٛیش دیذیٗ ایؼبد ٚثٞ ٝش
یه اص وٙششَ ٞبی خٛدس ٖٛاخشلبف ثذیٗ.
كبال ایٗ ثخؾ ٔـخق وشد و ٝایؼبد ٞ Eventبی ٔشثٛط ث ٝوٙششِش ٞب ؿغٛس كٛسر ٔیٍیش ٜث ٝكٛسر وذ
٘ٛیؼی ایٗ سٚؽ ٞبسٔ ٚیـذ ثشیٓ ِٚی خٛاػشٓ ػبد ٜسشیٗ كبِشؾ س٘ ٚـ٘ٛش ٖٛثذْ سب ػٛم ا ٕٟٝ٘ٚوذ ٘ٛیؼی دس
C++ث ٝكٛسر ػبدی دس ثیبد.
با کیوتیc + + آموزش | P a g e 22
ٕ٘بیؾ ثذْ دغ عجكٕٝی ایٗ دوٚ ثب وّیه سٚ دیغبٔی سٝاْ یٛٓ ٔیخٙسایی وبُٔ وٛ یؼٚ ایٗ ثلض سٝىٙثشای ای
ٝ ثQMessageBox ؼشؾٞ رٛ دس ویٝٓ وٙا٘ی ٔیىٛ فشاخٚ سMessage یذسٞ اثشذاC++ ٗا٘یٛل
:سر صیشٛك
#include "qmessagebox.h"
:ٓیؼٛٙ دس داخُ سبثغ سخذاد وّیه ٔیٚ وذ صیش سٚ
QMessageBox msgBox;
msgBox.setText("Welcome to the Qt 5.2 , My name is Kambiz Asadzadeh");
msgBox.exec();
:ؼزٞ وبّٔؾ
void MainWindow::on_pushButton_clicked()
{
QMessageBox msgBox;
msgBox.setText("Welcome to the Qt 5.2 , My name is Kambiz Asadzadeh");
msgBox.exec();
}
: ٔظُ صیشٝػی ثـٚ خشShow Message ٕٝی دوٍٚبْ وّیه سٙٞ اػشاٚ ُخت كبال ثبیذ ثؼذ اص وبٔذبی
c + +با کیوتی آموزش | P a g e 23
للذ داسْ دس ساثغ ٝثب دٙؼشٞ ٜب یب ٕٞبٖ دیبِٛي ٞب یب دس صثبٖ ٞ Widgets ٖٕٛٞ Qtب سٛضیلبسی ثذْ.
عجك سٚاَ ػبدی یه دشٚط ٜث٘ ٝبْ MyWindowsایؼبد ٔیىٙیٓ و ٝدس كبِز ػبدی اٌ ٝسٛػ ٝوٙیذ دشٚطٜ
داسای یه MainWindowیب ٖٕٛٞفشْ اكّی ٞؼشؾ ایؼبد ٔیى.ٝٙ
كبَ ٔب ثشای ایٙى ٝاص فشْ ٞب ٚدیبِٛي ٞبی دیٍ ٝای دس دشٚطٔ ٖٛاػشفبد ٜوٙیٓ ثبیذ ؿىبس وٙیٓ ؟
خیّی ساكش ٝثشای ایٗ وبس سٚی دشٚط ٜیؼٙی MyWindowsساػز وّیه ٔیىٙیٓ ٌ ٚضی Add new ٝٙسٚ
عجك سلٛیش صیش ٔیض٘یٓ.
c + +با کیوتی آموزش | P a g e 24
دس ٔشكّ ٝثؼذ عجك سلٛیش صیش ٌضیٞ ٝٙبی ٔشٛٙػی س٘ ٚؼجز ث٘ ٝیبص وبسی سٚی دشٚط ٜدس اخشیبس لشاس ٔیذ ٜؤ ٝب
ٞذفٕ ٖٛػبخز فشْ یب ٖٕٛٞدٙشػشٞ ٜؼز ثشای ایٙىبس ث ٝؿبخٔ Qt ٝیشْ و ٝدس ایٙب لجُ اص ٞش ؿیض ثزاسیذ یٝ
سٛضیلی ثذْ...
ا٘ٛاع ٌضیٞ ٝٙبی ٔخشّفی ٚػٛد داس ٜوذ ٛٔٚثبیذ ا٘شخبة وٙیٓ ٚؿشا ؟ خت ثجیٙیذ ؿٕب ثش اػبع ٘یبص اٌش
ٔیخٛاٞیذ فشْ سِٛیذ ؿذ ٜؿٕب داسای ٞیذس ٚوالع اخشلبكی خٛدؽ ثبؿٔ ٝیش٘ٛیذ دس ٕٞیٗ ٔشكّ ٝا ٖٚس ٚسؼییٗ
c + +با کیوتی آموزش | P a g e 25
وٙیذ و ٝآیب ٞیذس ٚوالع ٔخلٛف فشْ ٔٗ ایؼبد ثـ ٝیب خیش ! دس اوظش ٔٛاسد الصٔ ٝدغ ٔٗ اص Qt
Designer Form classاػشفبدٔ ٜیى...ٓٙ
دس ٔشكّ ٝثؼذ عجك سلٛیش صیش ٔب ٔیش٘ٛیٓ ٘ٛع فشْ س ٚػشیؼب ا٘شخبة وٙیٓ و ٝو ٝفشْ دیبِٛي ثبؿ ٝیب فشْ ٔؼِٕٛی
ثبؿ ٚ ٝیب فشْ اكّی ؛ ؿ ٖٛللذ ٔب اػشفبد ٜاص ٞ Widgetsؼشؾ ٔٗ اص ٘ٛع ٚیذػز یب ٖٕٛٞفشْ ٔؼِٕٛی
اػشفبدٔ ٜیى.ٓٙ
c + +با کیوتی آموزش | P a g e 26
دس ٔشكّ ٝثؼذ ؿٕب ٔیش٘ٛیذ ث ٝكٛسر ػفبسؿی ٘بْ والع ٘ ,بْ ٞیذس ٘ ٚبْ فبیُ اكّی ٚفبیُ عشاكی س ٚسؼییٗ
وٙیذ و ٝدس خشٚػی ثش اػبع ٘بْ ا٘شخبة ؿذ ٜؿٕب ٔٛسد اػشفبد ٜلشاس ٔیٍیش ٜو ٝدس ایٗ آٔٛصؽ ٔٗ اػٓ فشْ
خٛدْ سٔ ٚیضاسْ ٚMyFormث ٝكٛسر صیش سبییذ ٔیى.ٓٙ
c + +با کیوتی آموزش | P a g e 27
كبال فشْ ٔب ایؼبد ؿذٔ ٚ ٜب ٔیش٘ٛیٓ اصؽ اػشفبد ٜوٙیٓ ثشای ایٙىٔ ٝغٕئٗ ثـیٓ ث ٝسلٛیش صیش ٍ٘بٞی وٙیذ دلیمب
عجك ٘بْ ٌزاسی ٚا٘شخبثی و ٝوشدْ ٓٞفبیُ عشاكی ٓٞ ٚفبیُ ٞبی اكّی ٞ ٚیذس ٕٞشا ٜثب والع ٞبی ٔشثٛط
داخّی ایؼبد ؿذ ٜا٘ذ.
c + +با کیوتی آموزش | P a g e 28
خت كبال فشْ ٔب سب ایٙؼب ایؼبد ؿذٔ ٗٔ ٜیخٛاْ فشٔٓ س ٚداخُ فشْ اكّی سٛػظ ػُٕ وّیه ؿذٖ سٚی یه
وٙششَ دوٕ (Button) ٝفشاخٛا٘ی ٕ٘ ٚبیؾ ثذْ.
ثبیذ ؿىبس وٙیٓ ؟ ٔٗ ٔیخٛاْ دس فشْ اكّی ی ٝدوٕ ٝای ایؼبد و ٚ ٓٙدس سٚیذاد وّیه ؿذٖ ا ٖٚفشْ د ْٚخٛدْ
یؼٙی MyFormس ٚكذا ثض٘ٓ سب Showثـ.ٝ
دغ یب ث ٝكٛسر ػشیغ اص ٚ Got to Slotوّیه اػشفبدٔ ٜیى ٓٙسٚی دوٕ ٝایؼبد ؿذ ٚ ٜیب دس فبیُ ٞیذس
فشْ اكّی ایٗ وذ سٔ ٚیٛٙیؼٓ.
)(void MainWindow::on_pushButton_clicked
{
با کیوتیc + + آموزش | P a g e 29
كذا ثض٘ٓ ؿىبس ثذیذٚٔٓ سٚاْ فشْ دٛ كبال ٔٗ ثخٝٙ ایؼبد ٔیىٚیذاد وّیه سٚؽ ایٗ وذ سٚ سٚش دٞ دس
...ٓٙو
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
}
.ْ ٕ٘بیؾ ثذٛ٘ٚ اٚ ْ ثؼذ اصؽ وذی ثؼبصٚ ٓٙ وبسایی وْٝ ثبیذ یٚبػبیی فشْ دِٙی ثشای ؿٚ ّٝ ؿیض كٕٝٞ
:ٓ ثب ایٗ وذٙد وّٛىٙ ثبیذ ایْٚ سٚیذس فشْ دٞ دغ اثشذا
#include "myform.h"
:ٓیؼٛٙ ٔیٚبیز دس سبثغ وّیه وذ صیش سٟ٘ دسٚ
void MainWindow::on_pushButton_clicked()
{
}
: سر صیشٛ كٝ ثٝوذ اكّی وّی ٔیـ
با کیوتیc + + آموزش | P a g e 30
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "myform.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
}
:سر صیشٛ كٝ ثٝ ٔیـٕٝی دوٚٓ ثؼذ اص وّیه سٞ ػیٚخش
c + +با کیوتی آموزش | P a g e 31
قسوت پٌجن ٔ :ؼشفی ٚوبس ثب الیٞ ٝب صثب٘ٞ ٝب ٚثذ٘ٞ ٝبی دس عشاكی
دس ایٗ ٔشكّ ٝدس ساثغ ٝثب الیٞ ٝبی عشاكی ٚأىب٘بر سٛضیلبسی ثذْ و ٝعجك سٚاَ لجّی دشٚط ٜای ایؼبد
ٔیىٙیٓ ث٘ ٝبْ ٔ ٚ MyGuiیشیٓ ػش اكُ ٔغّت...
خت عجك سلٛیش صیش ٔب ی ٝلؼٕشی داسیٓ و ٝث ٝكٛسر خیّی ساكز أىب٘بر الی ٝث ٝالی ٝدس اخشیبس ٔب ٔیضاس:ٜ
c + +با کیوتی آموزش | P a g e 32
گسیٌِ Edit Widgets :دس كبِز وّی ٚلشی الصٔ ٝاثضاس ٞب ٚوٙششَ ٞبیی س ٚسٚی فشْ لشاس ثذیٓ یب ثٝ
عٛس ػبد ٜثخٛاْ ثٍٓ ٚلشی ٘یبص ثبؿ ٝسٚی فشٔش ٖٛؿیئی س ٚدسع وٙیذ كشٕب ثبیذ دس ایٗ الی ٝوبس وٙیذ.
گسیٌِ Edit Signals/Slots :ث ٝكٛسر وّی ایٗ الیٚ ٝظیف ٝدس اخشیبس ٌزاؿشٗ ػشیغ دػششػی ٞبی
ٔشثٛط ثٞ Signal ٝب ٞ Slot ٚب س ٚدس اخشیبس ؿٕب ٔیضاس ٜو ٝثب ػُٕ Drop ٚ Dragاؿیبء سٚی ٕٞذیٍٝ
ٔشاكُ ثؼذیؾ ٕ٘بیبٖ ٔیـٛد.
گسیٌِ Edit buddies :ایٗ الی ٝأىبٖ سٙظیٓ ا٘ذاص ٜفشْ س ٚثشاس ٖٛفشأ ٓٞیى.ٝٙ
گسیٌِ Edit tab order :دس ایٗ الی ٝاص عشاكی ؿٕب ٔیش٘ٛیذ ث ٝساكشی ؿٕبس ٜایٙذػه یب ٕٞبٖ
Index numberاخشلبكی ٞش یه اص اؿیبئ س ٚسٚی فشْ ٔـخق وٙیذ و ٝثب ػُٕ ٘ Tabیض ثش اػبع
اِٛٚیز ا٘شخبة ٔی ؿ٘ٛذ.
ی٘ ٝىش ٟٓٔ ٝدس ٚ Qtػٛد داس ٜا ٓ٘ٚای ٝٙو ٝػّٕیبر Drop ٚ Dragثش خالف ٞ IDEبی دیٍ ٝأىب٘بر
ثؼیبس صیبدی س ٚثشای ساكشی وبس ایؼبد ٔیىٙٙذ.
c + +با کیوتی آموزش | P a g e 33
ٕٞب٘غٛس ؤ ٝیذ٘ٚیذ أشٚص ٜداؿشٗ ٌشافیه ٚعشاكی ٞبی دسػز كؼبثی سٚی ٘شْ افضاس ٘ٛیؼی خٛدؽ یىی
اص ٕٟٔششیٗ لؼٕز ٞبی سِٛیذ یه ثش٘بٔٞ ٝؼشؾ و ٝاوظشا ث ٝخبعش ای دِیُ و C++ ٝس ٚفمظ یه ٔلیظ
ٔConsoleیذ ٗ٘ٚػشاؽ ایٗ صثبٖ ٘یٔٛذٖ ٕ٘یذ ٓ٘ٚؿشا ؿبیذ ثشاؿ ٖٛػخش ٝیب ؿبیذْ اعالػبر وبفی ٘ذاسٖ...
ِٚی دس وُ اٌ ٝثب صثبٖ ٞبی ساكشی ٔظُ C#وبس وشدیٗ ٔیذ٘ٚیذ و ٝثشای عشاكی فٙبٚسی ٞبیی ٔظُ WPF
س ٚداس٘ذ و ٝثؼبی CSSاص XAMLاػشفبدٔ ٜیى ٚ ٝٙدس ٘ٛثز خٛدؽ دس عشاكی ویفیز خٛثی س ٚدس
خشٚػی اسائٔ ٝیذ.ٜ
ِٚی ٞشؿی ثبؿ ٝخٛدسٔ ٖٛیذ٘ٚیذ عشف ٞبیی و ٝدس ثش٘بٔٞ ٝبی سلز ٚة سِٛیذ ٔیـٗ ٕٞـ ٖٛث ٝوٕه CSS
ٞ HTML ٚؼشؾ ٕٞ ٚـٙیٗ ... ٚ JavaScriptكبال اٌ ٝایٗ فٙبٚسی ٞب سٚی دّشفشْ ٞبی دػىشبدی ثبؿٝ
ؿی ٔیـ ٝ؟ ٔؼّٕب یىی ٔٗ خٛدْ خیّی خٛؿلبَ ٔیـٓ WPF ٚسٔ ٚیضاسْ وٙبس ٔ ٚیبْ ػشاؽ ٕٞیٗQt.
لجُ اص ٞشؿیض ی ٝسؼشیفی دس ساثغ ٝث HTML ٚ CSS ٝثذْ ثؼذ ثشیٓ ػش اكُ ٔغّت....
فٌاٍری CSSتا آٍای (سیاساس ) :سٚؿی ػبد ٜثشای ٕ٘بیؾ ؿیذٔبٖ ٚػّٜٞٛبی سلٛیشی ٔ$ب٘ٙذ ٘ٛع
لّٓ ،سً٘ ٚا٘ذاصٜٞب #ثش كفلٞٝبی ٚة اػز .ؿیٜ٘ٛبٔ ٔ ٝآثـبسی اص ػٙغ صثبٖٞبی ٘ـبٌ٘ٝزاسی ،ثب ػبخشبس
ٔشٗ ػبد ٔ ٜسایب٘ٞ ٝؼشٙذ ٚدسٞ ٖٚشوذاْ ،دػشٛسٞبیی آثـبس ٔب٘ٙذ ٚدیدسدی ،ثشای ؿٍٍ٘ٛی ٕ٘بیؾ ٞش كفلٝ
ٚة افضٚدٔ ٜیؿٛد .ثٌ ٝفشٝای ػبد ٜسش ،ایٗ دػشٛسٞب سٚؽ ٘ـبٖ داد ٜؿذٖ لّٓٞب ٚا٘ذاص ٜؿبٖ ،سً٘ٞب ٚدغ
صٔیٞٝٙب ،سٚؽ ؿیذٔبٖ ٔٛصاییهٞبی دسثشٌیش٘ذ ٜدادٜٞب $دیٛاسٜٞب ٚ ،#ثؼیبسی دیٍش اص ػٙلشٞبی ػبخشبس ٞش
كفلٚ ٝة سا ،دس ٖٚخٛد ػبی ٔیدٙٞذ.
ٞXMLؼشٙذ ٚثشای وبس دس سشویت ثب ػبُٔ وبسثش ٔجشٙی ثش XMLعشاكی ؿذٜا٘ذ ٚ .دس كبَ كبظش ٘یض
ػذیذسشیٗ آٖ ٞ HTML5ؼشؾ.
دس ساثغ ٝثب ایٗ ٔؼئبِ ٗٔ ٝخٛدْ خیّی ث ٝایٗ لؼٕز ػاللٙٔ ٝذْ دِیّـٓ ؿبیذ ٚاضق ثبؿ ٝوبس وشدٖ ثب دػشٛسار
HTML ٚCSSدس سِٛیذ كفلبر ٚة خشٚػی خیّی لبثُ سٛػٟی سٔ ٚیذ ٜكبَ آ٘ى ٝاص ایٗ دػشٛسار دس
سِٛیذ ثش٘بٔٞ ٝبی سلز دػىشبح اػشفبد ٜوٙیٓ ؿ ٝؿٛد !!! دس ایٙؼبػز و ٝثبیذ ثٍٓ ثٙبٔش ٖٛس ٚاص ِلبػ
ٌشافیىی ٔیش٘ٛیذ ٔٙفؼشؽ وٙیذ.
سَال ....هگر CSS ٍ HTMLهختص طراحی ٍب ًیست ؟ دس ػٛاة ثبیذ ٌفز ثِّٚ ...ٝی اص ایٗ ثٝ
ثؼذ ٕ٘٘ٛٞ ٝغٛس ؤ ٝشٛػ ٝؿذیذ دس ٔ Qtب لبثّیز ایٗ س ٚخٛاٞیٓ داؿز اص دػشٛسار CSS ٚ HTMLدس
عشاكی اػشفبد ٜوٙیٓ ثشای ٕٞی ٝٙو ٝداسْ ٔیٍٓ ثٟشش اص ایٗ ٕ٘یـٝ
ثشیٓ ػش دشٚطٔ ... ٜظُ لجُ ی ٝدشٚط ٜایؼبد ٔیىٙیٓ ثب ٘بْ ٚ MyDesignاص ٘ٛع Widgets ...ٖٕٛٞ
خت كبال ثشای ؿشٚع وبس اص ٔ ٗٔ HTMLیخٛاْ ؿشٚع و ٓٙو ٝؿغٛسی ٔیـ ٝدػشٛسار HTMLس ٚسٛی
وذ ٞبی C++اػشفبد ٜوشد.
فشم وٙیذ ٔٗ یٔ ٝشٙی ٞؼز دس سٚی ی label ٝیب ٞش ؿیئ دیٍشی ٔیخٛاْ سٛػظ وذ ٞبی HTMLثٟؾ
ٚیظٌی ٞبی خبكی ثذْ...
ی 2 ٚ Label ٝسب دوٕ ٝایؼبدٔیى ٓٙو ٝدس كبِز ػبدی ث ٝكٛسر صیش داسای افىز ٚؿىُ ظبٞشای
اػشب٘ذاسدی ٞؼشٙذ و ٝاص اػشبیُ دیـفشم ػیؼشٓ ػبُٔ سجؼیز وشدٖ ...
c + +با کیوتی آموزش | P a g e 35
اال ٔٗ ٔیخٛاْ اص HTMLاػشفبد ٜو ٚ ٓٙدیٍ ٝایٗ ٚاثؼشٍی س ٚاص ػیؼشٓ ػبُٔ ثٍیشْ ...ؿىبس ٔیىٙیٓ ثٝ
كٛسر صیش ثبیذ دلز وٙیذ ٔب ثشای دػشٛس ٘ٛیؼی HTMLثبیذ ثیٗ وشیـٗ ٚداثُ وشیـٗ اص وذ ٞبی HTML
اػشفبد ٜوٙیٓ و ٝدسػشؾ ٕٞ ٓٞی ٝٙث ٝكٛسر صیش.
ٔیجیٙیذ ایٗ وذ دس ثیٗ سً ٞبی دػشٛس boldو ٝثب ><bاغبص وٙٙذ</b> ٚ ٜخبسٕ ٝدٙٞذ ٜؿشٚع ؿذٜ
لشاس ٌشفش ٚ ٝسٕبٔی اٟ٘ٚبسْ دس ثیٗ "" ٚیب ' لشاس ٔیذیٓ سب لبثُ ؿٙبػبیی ثشای وبٔذبیّش ثبؿ.ٝ
كبال ٔب ؿغٛس ثبیذ ایٗ ٘ٛع ٘ٛیؼ ٝس ٚسٚی یه ِیجُ ػشؾ وٙیٓ ای ٓٙخیّی ساكز ٔیـ ٝث ٝكٛسر صیش ا٘ؼبٔؾ
داد ٚخشٚػی سٔ ٚـبٞذ ٜوشد.
ایٗ وذ ؿی ٔیٍٝ؟ خیّی ساكز داسٔ ٜیٍ ٝآلب ػبٖ اص والع فشْ ٔٗ ؿیئ labelس ٚا٘شخبة وٗ ٔ ٚشٗ یب
ٔ ٖٕٛٞلشٛیبسؾ س ٚثشاْ دس ثیٗ وذ HTMLػز وٗ .و ٝسد كبِز ػبدی ث ٝكٛسر صیش ٞؼشؾ.
c + +با کیوتی آموزش | P a g e 36
سٟٙب ؿیضی و ٗٔ ٝاضبف ٝوشدْ ؿی ٝ؟ فمظ سً ٞبی ؿشٚع ٚدبیبٖ دٙٞذٞ Bold ٜؼز دغ دس ٘شیؼ ٝؿٕب ثب
ٚاسد وشدٖ سً ٞبی HTMLث ٝكٛسر اػشب٘ذاسد دس وذسٔ ٖٛیش٘ٛیذ اصؿٛسٗ اػشفبد ٜوٙیذ.
٘شیؼ ٝخشٚػی:
ٔیجیٙیذ عجك سلٛیش ٔمبیؼ ٝوٙیذ ٔشٗ labelدس كبِز HTMLدش سً٘ ؿذ ٜث ٝكبِز boldسغییش وشد.ٜ
یٔ ٝظبِی ٔیض٘ٓ دس ساثغ ٝثب Tooltipثب HTML ...عٛسی وٚ ٝلشی سٚی دوٕ ٝأ َٚبٚع س ٍٝ٘ ٚداسیٓ یٝ
Tooltipثبص ثـ ٝو ٝسٛػظ ٛ٘ HTMLؿشیٓ.
ثشای ایٙىبس ثبیذ اص Propertieؿی اػشفبد ٜوٙیٓ ؟ ٔؼّٕب ثبیذ اص setToolTipاػشفبد ٜوٙیٓ
كبال ی٘ ٝىش ٝای ٓٞاؿبس ٜو ٓٙو ٝاٌ ٝدلز وٙیذ دس فشْ ثبال ٔٗ اص ٓٞ CSSدس داخُ HTML ٖٕٛٞسً
اػشفبد ٜوشدْ ...ایٗ یؼٙی ؿی یؼٙی HTMLث ٝعٛس وّی لبثُ دـشیجب٘ی ٞؼز ؿ ٖٛاٌ٘ ٝجٛد ٚیظٌی خبكؾ
س ٚاػشا ٕ٘یىشد.
دس ساثغ ٝثب CSSیىٓ سٛضیق ثذْ ؿغٛس ٔیش٘ٛیٓ ی CSS ٝوذ ث ٝفشٕٔ٘ ٖٛؼجز ثذیٓ.
c + +با کیوتی آموزش | P a g e 38
لجُ اص ٞش ؿیض ثبیذ ای ٛٙثٍٓ ؿٕب ٔیش٘ٛیذ ٓٞثب ایٗ سٚؿی وٌ ٝفشٓ دس ثیٗ سً ٞبی HTMLاص CSSاػشفبدٜ
وٙیذ ٓٞسٚؽ ٞبی دیٍ ٝدس وذ ٘ٛیؼی خٛد ٕٞ ٚ C++ـٙیٗ سٚؽ دػشی دس لؼٕز عشاكی سٛػظ Qtثٝ
كٛسر ٞبی صیش..
سٚؽ ا َٚس ٚو ٝدیذیٗ...سٚؽ د ْٚؿغٛسی ٝدس سٚؽ د ْٚؿٕب ٔیش٘ٛیذ اص خبكیز setStyleSheetثشای
وٙششَ ٞب ٚاؿیبئ اػشفبد ٜوٙیذ ٔظال ث ٝكٛسر صیش:
;)";ui->label->setStyleSheet("color: #ff0000
سغییشی و ٝوشد ٜسً٘ ٔلشٛیبر labelلشٔض ؿذ ٜو ٝسٛػظ خبكیز CSSثٟؾ سثظ دادیٓ.
كبال ٔیـ ٝثب ی ٝسٚؽ دیٍ ٝای ٓٞایٗ وبس س ٚوشد ا ٓ٘ٚای ٝٙسٚی فشْ ٚسٚی labelساػز وّیه ٔیىٙیٓ ٚ
ٌضی Change StyleSheet ٝٙس ٚا٘شخبة ٔیىٙیٓ دس ایٗ كبِز ٔیش٘ٛیذ ثش اػبع ٘بْ والع ٚؿٙبػٞ ٝش
یه خبكیز ٚاػشبیُ س ٚػز وٙیذ.
ٔظال وذ صیش س ٚدس وبدس ثبص ؿذٚ ٜاسد وٙیذ ٚسبییذ وٙیذ:
دس وُ ثبیذ ثٍٓ ؿٕب ٔیشٛییذ وال وذٞبی CSSس ٚدس ٔشكّ ٝعشاكی ٕٞ ٚـٙیٗ وذ ٘ٛیؼی ث ٝثش٘بٔش ٖٛسثظ
ثذیٗ ٚیب دس ٟ٘بیز ی ٝوالع ٞبی دسػز كؼبثی ثٛٙیؼیذ ثشای اػشبیُ ثش٘بٔش ٚ ٖٛوّی وبسای دیٍ.ٝ
دس ساثغ ٝثب ایٗ لؼٕز یىٓ سٛضیلبسی ثذْ وٞ ٝذف ؿ ٝؿیضی ٞؼز ٚثؼذ ثشیٓ ػشاؽ آٔٛصؽ.
خت سبكبال ؿٙیذیٗ ٚدیذیٗ و ٝدس ٘شْ افضاس ٞب سٙظیٕبر دٙؼشٞ ٜب ٕٞ ٚـٙیٗ الیٞ ٝب سٛػظ Re-sizeؿذٖ
كٛسر ٔیٍیشٖ ٚدس ػیٗ سغییش ا٘ذاص ٜآثؼىز ٞب ٚوٙششَ ٞبی ٔٛػٛد ثش سٚی فشْ ٔشٙبػت ثب سغییشار ا٘ذاص ٜثٝ
خٛثی ٔٙظٓ ٚسغییش ٔیىٙٙذ دس ایٗ كبِز ٔب ٔیٍیٓ سٕبٔی وٙششَ ٞبی ٔٛػٛد سٚی الی ٝسٙظیٓ ؿذ ٜا٘ذ.
ثشای ؿشٚع دشٚط ٜای س ٚایؼبد ٔیى٘ ٚ ٓٙبٔؾ سٔ ٚیضاسْ ٔ MyLayoutیش٘ٛیٓ ایٗ دشٚط ٜس ٚثذwidget ٖٚ
ٓٞایؼبد وٙیٓ ؿ ٖٛدس ایٗ ٔشكّ ٝاص وذ ٘ٛیؼی ثشای ایؼبد فشْ ٚالیٞ ٝب اػشفبد ٜخٛاٞیٓ وشد.
ثجیٙیذ لجُ اص ٞش ؿیضی ٔٗ ٔیخٛاْ یه فشٔی ث ٝػٛٙاٖ دٙؼش ٜایؼبد وٕٞ ٚ ٓٙـٙیٗ وٙششَ ٞبی الصْ س ٚثش سٚی
ا ٖٚفشاخٛا٘ی خٛا ٓٞوشد.
ثشای ایٗ وبس ٔب ثبیذ ٔٛاسد الصْ س Include ٚوٙیٓ و ٝدس ایٗ ٔشكّٔ ٝب ٘یبص ث ٝوالع ٚ QWidget
ٞ QVBoxLayout ٚ QHBoxLayout ٚQPushButtonؼشیٓ.
كبال ؿغٛسی اص ایٗ ٔٛاسد اػشفبد ٜخٛاٞیٓ وشد ث ٝكٛسر صیش ٞؼشؾ.
دس ایٗ وذ ٔٗ ی ٕٝ٘ٛ٘ ٝاص ٔ QWidgetیٍیشْ ٘ ٚبٔؾ سٔ window ٚیضاسْ ٚدس خظ ثؼذیؾ ػٛٙا٘ی ثشای
ایٗ فشْ خٛدْ سٛػظ خبكیز setWindowsTitleثشاؽ دس ٘ظش ٔیٍیشْ.
كبال ٔیخٛاْ 3سب دوٕ ٝدس فشٔٓ لشاس ثذْ ث ٝكٛسر صیش ثشای ٞش وذ ْٚاص ٔ ٕٝ٘ٛ٘ QPushButtonیٍیشْ.
كبال ٔٗ اٌ ٝفشْ سٕٞ ٚیٙؼٛسی showو ٓٙدوٕٞ ٝبی ٌٕ٘ ٝ٘ٛشفش ٝؿذ ٗٔ ٜدس داخُ فشْ ٕ٘بیؾ دادٜ
٘خٛاٙٞذ ؿذ ٚفشْ ٔٗ ث ٝكٛسر دیـفشم دس كذاوظش ا٘ذاصٕ٘ ٜبیؾ داد ٜخٛاٞذ ؿذ ! ِٚی ٞذف ٔٗ ای ٝٙو ٝثٝ
وٕه والع ٞبی افمی ٚیب ػٕٛدی ٞButtonب س ٚدس داخُ فشْ ٕ٘بیؾ ثذْ ٞ ٚـٙیٗ دس ایٗ كبِز ا٘ذاصٜ
فشْ ٔٗ ثش اػبع ایٗ والع ٔشٙبػت ثب 3دوٌٕ ٕٝ٘ٛ٘ ٝشفش ٝؿذ ٜدس داخُ الی Re-Size ٝخٛاٞذ ؿذ.
ثش اػبع ٘یبص ٘ٛع الی ٝس ٚا٘شخبة ٔیىٙیٓ و ٝػٕٛدی ثبؿ ٝیب افمی...
ٔٗ الی ٝافمی س ٚا٘شخبة ٔیى ٚ ٓٙاصؽ ث ٝكٛسر صیش ٕ٘ٔ ٝ٘ٛیٍیشْ:
;)hlayout->addWidget(button
;)hlayout->addWidget(button1
;)hlayout->addWidget(button2
دلز وٙیذ ...ایٙؼب ٔٗ ٔیٍٓ دوٕ 3...2..1 ٝسٞ ٚش 3سبؿ ٖٛس ٚث ٝالی ٗٔ ٝاضبف ٝوٗ.
كبال سب ایٙؼب وٙششَ ٞبی ٔٗ ث ٝالی ٝاخشلبف داد ٜؿذِٚ ٜی خٛد الی ٝیٛٔ ٝسدی داس !!! ٜا ٓ٘ٚای ٝٙو ٝثشای
ٕ٘بیؾ الی ٝدس داخُ windowو ٝاص ٘ٛع QWidgetدس ٘ظش ٌشفشٓ ٕ٘بیؾ داد٘ ٜخٛاٞذ ؿذ ! دغ ثبیذ
ؿىبس و ٓٙ؟ خت خیّی ساكز ثبیذ ٔٗ الی ٝای و ٝسؼشیف وشدْ س ٚث window ٝسخلیق ثذْ ث ٝكٛسر
صیش...
;)window->setLayout(hlayout
ٚدس ا٘شٟب ثشای ایٙى ٝفشْ ٔٗ ثٕ٘ ٝبیؾ دس ثیبد ثبیذ ث ٝكٛسر صیش ایٗ وذ س ٓٞ ٚفشأٛؽ ٘ى:ٓٙ
;)(window->show
٘شیؼ ٝایٗ وبسا ٔیـ ٝث ٝكٛسر صیش:
با کیوتیc + + آموزش | P a g e 41
:ذٙٙب سغییش ٔیىٞ سر صیش وذٛ كٝیٓ ثٙ وٜدی اػشفبدٕٛ اص كبِز ػٌٝ اٚ
vlayout->addWidget(button);
vlayout->addWidget(button1);
vlayout->addWidget(button2);
window->setLayout(vlayout);
: ػیٚخش
ٚ
با کیوتیc + + آموزش | P a g e 42
#include "mainwindow.h"
#include <QApplication>
#include <QPushButton>
#include <QHBoxLayout>
#include <QVBoxLayout>
hlayout->addWidget(button);
hlayout->addWidget(button1);
hlayout->addWidget(button2);
window->setLayout(hlayout);
window->show();
return a.exec();
}
c + +با کیوتی آموزش | P a g e 43
دس ایٗ ٔشكّ ٝللذ داسیٓ ثب الیٞ ٝبی Gridوبس وٙیٓ ایٗ الی ٝؿی ٞؼشؾ ٚث ٝؿ ٝدسدی ٔیخٛس ٜ؟
خت ثبیذ ایٙغٛس ثٍٓ ؿٕب سٚی فشْ ٞش وٙششِی س ٚدسع ٔیىٙیذ ٔؼّٕب ا٘شظبس ایٗ س ٚداسیذ و ٝوٙششَ ٞبی ؿٕب ٚ
اؿیبئی و ٝسٚی فشْ كذا صد ٜؿذ ٜث ٝكٛسر ٔٙظٓ ثش اػبع الیٞ ٝبی سٛسی )ٙٔ (Gridظٓ ثـ ٝیؼٙی ٞش ػٛس
و ٝفشْ س ٚعشاكی وٙیٓ ثشای ٞش وذاْ اص وٙششَ ٞب یه ٔىب٘ی س ٚسٚی Gridاخشلبف ٔیذیٓ.
ٔیشیٓ ػشاؽ ی ٝدشٚط ٜثب ٘بْ MyGridLayoutدس ٔلّ ٝا َٚفشٔٓ س ٚایؼبد ٔیى ٓٙعجك وذ صیش:
دس صیش ٔب ثش اػبع ٕٞیٗ لب٘ ٖٛسبثغ Gridثشای ٞش یه اص وٙششَ ٞب ؿٕبس ٜایٙذوغ ػّ ٚ َٛػش٘ٛؾ سٚ
ٔـخق وشدیٓ.
;)Layout->addWidget(label1,0,0
;)Layout->addWidget(txtFirstName,0,1
با کیوتیc + + آموزش | P a g e 44
Layout->addWidget(label2,1,0);
Layout->addWidget(txtLastName,1,1);
Layout->addWidget(button,2,0,1,2);
سر ثبیذ ٔمذاسٛیذ دس غیش ایٗ كٙ وٜ٘یذ اػشفبدٛس دس ٘ظش ٍ٘شفشٗ ٔمذاس ٔیشٛظٙٔ ٝ ث0 اص ػذدٝ الصْ ٘جبؿٝش ػب وٞ
:سر صیشٛ كٝ ثٝ ٘شیؼؾ ٔیـٚ یذٙاسد وٚ ... ٚ 3...2...1 یٙیز یؼِٛٚ ثش اػبع اٚس
#include <QApplication>
#include "QLabel"
#include "QLineEdit"
#include "QLayout"
#include "QPushButton"
Layout->addWidget(label1,0,0);
Layout->addWidget(txtFirstName,0,1);
Layout->addWidget(label2,1,0);
Layout->addWidget(txtLastName,1,1);
Layout->addWidget(button,2,0,1,2);
c + +با کیوتی آموزش | P a g e 45
;)window->setLayout(Layout
;)(window->show
;)(return a.exec
}
دس ساثغ ٝثب ػذاوٙٙذ ٜیب Splitter ٖٕٛٞیىٓ سٛضیلبر ثذْ ٙٔ ...ظٛس اص ایٗ اكغالف ؿیی ٚ ٝس ٛثش٘بٔٛ٘ ٝیؼی
ث ٝؿ ٝدسدی ٔیخٛس ٜ؟ دس ساثغ ٝثب ایٗ ٌضی ٝٙثبیذ ایٙغٛس ثٍٓ فشم وٙیذ ؿٕب فشٔی داسیذ ٚفضبی فشْ ؿٕب
ٍٙٞبْ سغییش ا٘ذاص ٜوّی فشق ٔیى ٚ ٝٙوٙششَ ٞبی ٔٛػ ٛدس اٞ ٖٚیؾ سغییشی ٍٙٞبْ سغییش ا٘ذاص ٜفشْ ٕ٘یىٙٙذ ! ثشای
سفغ ایٗ ٔـىُ دس كٛسر ٘یبص ٔیش٘ٛیٓ ث ٝكٛسر صیش ػُٕ وٙیٓ.
خت ی ٝدشٚط ٜاص ٘ٛع Widgetایؼبد ٔیى ٓٙاػٕـٔ ٛیضاسْ ٚ Splitterث ٝكٛسر صیش د ٚسب وٙششَ سٛؽ
ایؼبد ٔیى.ٓٙ
اٌ ٝدلز وٙیذ دس ٔشكّ ٝا َٚدوٕٞ ٝب ٚفشْ ٔب ٔشست ٘یؼشٙذ ٍٙٞ ٚبْ سغییش ػبیض ٓٞوٙششَ ٞب ٕٞشا ٜثب فشْ
سغییشی ٕ٘یىٙٙذ.
c + +با کیوتی آموزش | P a g e 46
ثشای كُ ایٗ ٔٛسد ثبیذ ؿىبس وٙیٓ ؟ خت عجك سلٛیش صیش ٞش د ٚوٙششَ س ٚا٘شخبة ٔیى ٚ ٓٙثش اػبع ٔلٛس
افمی ٚیب ػٕٛدی ػشـٔ ٖٛیى ٓٙو ٗٔ ٝدس ایٗ ٔظبَ اص ٘ٛع ٖٕٛٞ Horizontalافمی ثشای Splitter
ا٘شخبثـ ٖٛوشدْ.
كبال سٚی فشْ وّیه ٔیىٙیٓ ٌ ٚضی Layout Horizontally ٝٙس ٚا٘شخبة ٔیىٙیٓ سب ث ٝكٛسر صیش وٙششَ
ٞب ثب فشْ ٔب ٕٞب ًٙٞثـٗ.
c + +با کیوتی آموزش | P a g e 47
خت كبال ثؼذ اص اػشای فشْ ٔٗ ٕٞشا ٜثب وٙششَ ٞبؽ ٕٞبٔ ًٙٞیـٍٙٞ ٚ ٝبْ سغییش ا٘ذاص ٜفشْ وٙششَ ٞبٔٓ سغییش
ا٘ذاصٔ ٜیذٖ ٚكشی اٌ ٝاص كبِز Move ٚ Dragاػشفبد ٜوٙیذ ٔیجیٙیذ و ٝخبكیز Splitterفؼبَ ٞؼز ٚ
ساكز ٔیـ ٝسغییشؽ داد.
ؿٕب عجك ایٗ آٔٛصؽ ٔیش٘ٛیذ ٘ ٝسٟٙب وٙششَ ثّى ٝس ٛثش٘بٔٞ ٝبسٛ٘ ٖٛاس اثضاس ٞبیی سِٛیذ وٙیذ ؤ ٝظُ ٕٞیٗ ٘ٛاس
اثضاس ٞبی ٔلیظ ثش٘بٔٛ٘ ٝیؼی ػفبسؿی ٚلبثّیز Splitterداؿش ٝثبؿٙذ.
ٔیشیٓ ػش وبس ثب دایشوشٛسی ! ثشای ؿشٚع ی ٝدشٚط ٜایؼبد وٙیٓ ایٙجبس اص ٘ٛع Consoleؿ٘ ٖٛیبصی ث ٝوبس سٚی
فشْ ٘ذاسیٓ فؼال فمظ ٔیخٛاْ دس ساثغ ٝثب ٘ل ٜٛثشسػی دایشوشٛسی سٛضیق ثذْ.
دس Qtثشای كذا صدٖ سٛاثغ وبس ثب دایشوشٛسی ثبیذ اص QDirاػشفبد ٜوٙیٓ.
ثشای ٔظبَ ٔٗ اثشذا ایٙىّٛد ٔیى QDir ٓٙس ٚ ٚاصؽ یٔ ٕٝ٘ٛ٘ ٝیؼبصْ ٔ ٚؼیشی ؤ ٝیخٛاْ ثشسػی و ٓٙسٚ
ٔـخق ٔیى ٓٙث ٝكٛسر صیش:
>#include <QCoreApplication
c + +با کیوتی آموزش | P a g e 48
>#include <QDebug
>#include <QDir
;)"QDir MyDir("c:/
;)(qDebug() << MyDir.exists
;)(return a.exec
}
دس ایٙؼب ؿ ٝوشدیٓ ؟ ٔٗ اص والع QDirیه ٌٕ٘ ٝ٘ٛشفشٓ ٔ ٚؼیشی و ٝالصْ داسْ ثشای ثشسػی وٖٕٛٞ ٝ
دایشوشٛسی ٞؼشؾ س ٚثٟؾ دادْ ٚدس ٔشكّ ٝثؼذؽ اٌش ٔؼیشی و ٗٔ ٝدادْ س ٚسـخیق ثذ ٜثشاْ ٔمذاس ثِٛیٗ
trueس ٚ ٚاٌش ٘ٔ ٝمذاس ثِٛیٗ falseسٔ ٚیذ.ٜ
اٌش ٔؼیش ٔٛػٛد ثبؿ ٚ True ٝاٌش ٘جبؿ False ٝس ٚثشٌـز ٔیذ.ٜ
خت دس ایٗ ٔشكّ ٝللذ داسْ سؼذاد دسایٞ ٛبیی و ٝسٚی ػیؼشٓ ٔٗ فؼبَ ٞؼشٙذ سٕ٘ ٚبیؾ ثذْ.
ث ٝكٛسر صیش ی ٕٝ٘ٛ٘ ٝاص ٚ QDirی ٕٝ٘ٛ٘ ٝثشای ِیؼز وشدٖ دسایٞ ٛبْ اص ٌ ٚQFileInfoشفشٗ
اعالػبسـٔ ٖٛیٍیشْ ٚداخُ یه كّم ٝس٘ٚذ س ٚسب ػبیی و ٝالصٔ ٝسىشاس ٔیى.ٓٙ
;QDir MyDir
))(foreach (QFileInfo MyItem,MyDir.drives
{
;)(qDebug() << MyItem.absoluteFilePath
با کیوتیc + + آموزش | P a g e 49
}
ٝظیفٚ ػظٚ ٗ ایٝ ثیـشش وٝ٘ ٜٖ ٔیذٛ سب ٘ـ3 ْ داسٛ سب دسای3 ٖٛ ٔٗ ؿٝسر صیش اِجشٛ كٝ ثٝ٘شیؼؾ ٔیـ
.ػیٚ خشٝ ثٜ ثبصٌـز ٔیذٚ سٝعٛ اعالػبر ٔشثٝؼشؾ وٞabsoluteFilePath
"C:/"
"D:/"
"E:/"
:سر صیشٛ كٝوذ وّی ث
#include <QCoreApplication>
#include <QDebug>
#include <QDir>
#include <QFileInfo>
QDir MyDir;
foreach (QFileInfo MyItem,MyDir.drives())
{
qDebug() << MyItem.absoluteFilePath();
return a.exec();
}
(Read) ٍ خَاًذى هحتَیات فایلC++/Qt در ایي قسوت هیرین سراغ کار تا فایل ّا در
:سر صیشٛ كٝٓ ثٙا٘ی ٔیىٛ فشاخٚسد ٘ظشْ سٛٔ بیٞ اثشذا والع
c + +با کیوتی آموزش | P a g e 50
>#include <QFile
>#include <QString
>#include <QTextStream
كبال دس ٘ظش داسْ ی ٝفبیّی ایؼبد ؤ ٚ ٓٙلشٛیبر داخُ ا ٖٚس ٚثخ ٓ٘ٛثشای ایٗ ٔٙظٛس ی ٝسبثغ ٔ Readیؼبصْ ثٝ
كٛسر صیش...
))if(!MyFile.open(QFile::ReadOnly | QFile::Text
{
;"qDebug() << "could not open file for reading
;return
}
;)QTextStream in(&MyFile
;)(QString MyText = in.readAll
;)(MyFile.close
}
كبال دس ایٗ لؼٕز سبثؼی وٛ٘ ٝؿشٓ س ٚفشاخٛا٘ی ٔیى ٚ ٓٙادسع ٔؼیش ٚفبیّٓ سٔ ٚـخق ٔیى ٓٙسب ٔلشٛیبر
ا ٖٚس ٚثشاْ ٕ٘بیؾ ثذ ٜث ٝكٛسر صیش:
;)"Read("C:/TEST/test.txt
;)(return a.exec
}
خشٚػی ؿذ ث ٝكٛسر صیش ٞش ؿیضی و ٝدس داخُ فبیُ ٞؼشؾ:
كبال ثشیٓ ػشاؽ سٛضیلبر ....دس ٔشكّ ٝا َٚدس ساثغ ٝثب سبثغ Readسٛضیق ثذْ....
ٔٗ اثشذا ثشای ٘ٛؿشٗ ٚیب خٛا٘ذٖ دس داخُ یه فبیُ ثبیذ اص والع QFileیه ٕ٘ ٝ٘ٛثٍیشْ سب ثش ٓ٘ٛایٗ وبس
س ٚا٘ؼبْ ثذْ دغ ث ٝكٛسر صیش اثشذا یٌ ٕٝ٘ٛ٘ ٝشفشٓ:
;)QFile MyFile(Filename
c + +با کیوتی آموزش | P a g e 51
دس خظ ثؼذی ی ٝدػشٛس ؿشعی آٚسدْ ٌ ٚفشٓ و ٝاٌش فبیّٓ س ٚاص ٘ٛع ٔشٙی ٚدس كبِز فمظ خٛا٘ذ٘ی دس ٘ظش
ثٍیش اٌش فبیُ ٔٗ س ٚثش اػبع ایٗ ؿشایظ سـخیق ٚلبدس ث ٝخٛا٘ذٖ ٔلشٛیبر آٖ ٘ـذ دیغبْ ػذْ سٛا٘بیی دس ثبص
وشدٖ ٚخٛا٘ذٖ فبیُ س ٚث ٟٓثذ.ٜ
))if(!MyFile.open(QFile::ReadOnly | QFile::Text
{
;"qDebug() << "could not open file for reading
;return
}
دس لؼٕز ثؼذ ٔٗ ثشای ایٙى ٝثش ٓ٘ٛثب یه فبیُ ٔشٙی ٚسؿش ٝای وبس و ٓٙؤ ٝیش ٝ٘ٛخٛا٘ذٖ یب ٘ٛؿشٗ ثبؿ ٝثبیذ اص
والع QTextStreamی ٕٝ٘ٛ٘ ٝای داؿش ٝثبؿٓ ٚظیف ٝایٗ والع اسائ ٝیه ساثظ ٔٙبػت ثشای خٛا٘ذٖ ٚ
٘ٛؿشٗ دس فبیُ ٞؼشٙؾ ث ٝكٛسر صیش:
;)QTextStream in(&MyFile
كبال دس لؼٕز ثؼذ ٔیٍٓ سٕبْ ٔلشٛیبسی و ٝدس فبیُ ٚػٛد داس ٜس ٚثشاْ ثٍیش ث ٝكٛسر صیش:
;)(MyFile.close
سب ایٙؼب ٔٗ ٘ ٝفبیُ سٔ ٝ٘ ٚ ٚؼیش فبیّٓ سٔ ٚـخق ٘ىشدْ اِجش ٝایٗ ٔیـذ ٔٗ دس داخُ خٛد سبثغ ایٗ وبس س ٚوٓٙ
ِٚی ثشای ثٟی ٝٙؿذٖ ٔبیّٓ ث ٝكٛسر سبثغ ٚفمظ ٍٙٞبْ كذا صدٖ سبثغ ٔـخق و ٓٙو ٝاص ؿٔ ٝؼیشی ؿ ٝفبیّی
ثبص ؤ ٚ ٝٙلشٛای ا ٖٚس ٚثشاْ ٕ٘بیؾ ثذ ٜثشای ایٗ اس ث ٝكٛسر صیش ػُٕ ٔیى:ٓٙ
;)"Read("C:/TEST/test.txt
اثشذا ٘بْ سبثؼی و ٝػبخشٓ ٚثؼذ ٔؼیشؽ ٕٞشا ٜثب ٘بْ ٚدؼ٘ٛذ فبیّٓ سٔ ٚـخق وشدْ.
>#include <QCoreApplication
>#include <QDebug
با کیوتیc + + آموزش | P a g e 52
#include <QFile>
#include <QString>
#include <QTextStream>
if(!MyFile.open(QFile::ReadOnly | QFile::Text))
{
qDebug() << "could not open file for reading";
return;
}
QTextStream in(&MyFile);
QString MyText = in.readAll();
MyFile.close();
}
Read("C:/TEST/test.txt");
return a.exec();
}
(Write) ٍ ًَضتي در داخل فایلC++/Qt در ایي قسوت هیرین سراغ کار تا فایل ّا در
:سر صیشٛ كٝٓ ثٙا٘ی ٔیىٛ فشاخٚسد ٘ظشْ سٛٔ بیٞ اثشذا والع
#include <QFile>
#include <QString>
#include <QTextStream>
ٝ ٔیؼبصْ ثWrite سبثغٝس یٛظٙٔ ٗ٘ٓ ثشای ایٛ ثخٖٚ سٚیبر داخُ اٛ ٔلشٚ ٓٙ فبیّی ایؼبد وٝكبال دس ٘ظش داسْ ی
...سر صیشٛك
;)QFile MyFile(Filename
))if(!MyFile.open(QFile::WriteOnly | QFile::Text
{
;"qDebug() << "could not open file for reading
;return
}
;)QTextStream out(&MyFile
;"out << "Hello my friend :D
;"!std::cout << "The text is written
;)(MyFile.flush
;)(MyFile.close
}
كبال دس ایٗ لؼٕز سبثؼی وٛ٘ ٝؿشٓ س ٚفشاخٛا٘ی ٔیى ٚ ٓٙآدسع ٔؼیش ٚفبیّٓ سٔ ٚـخق ٔیى ٓٙسب ٔلشٛیبر
ا ٖٚس ٚثشاْ ٕ٘بیؾ ثذ ٜث ٝكٛسر صیش:
;)"Write("C:/TEST/test.txt
;)(return a.exec
}
خشٚػی ؿذ ث ٝكٛسر صیش ٞش ؿیضی و ٝدس داخُ فبیُ ٞؼشؾ:
ٔٗ اثشذا ثشای ٘ٛؿشٗ ٚیب خٛا٘ذٖ دس داخُ یه فبیُ ثبیذ اص والع QFileیه ٕ٘ ٝ٘ٛثٍیشْ سب ثش ٓ٘ٛایٗ وبس
س ٚا٘ؼبْ ثذْ دغ ث ٝكٛسر صیش اثشذا یٌ ٕٝ٘ٛ٘ ٝشفشٓ:
;)QFile MyFile(Filename
دس خظ ثؼذی ی ٝدػشٛس ؿشعی آٚسدْ ٌ ٚفشٓ و ٝاٌش فبیّٓ س ٚاص ٘ٛع ٔشٙی ٚدس كبِز فمظ ٘ٛؿشٙی دس ٘ظش ثٍیش
اٌش فبیُ ٔٗ س ٚثش اػبع ایٗ ؿشایظ سـخیق ٚلبدس ثٛ٘ ٝؿشٗ ٔلشٛیبر آٖ ٘ـذ دیغبْ ػذْ سٛا٘بیی دس ثبص وشدٖ
ٛ٘ ٚؿشٗ فبیُ س ٚث ٟٓثذ.ٜ
))if(!MyFile.open(QFile::WriteOnly | QFile::Text
{
;"qDebug() << "could not open file for writing
c + +با کیوتی آموزش | P a g e 54
;return
}
دس لؼٕز ثؼذ ٔٗ ثشای ایٙى ٝثش ٓ٘ٛثب یه فبیُ ٔشٙی ٚسؿش ٝای وبس و ٓٙؤ ٝیش ٝ٘ٛخٛا٘ذٖ یب ٘ٛؿشٗ ثبؿ ٝثبیذ اص
والع QTextStreamی ٕٝ٘ٛ٘ ٝای داؿش ٝثبؿٓ ٚظیف ٝایٗ والع اسائ ٝیه ساثظ ٔٙبػت ثشای خٛا٘ذٖ ٚ
٘ٛؿشٗ دس فبیُ ٞؼشٙؾ ث ٝكٛسر صیش:
;)QTextStream out(&MyFile
كبال دس لؼٕز ثؼذ ٔیٍٓ ٔشٗ ٔٛسد ٘ظش س ٚدس داخُ فبیُ ٔٗ ثٛٙیغ ث ٝكٛسر صیش:
;)(MyFile.flush
;)(MyFile.close
لجُ اص ثؼشٗ فبیُ ٌفشٓ وٞ ٝشٌٔ ٝ٘ٛشٙی س ٚو ٝدس فبیُ ٔیخٛای ثٛٙیؼی لجّؾ دس كبفظ Buffer ٝلشاس ثذ ٜدس
ایٗ كٛسر ٔمذاس 1س ٚثشاْ ثبصٌـز ٔیذ ٚ ٜفبیُ سٔ ٚیجٙذ ٜدس غیش ایٙلٛسر ٚ 0خغب!
سب ایٙؼب ٔٗ ٘ ٝفبیُ سٔ ٝ٘ ٚ ٚؼیش فبیّٓ سٔ ٚـخق ٘ىشدْ اِجش ٝایٗ ٔیـذ ٔٗ دس داخُ خٛد سبثغ ایٗ وبس س ٚوٓٙ
ِٚی ثشای ثٟی ٝٙؿذٖ ٔبیّٓ ث ٝكٛسر سبثغ ٚفمظ ٍٙٞبْ كذا صدٖ سبثغ ٔـخق و ٓٙو ٝاص ؿٔ ٝؼیشی ؿ ٝفبیّی
ثبص ؤ ٚ ٝٙشٙی س ٚدس داخُ ا ٖٚثٛٙیؼ ٝثشای ایٗ اس ث ٝكٛسر صیش ػُٕ ٔیى:ٓٙ
;)"[CPP]Write("C:/TEST/test.txt
اثشذا ٘بْ سبثؼی و ٝػبخشٓ ٚثؼذ ٔؼیشؽ ٕٞشا ٜثب ٘بْ ٚدؼ٘ٛذ فبیّٓ سٔ ٚـخق وشدْ.
#include <QCoreApplication>
#include <QDebug>
#include <QFile>
#include <QString>
#include <QTextStream>
if(!MyFile.open(QFile::WriteOnly | QFile::Text))
{
qDebug() << "could not open file for reading";
return;
}
QTextStream out(&MyFile);
out << "Hello my friend :D";
std::cout << "The text is written!";
MyFile.flush();
MyFile.close();
}
Write("C:/TEST/test.txt");
return a.exec();
}
Labelبٞ وبس ثب ثشؿؼتٚ ٔؼشفی: هرحلِ دٍازدّن
سغییشٚ اػٕؾ سobjectName ٘یذ دس لؼٕزٛؼز ؿٕب ٔیشٞ label سر دیـفشمٛ كٝاػٓ ایٗ ِیجُ ث
.ٗثذی
c + +با کیوتی آموزش | P a g e 56
ٔٗ ِیجّٓ س ٚلشاس دادْ ِٚی كبال ٔیخٛاْ ٔشٗ ِیجُ س ٚثش اػبع ػّیم ٝسغییش ثذْ دس ٔلیظ عشاكی ؿٕب ٔیش٘ٛیذ ثب
دٚثبس ٜوّیه سٚی ٔشٗ دیـفشم ِیجُ ا ٖٚس ٚسغییش ثذیٗ ٚیب ایٙى ٝاص لؼٕز Propertyخبكیز Textسٚ
سغییش ثذیٗ ث ٝكٛسر صیش:
و ٝدس ایٗ كبِز ؿٕب ٔیش٘ٛیذ أىبٖ سغییش ف٘ٛز س ٚدس ػشیؼششیٗ كبِز دس دػز داؿش ٝثبؿیذ ٕٞ ٚـٙیٗ ػٛسع
HTMLس ٚدس اخشیبس داؿش ٝثبؿیذ ث ٝكٛسر صیش:
c + +با کیوتی آموزش | P a g e 57
c + +با کیوتی آموزش | P a g e 58
ٚیب سا ٜػ ْٛای ٝٙو ٝسٛػظ وذ ٘ٛیؼی ایٗ وبس س ٚا٘ؼبْ ثذیٗ دس داخُ فبیُ mainwindow.cppثٝ
كٛسر صیش:
ٞش ؿٙذ دس كبِز دػشی لبثّیز ٚیشایؾ ٚاػشبیُ ثٙذی ػشیغ دس اخشیبس ٌزاؿشٔ ٝیـِٚ ٝی ثشای اػشبیُ ٘ٛیؼی
ٕٞب٘غٛس و ٝلجال ٌفشٓ ٔیش٘ٛیذ اص لبثّیز CSS ٚ HTMLاػشفبد ٜوٙیذ.
"#include "mainwindow.h
"#include "ui_mainwindow.h
}
)(MainWindow::~MainWindow
{
;delete ui
}
خشٚػی ث ٝكٛسر صیش:
c + +با کیوتی آموزش | P a g e 59
دس ساثغ ٝثب Buttonثبیذ ثٍٓ یىی اص دش وبسثشد سشیٗ ؿیئ ٞبیی ٞؼشؾ و ٝاصؽ اػشفبد ٜخٛاٞذ ؿذ ٚ
ٔخلٛكب سخذاد Eventدس كبِز وّیه ؿذٖ ث ٝكٛسر صیش دشٚط ٜس ٚایؼبد ٚاص QPushButton
اػشفبدٔ ٜی وٙیٓ.
دس ایٗ ٔشكّ ٝثب وّیه ساػز سٚی دوٕ ٚ ٝا٘شخبة ٌضیٔ ٝٙـخق ؿذٔ Got to slot ٜیش٘ٛیٓ سخذاد ٔٛسد
٘ظش س ٚثشای دوٕ ٝدس ٘ظش ثٍیشیٓ
c + +با کیوتی آموزش | P a g e 60
ٚدس ایٗ ٔشكّٔ ٝیجیٙیذ و ٝا٘ٛاع سخذاد ٞب ثشای ایٗ وٙششَ ٚػٛد داس ٜو ٗٔ ٝاص سخذاد وّیه ؿذٖ اػشفبدٜ
ٔیى.ٓٙ
c + +با کیوتی آموزش | P a g e 61
ثؼذ اص ا٘ؼبْ ایٗ ٔشاكُ سبثغ ٔشثٛط ث ٝایٗ سخذاد ثشای ایٗ ؿٙبػ ٝاص دوٕ ٝایؼبد ٔی ؿٛد ٚؿٕب ٔیشٛا٘یذ وذ
ٔٛسد ٘ظشس ٖٛس ٚثشای ایٗ سخذاد اص وّیه ثٛٙیؼیذ.
c + +با کیوتی آموزش | P a g e 62
ٔٗ وذ صیش س ٚثشای ٕ٘بیؾ ی دیغبْ ٚاسد ٔیى ٓٙسب ثب وّیه ؿذٖ سٚی دوٕ ٝدیغبْ ٕ٘بیؾ داد ٜثـ.ٝ
;QMessageBox msgBox
;)"msgBox.setText("The document has been modified.
;)(msgBox.exec
هرحلِ چْاردّن ٔ :ؼشفی ٚوبس ثبLineEdit
وٙششَ ٕٞLineEditبٖ وٙششَ ٔ TextBoxؼشٚف ٞؼشؾ وٚ ٝظیف ٝایٗ ٌشفشٗ اعالػبر اص وبسثش ٞؼز
ٞPropertyبی صیبدی ٓٞداسٕٞ ٚ ٜیٙغٛس سٚیذاد ٞبی ٔخشّف.
ثؼىشٓ س ٚایؼبد ٔیى ٓٙسٚی فشْ ٚثؼذ ی ٝدؤٕ ٝیضاسْ ٔ ٚیخٛاْ ثب وّیه سٚی دؤٕ ٝشٙی س ٚو ٝسٛ
ٔLineEditیٛٙیؼٓ ٕ٘بیؾ ثذْ.
لجُ اص ٞش ؿیض ٘ ٓٞبْ آثؼىشٓ س ٚػٛم ٔیىٔ ٓٙیضاسٔؾ MyLineEditث ٝكٛسر صیش...
c + +با کیوتی آموزش | P a g e 63
كبال ٔیشْ ػشاؽ وذ ٘ٛیؼی ٔ ...ؼشمیٓ ٔیشْ س ٛسٚیذاد وّیه دوٕٓ ٔیٛٙیؼٓ وذ صیش س...ٚ
;QMessageBox msgBox
;))(msgBox.setText(ui->MylineEdit->text
;)(msgBox.exec
ثب ایٗ سفبٚر و ٝث ٝػبی دیغبْ لجّی خبكیز ٔشٗ ٔٛػٛد دس LineEditس ٚفشاخٛا٘ی ٔیى ٓٙثب دػشٛس صیش:
;)(ui->MylineEdit->text
ایٗ ث ٝایٗ ٔؼٙی ٝؤ ٝشٗ ٔٛػٛد دس ؿیئ وبدس ٚسٚدی ٔشٗ ٔٗ س ٚثٍیش.
یىی اص وٙششَ ٞبی ٔ ٚ ٟٓوبس آٔذ و ٗٔ ٝؿخلب ػالل ٝخبكی ث ٝایٗ وٙششَ داسْ وٙششَ ؿه ثبوغ ٞؼشؾ
CheckBox
كبال ٔٗ ث ٝكٛسر صیش ؿه ثبوؼٕٔ ٛیبسْ سٚی فشْ ٔ ٚیخٛاْ ثب وّیه ثش سٚی دوٕ ٝاٌٗٔCheckBox ٝ
سیه خٛسد ٜثبؿ ٝث ٟٓدیغبْ ثذ ٜو ٝسیه خٛسد ٜیب ٔشٗ ٔٛسد ٘ظشْ سٕ٘ ٚبیؾ ثذ ٜیب اٌش سیه ٘خٛسد ٜثبؿ ٝثٟٓ
ثٍ ٝو ٝالب سیه ٘خٛسد ٜا٘شخبثؾ وٗ !یب ٞش ؿیضی و ٝخٛؿشٔ ٖٛیبد.
با کیوتیc + + آموزش | P a g e 65
if (ui->checkCPP->isChecked())
{
QMessageBox msgBox;
msgBox.setText("C++");
msgBox.exec();
}
else {
QMessageBox msgBox;
msgBox.setText("Please select your programming language !");
msgBox.exec();
}
:سر صیشٚ فٝ ث.ٓ ثٍیشیذٞ ٚس CheckBox دٛ٘یذ ٔشٗ خٛب ٔیشٞ ٗ ػبی ایٗ ٔشٝث
msgBox.setText(ui->checkCPP->text());
:ؼشؾٞ سر صیشٛ كٝ ثٝبیز ٘شیؼٟ٘ دسٚ
یىی اص وبسآٔذ سشیٗ آثؼىز ٞبی ا٘شخبثی ؤ ٝؼٕٛال ثشای ٔـخق وشدٖ یىی اص ٌضیٞ ٝٙبی دیـٟٙبدی ٔب٘ٙذ
ػٛاِٟبی ؿٙذ ٌضی ٝٙای ... ٚاػشفبد ٜاص ٞ RadioBoxؼشؾ و ٗٔ ٝدس ایٗ ٔشكّ ٝثب د ٚوٙششَ سادیٔ ٛیخٛاْ
٘شیؼ ٝا٘شخبة ؿذ ٜسٕ٘ ٚشبیؾ ثذْ سمشیجب سٚؿؾ ؿجی ٝثٞ CheckBox ٝؼز ِٚی ثب وٕی سغییشار.
فشٔٓ س ٚایؼبد ٚوٙششِٓ س ٚدسع ٔیى ٚ ٓٙثشای وٙششَ No ٚ Yesاػٓ ٔ ٚـخل ٝخبكی ٔیذْ.
كبال ٔٗ ٔیخٛاْ ٚلشی فشٔٓ ثٛد ٔیـ ٝیىی اص ایٗ د ٚوٙششَ ث ٝكٛسر دیـفشم ٔمذاس دٞی ثـ ٝؤ ٝمذاس ثشاثش
ایٗ وٙششَ ٞب ٕٞیـ true ٝیب falseخٛاٞذ ثٛد یؼٙی دس كبِز ا٘شخبة ٚ trueدس غیش ایٙلٛسرfalse.
;)ui->radioYES->setChecked(true
ٌضی ui ٝٙو ٝوال ٔشثٛط ث ٝفشْ عشكٕٞ ٖٛؼشؾ یؼٙی ٚ uiثؼذ ٞش ؿیئی و ٝسٚی ا ٖٚلشاس داس.ٜ
اػٓ ٚیب ؿٙبػ ٝوٙششَ سٔ ٚیٛٙیؼٓ ٚثؼذ ٔمذاس trueس ٚثشاؽ دس ٘ظش ٔیٍیشْ سب ٚلشی فشٔٓ ِٛد ؿذ سادیٛیی
وٞ Yes ٝؼز دس كبِز ا٘شخبة لشاس ثٍیش ٜاٌ ٝایٗ وبس ٚا٘ؼبْ ٘ذْ ٞیؾ یه اص ایٗ وٙششَ ٞب ٔمذاس دٞی
٘خٛاٙٞذ ؿذ یب ثبیذ ایٙؼٛسی سٛػغض وذ ٔمذاس اِٚی ٝثشای یىی اص ایٗ دٚسب ثذیٓ یب ثبیذ اص لؼٕز properties
با کیوتیc + + آموزش | P a g e 68
ؼزٞ لبثُ ا٘شخبةٚذ ؿذ !!! فمظ یىی اص ایٗ دٙٞاٛٓ ا٘شخبة ٘خٞ ثبٚشدٞ لزٛیـٞ الٕٛ ٔؼٝیٓ وٙٔـخق و
.ٝی ٔیـٞ ٔمذاس دfalse كبِزٝ ثtrue ثؼذیؾ اص كبِزٝٙیذ ٌضیٙ ا٘شخبة وٚلشی دیٍشی سٚ
No لشیٚ ٚ ْ دیغبٝ ا٘شخبة ؿذ یYes لشیٚ ٝیؼٓ وٛٙدْ وذی ثٛ خٕٝیئذاد وّیه دوٚاْ دس سٛ أب االٖ ٔیخٚ
.ٜٖ ثذٛٔ ثشاٚ سٖٝ ثبؿٛٔ ٔذ ٘ظشٝشؿیضی وٞ دیغبْ یبٝا٘شخبة ؿذ ی
void MainWindow::on_pushButton_clicked()
{
if (ui->radioYES->isChecked() == true)
{
QMessageBox msgBox;
msgBox.setText("Yes ! I like C++ programming languge! that's
powerfull and faster than ever !");
msgBox.exec();
}
else if (ui->radioNO->isChecked() == true)
{
c + +با کیوتی آموزش | P a g e 69
;QMessageBox msgBox
;)"! msgBox.setText("No ! I don't like C++
;)(msgBox.exec
}
}
ایٗ لؼٕز ٔٗ ٔیش٘ٛؼشٓ ٔـخق و ٓٙو ٝأٌ RadioYes ٝمذاسؽ trueثٛد فالٖ وبس ٚاٌش ٔمذاسؽ
falseثٛد فالٖ وبس ِٚی خت خٛاػشٓ اص ٔمذاس ٔٛػٛد دس ٓٞ RadioNoاػشفبد ٜو ٓٙدس وُ ٔیـ ٝاص ٞش
د ٚكبِز ٓٞاػشفبد ٜوشد ثٙب ثش ػّیم ٝخٛدس... !ٖٛ
ٚأب وبس ثب ComboBoxث ٝكٛسر صیش آثؼىز س ٚا٘شخبة ٘ ٚبْ ٌزاسی ٔیى...ٓٙ
c + +با کیوتی آموزش | P a g e 71
ی ٝسٛضیلی دس ساثغ ٝثب خلٛكیبر ایٗ وٙششَ ثذْ ؤ ٝؼٕٛال دس كبِز ِیؼز دادٞ ٜبی خٛدؽ سٔ ٚیٍیشٚ ٜ
خشٚػی س ٓٞ ٚث ٝكٛسر ِیؼز ٕ٘بیؾ ٔیذ ٚ ٜدس ٟ٘بیز ثشای ٌشفشٗ ٔمذاس ا٘شخبة ؿذٔ ٓٞ ٜیش٘ٛیٓ اص كبِز
ٞبی ٔخشّفی ٔظُ ثبصٌـز دٙٞذ ٜاص عشیك ٚ CurrentTextیب CurrentIndexاػشفبد ٜوٙیٓ ث ٝكٛسر
صیش ٔٗ اثشذا دس فشْ ِٛد خٛدْ ٔمذاس ٞبیی س ٚؤ ٝیخٛاْ دس ِیؼز ثبوؼٓ ٕ٘بیؾ داد ٜثـ ٝسب وبسثش ثش٘ٛی یىیـٛ
إ٘شخبة و ٝٙسٔ ٚیٛٙیؼٓ.
/*Data*/
<< "QStringList Language = (QStringList() << "English" << "Perisan
;)""Turkish" << "Russian
;)ui->ComboLang->addItems(Language
خت ث ٝایٗ لؼٕز دلز وٙیذ ثش اػبع خبكیز ٔمذاس دٞی ؿذ ٜدس ایٗ وٙششَ یه ٘ٛع ػذیذ اص ٘ٛع
QStrinListثب ٘بْ Languageدس ٘ظش ٌشفشٓ ٚثؼذ ٔمبدیش ٔٛسد ٘ظشْ س ٚدس داخُ ایٗ ِیؼز سٛػظ
ػٍّٕش دسع >> ٚاسد وشدْ دس خظ ثؼذی سٛػظ addItemsوٛ٘ ٝع آسای ٝای یب ِیؼز ٞبی خبف سٚ
ٔیٍیش ٜسٛػظ ٚ Languageاسد ٔیى.ٓٙ
كبال دس ٘ظش داسْ اص خبكیز ٞبی ا٘شخبثی ایٗ وٙششَ اػشفبد ٜؤ ٚ ٓٙمذاس ٞبی ا٘شخبة ؿذ ٜس ٚثشٌشد ٓ٘ٚثٝ
كٛسر صیش:
;QString CurrentVal
;)(CurrentVal = ui->ComboLang->currentText
c + +با کیوتی آموزش | P a g e 72
;QMessageBox msgBox
;)msgBox.setText(CurrentVal
;)(msgBox.exec
خت اثشذا ؿیىبس وشدْ یٛ٘ ٝع ٔشٙی سؼشیف ٔیى ٚ ٓٙثؼذ ؿ ٖٛاص ٘ٛع ٔشٗ ثشٌـشی یؼٙی CurrentText
ٔیخٛاْ اػشفبد ٜوٛ٘ ٓٙع سؿشٓ سٔ ٚؼشفی وشدْ ٚثؼذ ٔمذاس ایٗ ٔشغیشْ س ٚثشاثش ٔمذاس ٔشٗ ا٘شخبة ؿذٜ
COmboBoxخٛدْ لشاس ٔیذْ ٘ ٚشیؼٔ ٝیـ ٝث ٝكٛسر صیش:
ثشای ٔمذاسی اص ٘ٛع ٔ ٓٞ intیش٘ٛیذ ٔشغیش خٛدس ٖٛس ٚاص ٘ٛع intسؼشیف وشدٔ ٚ ٜمذاس CurrentIndexس ٚثٟؾ اخشلبف ثذیٗ ٚ
وّی وبسای دیٍ...ٝ
ایٗ وٙششَ ٔظُ ComboBoxػُٕ ٔیىِٚ ٝٙی ثب ایٗ سفبٚر ؤ ٝلشٛیبر ٚآیشٓ ٞبی ایٗ وٙششَ ث ٝكٛسر
یىؼب دس دػششع ٞؼشٗ ٔ ٚیـ ٝث ٝكٛسر یه ِیؼز ث ٝآیشٓ ٞب دػششػی داؿز ی ٝؿیضی ٔظُ DataGrid
ِٚی ثشای آیشٓ ٞبیی و ٝلشاس ٜا٘شخبة ؿ٘ٛذ.
ث ٝكٛسر صیش ایؼبدؽ ٔیىٙیٓ ٚدس فشْ ِٛد ٕٞب٘ٙذ ComboBoxایشٓ ٞبی ٔٛسد ٘ظش س ٚثٟؾ ٔیذیٓ.
/*Data*/
<< "QStringList C_Types = (QStringList() << "C++ Native" << "C++ CLI/.Net
;)""C++ MFC" << "C++ Win32
;)ui->listWidget->addItems(C_Types
كبال ٔیخٛاْ ٔمذاس ا٘شخبة ؿذ ٜسٕ٘ ٚبیؾ ثذْ و ٝیىٕی ٔشفبٚسش اص ComboBoxخٛاٞذ ثٛد ث ٝكٛسر صیش
:
;QString Val
;)(Val = ui->listWidget->currentItem()->text
;QMessageBox msgBox
;)msgBox.setText(Val
;)(msgBox.exec
خت ٔشغیشْ س ٚدس ٘ظش ٔیٍیشْ ٚثؼذ ثشاثشؽ ٔیى ٓٙثب هتي هقذار آیتن اًتخاب ضذُ دس ِیؼز ثبوؼٓ!
ٚدس ٟ٘بیز ٔمذاس سجذیُ ؿذ ٜث ٝسؿش ٝسٔ ٚیفشػشٓ ثMSG.ٝ
c + +با کیوتی آموزش | P a g e 74
ٔؼشفی ٚوبس ثب ِیؼز ٞبی دسخشی / TreeWidgetث ٝایٗ كٛسر اػز و ٝدس ثؼیبسی اص ٔٛالغ ؤ ٝمبدیش
لبثُ ا٘شخبة ٔب كبٚی ؿبخٞ ٝب ٚصیش ؿبخٞ ٝبیی ٞؼشٙذ ٚثش٘بٔٛ٘ ٝیغ ثبیذ أىبٖ ایٗ س ٚثشای وبثش فشا ٓٞو ٝٙسب
وبسثش ٓٞؿبخٞ ٝب ٓٞ ٚصیش ؿبخٞ ٝبی ثخـی س ٚؤ ٝیخٛاد ا٘شخبة و ٝٙس ٚثجی ٝٙث ٝعٛس وّی ِیؼز ا٘شخبة ثٝ
كٛسر دسخشی ٕ٘بیؾ داد ٜخٛاٞذ ؿذ.
دس ساثغ ٝثب ایٗ ؿیئ ثبیذ ایٕٙغٛس سٛضیق داد و ٝخبكیز ٚاِذ ٚفشص٘ذ س ٚدس خٛدؽ سخلیق داد ٜاػز ثشای
ٔظبَ ٔٗ ٕ٘ ٝ٘ٛصیش س ٚثخٛاْ سٚی ایٗ ِیؼز ٕ٘بیؾ ثذْ ث ٝكٛسر صیش:
کتابC++ 11
فلُ اَٚ
فلُ دْٚ
...ٚ
وال یه ٚاِذ یب صیش ؿبخ ٝداسیٓ ٚثمیٛٔ ٝاسد صیش ؿبخ ٝیب ٕٞبٖ فشص٘ذ ٞؼشٙذ دس اكُ ٚ Parent ٖٕٛٞ
Child
كبال سٚؿی ؤ ٗٔ ٝیخٛاْ ثشای ایٗ ثىبس ثجشْ ث ٝكٛسر صیش خٛاٞذ ثٛد اثشذا ثشای دػششػی ٚساكشی وبس 2سب
سبثغ سؼشیف ٔیى ٓٙثشای childٚ parent
ٚ ْاِذ ٘بٚ ٖٕبٞ یبAddRoot ثشایٝ ٔـخق وشدْ وٚع سبثغ سٛ٘ ٚ ْیٗ ٘بٕٙـٞ ٚ بٞ ؼب ٔٗ ٔشذٙخت ای
ٝبػٙش یه ؿٞ ضیلبرٛ سٚ ْ ثش ٘بٜٕٚبٖ فشص٘ذ ػالٞ یبAddChild ثشایٚ ْ دس ٘ظش ٔیٍیشٚضیلالر سٛس
لشاسQTreeWidgetItem عٛ٘ ٘ٓ اصٚ اٚ ؼشؾٞ ٝسد ٘ظش ثشای ػش ؿبخٛٔ ٓبػب٘ذٖ ایشٙ ثشای ؿٜذٙٙسؼییٗ و
.ْٔیذ
سر صیشٛ كٝ ٔیؼبصْ ثٚاثغ سٛ سٝ٘ ثذٚ ٜ كذا صدٚاثغ سٛ سmainwindow.cpp ٖٕٛ ثؼذ دس فبیُ اكّیّٝٔشك
:
}
:سر صیشٛ كٝ سبثغ ٘یبص داسْ ثٚشیه اص ایٗ دٞ ُبی صیش دس داخٞ وذٝكبال ٔٗ ث
MyItem->setText(0, name);
MyItem->setText(1, Discreption);
ui->MyTreeWidget->addTopLevelItem(MyItem);
}
c + +با کیوتی آموزش | P a g e 77
دس سبثغ ا AddRoot َٚاثشذا یه وذی اص ٔ QTreeWidgetItemیؼبصْ سب ث ٝػٛٙاٖ آیشٓ ٞبی دسخشی
ثشاْ وبس و ٚ ٝٙدس ٔشكّ ٝثؼذی ٌفشٓ و ٝدس ایٙذوغ ا َٚیؼٙی ٔ 0شٙی س ٚو ٝسبثغ ٔیٍیش ٜس ٚػز وٗ ٚدس خظ
ثؼذیؾ دلیمب ٔظُ ایٗ ٌفشٓ سٛضیلبر س ٚدس ایٙذوغ 1یؼٙی د ْٚایٗ س ٚػز وٗ ٚثؼذ اص ایٗ ٌفشٓ ِیؼز
دسخشی ٔٗ ایٗ دٌ ٚضی ٝٙس ٚاص ٘ٛع آیشٓ ٞبی ػش ؿبخ ٝلشاس ثذ ٜثب وذ : addTopLevelItemایٗ وبس
س ٚا٘ؼبْ ٔیذْ.
دس خظ ثؼذؽ أٚذْ ٌفشٓ ایشٓ ٞبی AddChildثشاثش ثبؿ ٝاص آیشٓ ٞبی سؼشیف ؿذ ٜث ٝكٛسر ثبال و ٝاص سبثغ
AddChildفشاخٛا٘ی ٔیـ٘ٛذ ث ٝكٛسر صیش...
ػ ٝخظ ا َٚدس سبثغ ٔ AddChildظُ سبثغ لجّی ثشای ػٛٙاٖ ٚؿٙبػبیی ایٟٙبػز ٚدس خظ آخش ٌفشٓ و ٝآلب
آیشٓ ٞبی ٚاِذ ٔٗ صیش ٔؼٕٛػـ ٖٛثشاثش ثبؿ ٝثب آیشٓ ٞبی فشص٘ذی و ٝایؼبد ٔیـ٘ٛذ.
دس ٔشكّ ٝثؼذ دس لؼٕز فشْ ِٛد الصٔ ٝو ٝسؼذاد ػشٞ ٖٛب سٕٞ ٚشا ٜثب ػٙبٚیٙؾ ٔـخق و ٓٙث ٝكٛسر صیش:
;)ui->MyTreeWidget->setColumnCount(2
;)"AddRoot("Language", "Features
ٔـخل ٝوٌ ٝفشٓ د ٚػش ٖٛاص ٘ٛع صثبٖ ٚ ٚیظٌی ٞبی صثبٖ دسع وٗ ٚثؼذ اص ایٗ سبثغ Addrootفشاخٛا٘ی
ؿذ ٚ ٜسبثغ ٕٞ AddChildیٙغٛس ٘ ٚشیؼٔ ٝیـ ٝث ٝكٛسر صیش...
c + +با کیوتی آموزش | P a g e 78
دس ساثغ ٝثب اوـٗ ٞب ٔیش ٓ٘ٛثٍٓ ٞٛٙٔ ٖٕٛٞبی ثش٘بٔٞ ٝؼشؾ و ٝسٛػظ ٞش اوـٗ ایؼبد ؿذ ٜیه ٔ ٛٙثب ٔـخلٝ
خبف سؼشیف ٚلبثّیز ٞب ٕٞ ٚـٙیٗ ٞ Eventبی خبف خٛدؽ س ٚایؼبد ٔیى ٝٙثشای ٔظبَ ٔٗ ثشای ایٙىٝ
سٚی فشٔٓ ٔٞ ٛٙبی صیش س ٚایؼبد ٔیى ٓٙث ٝكٛسر صیش:
c + +با کیوتی آموزش | P a g e 79
ؿىبس ثبیذ ا٘ؼبْ ثذْ ...خیّی ساكز سٚی فشٔٓ لؼٕز ٔ ٛٙسٚی Type Hereوّیه ٔیى ٚ ٓٙاػٓ ٔٛٙسٚ
ٔیٛٙیؼٓ ٔظُ سلٛیش صیش...
c + +با کیوتی آموزش | P a g e 80
سٛػ ٝوٙیذ وٞ ٝش ٚاِذ ٔیش ٝ٘ٛصیش ؿبخٞ ٝبی خٛدؽ س ٚداؿش ٝثبؿٕٞ ٝـٙیٗ ٔیش٘ٛیذ ثب وّیه سٚی Add
Separatorخظ فبكّخ ثیٗ ٔٞٛٙب ث ٝػٛٙاٖ ػذا وٙٙذ ٜایؼبد وٙیذ.
c + +با کیوتی آموزش | P a g e 81
ٞشیه اص ٔٞ ٛٙبیی و ٝایؼبد ٔیـ ٝث ٝػٛٙاٖ یه ٞ Actionؼشؾ ٔظُ دیٍش وٙششَ ٞبی داسای ٞ Eventب ٚ
ٞSlotبی خبف خٛدؿٞ ٖٛؼشٙذ .كبال ثشای ایٙىٔ ٝظال ثب وّیه وشدٖ س ٚدوٕ Exit ٝیب ٛٙٔ ٖٕٛٞی ػبخشٝ
ؿذ ٜثب ٘بْ Exitی ٝوبسی ا٘ؼبْ ثذیٓ ؿىبس ثبیذ وٙیٓ ؟ خت ثبیذ دس سخذاد وّیه ؿذٖ یب ا٘شخبة ؿذٖ ایٗ
Actionو ٝدس ایٙؼب ثب ؿٙبػ actionExit ٝدس دػششع ٞؼشؾ ٚاسد ثـٓ ٚوذٞبی ٔٛسد ٘ظش س ٚثشای ا٘ؼبْ
وبس ٔٛسد ٘ظش ثٛٙیؼیٓ ث ٝكٛسر صیش لؼٕز اوؾ ٞب ٚاػشالر ٞب ٔـخق ٞؼز:
c + +با کیوتی آموزش | P a g e 82
دس ادأ ٝخیّی ساكز ثب ٚاسد ؿذٖ ث ٝاػالر ٔٛسد ٘ظش ٚایؼبد سبثغ سخذاد ٔ triggeredشاكُ صیش س ٚادأٝ
ٔیذیٓ...
)(void MainWindow::on_actionExit_triggered
{
}
ثیٗ سبثغ ؿٕب ٔیش٘ٛیذ ٞش وذی س ٚو ٝالصٔ ٝثٛٙیؼیذ كبال دس ایٗ ٔظبَ ٔٗ وذ ػبد ٜای ثشای خشٚع اص ثش٘بٔ ٝسٚ
ٔیٛٙیؼٓ ٚسٕبْ ! ث ٝكٛسر صیش...
;)(QApplication::exit
ٚدس ٟ٘بیز ثب وّیه ثش سٚی ٔ ٛٙاوـٗ Exitثش٘بٔ ٝثبیذ اص دشٚػ ٝخبسع ؿٛد.
c + +با کیوتی آموزش | P a g e 83
دس ساثغ ٝثب وٙششَ ٞبی Slider ٚ progressؿ ٖٛدشادشسی ٞبی سمشیجب ٔـبثٟی داس٘ذ ایٗ د ٚس ٚثب ٓٞادغبْ
ٔیىٙیٓ ث ٝكٛسر صیش سٚی فشٔٓ یه ٚ Progressbarیه Sliderایؼبد ٔیى.ٓٙ
خت لجُ اص ٞش ؿیضی سٛضیلی دس ساثغ ٝثب ایٗ ثذْ و ٝآثؼىز ٕٞ Progressbarیـ ٝثش اػبع دشادشسی
ٔvalueمذاسدٞی ٔیـ ٝیؼٙی اٌش ٔب ثشای ایٗ وٙششَ Maximum valueس ٚثشاثش 100لشاس ثذیٓ ٚ
دشادشسی valueایٗ ثشاثش ثبؿ ٝثب 24اٛ٘ٚلز اص 100دسكذ 24دسكذ ٔمذاس ایٗ وٙششَ اسصؽ دٞی ٔیـٛد.
كبال ٔیبییٓ ػشاؽ وذ ٘ٛیؼی ...لجُ اص ٞش ؿیض ؿٙبػٞ ٗٔ Progresbar ٝؼشؾ ٚ MyprogressBar
ؿٙبػٞ ٗٔ Slider ٝؼشؾ MyhorizontalSlider
ٔیخٛاْ دلیمب ٚلشی ٔمذاس Sliderbarسغییش ٔیىٔ ٝٙمذاس ٓٞ Progressbarثش اػبع ا ٖٚسغییش و ٝٙث ٝؿٝ
سٚؿی ٔیـ ٝایٗ وبس س ٚا٘ؼبْ داد ؟!
دس ٔ Qtب ثلض ٞ Slot ٚ Signalبس ٚداسیٓ و ٝث ٝعٛس خالك ٝثخٛاْ خیّی ػبد ٜسٛضیق ثذْ ایٗ خٛاٞذ
ثٛد :فشم وٙیذ ٔٗ ی ٝیه ؿخلی ایٕیُ ٔیض٘ٓ ٚدس لجبَ ا ٖٚایٕیُ ا٘شظبس دسیبفز ػٛاثؾ س ٚداسْ كبال ٔٗ
ایٙؼب ث ٝػٛٙاٖ ٚ Signalؿخق دسیبفز وٙٙذ ٜایٕیُ ٔٗ ٞؼشؾ ٚSlotاسسجبط ثیٗ ایٗ دٛٔ ٚسد سٛػظ ؿٝ
ؿیضی ا٘ؼبْ دزیش ٜ؟ سبثؼی داسیٓ ث٘ ٝبْ connectوٚ ٝظیف ٝایٗ سبثغ ثشلشاسی اسسجبط ثبیٗ ٚ Signal
ٞSlotؼشؾ ث ٝكٛسر صیش ػُٕ خٛاٞیٓ وشد:
دس ایٗ وذ ٔٗ سبثغ connectس ٚفشاخٛا٘ی وشدْ ایٗ سبثغ اثشذا Signalسٔ ٚیٍیشٚ ٜس ثؼذ Slotس ٚثشای
ػیٍٙبِی و ٝاسػبَ وشد ٜػشؾ ٔیى ٝٙخیّی ساكز ثخٛا ٜػبد ٜسش ثٍٓ ٚظیفؾ ٕٞیٙی ٝؤ ٝیجیٙیذ ػیٍٙبَ سٚ
اسػبَ ٔیى ٚ ٝٙاػالر س ٚثشای ػیٍٙبَ اسػبَ ؿذ ٜدسیبفز ٔیى ٝٙكبال ایٙؼب ٔمذاس اسصؿی ؤ ٝب اسػبَ ٔیىٙیٓ ٚ
دسیبفز ٔیىٙیٓ اص ٘ٛع ٞ intؼشؾ و ٝدس ٞش د ٚؿیئ ٔب ٔمذاس valueاسػبَ ٚدسیبفز ٔیـ.ٝ
كبال ثؼذ اص اػشا وشدٖ ثش٘بٔٞ ٝش ثبس ٔٗ ٔمذاس Sliderس ٚسغییش ثذْ ٔمذاس ٓٞ Progressbarسغییش خٛاٞذ
یبفز ث ٝكٛسر صیش:
خت ایٗ ی ٝخالك ٝای اص ٔف ْٟٛػیٍٙبَ ٚاػالر ثیٗ ایٗ د ٚوٙششَ یىٓ سٛضیق ثذْ دس ساثغ ٝثب ػز وشدٖ
ػذاٌب٘ٔ ٝمذاس دس وٙششَProgressbar
c + +با کیوتی آموزش | P a g e 86
ثشای ایٗ وبس اص دشادشسی setValueثبیذ اػشفبد ٜوٙیٓ ٔٗ ثشای ٔظبَ ؿٟبس ٔمذاس ٔشفبٚسر س ٚثب اػشفبد ٜاص
وٙششَ Buttonایؼبد ٚاسػبَ ٔیى ٓٙث ٝكٛسر صیش:
;)[/CPP][CPP]ui->MyprogressBar->setValue(75
یىی اص أىب٘بر دیٍ ٝدس ٘شْ افضاس ٞب و ٝدس عشاكی اصؽ ٔیـ ٝاػشفبد ٜوشد ایؼبد ٘ٛاس ٚضؼیز ٞؼشؾ و ٝخٛد
٘ٛاس ٚضؼیز ٔیش ٝ٘ٛؿبُٔ ٞش ٘ٛع وٙششِی ثبؿ ٝثشای ٔظبَ ث ٝكٛسر صیش ٘شْ افضاس TeamViewerسٔ ٚظبَ
ٔیض٘ٓ صیشؽ دس لؼٕز دبییٗ و ٝث ٝسً٘ لشٔض ٔـخق وشدْ ٔشٗ ٚ ٚضؼیز ثش٘بٔ ٝسٔ ٚـخق ٔیى ٝٙو ٝاكٛال
دس ایٗ ٔٛاسد اص StatusBarاػشفبدٔ ٜیىٙٙذ.
c + +با کیوتی آموزش | P a g e 87
خت كبال ؿغٛس ایٗ وبس سٔ ٚیـ ٝا٘ؼبْ داد ایٙغٛس ثبیذ ثٍٓ و ٝخیّی ساكشش اص وبس دس دار ٘ز ٞؼز ! ٚالؼب
ساكش ٝاٚال خٛد Qtؿٟبسؿٛة اػشب٘ذاسدی س ٚداس ٜو ٝاكٛال ٞ Widget ٕٝٞب ث ٝكٛسر دیـفشم اص ایٗ
أىب٘بر دـشیجب٘ی ٔیىٙٙذ كبال ٔٗ ٔیخٛاْ یه ٘ٛع ثشؿؼت ث ٝػٛٙاٖ خٛؽ آٔذ ٌٛیی سٚی ٚیؼشٓ دسػز وٓٙ
ث ٝكٛسر صیش...
خت كبال ثشای ایٙى ٝایٗ ثشؿؼت ایؼبد ؿذ ٜس ٚسٚی ٕ٘ Statusbarبیؾ ثذْ ثبیذ ث ٝكٛسر صیش ػُٕ وٓٙ
:
;)ui->statusBar->addWidget(Mylbl
c + +با کیوتی آموزش | P a g e 88
خیّی ػبد ٚ ٜساكز ثب ی ٝدػشٛس addWidgetاص Statusbarآثؼىز Labelس ٚثٟؾ اكبفٔ ٝیىٚ ٓٙ
٘شیؼٔ ٝیـ ٝث ٝكٛسر صیش:
خت یىی اص ٔٛاسدی و ٝخیّی دش وبسثشد ٞؼشؾ ٔخلٛكب ثشای ٕ٘بیؾ دیغبْ ٞبی خبف ٔظُ $اخغبس /
اعالػبر /ػٛاَ ٚػٛاة #... ٚاػشفبد ٜاص ٞ MessageBoxؼشؾ و ٝدس C++دس كبِز ٞبی ٔخشّفی
ٔیـ ٝاصؽ اػشفبد ٜوشد ٗٔ ٚدس ایٗ آٔٛصؽ ثشای Qtایٗ ٔظبَ س ٚسمشیجب ػؼی ٔیى ٓٙوبُٔ ثض٘ٓ سب ثٟشش ٚ
ٔفیذسش ثبؿ.ٝ
ثشای ایٙى ٝدس ثش٘بٔش ٖٛاص MessageBoxاػشفبد ٜوٙیذ اثشذای فبیّش ٖٛثبیز ایٗ والع س ٚفشاخٛا٘ی وٙیذ :
QmessageBox
"#include "QMessageBox
خت كبال ٔٗ ٔیش ٓ٘ٛاص ایٗ والع اػشفبد ٜو ٓٙاثشذا اصؽ ی ٝؿیئ ػذیذ ٔیؼبصْ:
c + +با کیوتی آموزش | P a g e 89
;QMessageBox MyMSG
;)")MyMSG.setText("Welcome to C++ Tutorial :
;)(MyMSG.exec
دس خظ ا َٚاص والع QMessageBoxیه ٕ٘ ٝ٘ٛػبخشٓ ٚدس خظ دٔ ْٚشٙی س ٚدس ٖٚایٗ آثؼىز ٚاسد
وشدْ ٚدس خظ ثؼذی اص ٔشذ execثشای ٕ٘بیؾ Dialogثشای دیغبْ اػشفبد ٜوشدْ و٘ ٝشیؼؾ ثبیذ ثبؿ ٝثٝ
كٛسر صیش:
خت كبال ٔٗ للذ داسْ یىٕی دیـشفش ٝسش وبس و ٓٙثب ٔٛاسدی ؤ ٝیـ ٝدس ایٗ والع اصؿ ٖٛثٟشٕٙٞذ ؿذ آؿٙب
ٔیـیٓ ...ثشای ٔظبَ ٔٗ ٔیخٛاْ اص ایٗ لبثّیز ثشای دشػؾ ػٛاَ اػشفبد ٜو٘ ٚ ٓٙشیؼؾ س ٚثب اػشفبد ٜاص Yesیب
ٔNoـخق و ٓٙث ٝكٛسر صیش وذ سٔ ٚیٛٙیؼٓ:
;QMessageBox msgBox
;)"msgBox.setText("Welcome to C++ Tutorial
;)"?msgBox.setInformativeText("Do you want to save your changes
| msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard
;)QMessageBox::Cancel
;)msgBox.setDefaultButton(QMessageBox::Save
;)(int ret = msgBox.exec
خت خظ ا ٚ َٚد ْٚؤ ٝـخل ٚ ٝدس خظ ػٔ ْٛشٙی س ٚثشای ٕ٘بیؾ ث ٝػٛٙاٖ ػٛاَ دشػی سٛػظ دشادشسی
setInformativeTextاسػبَ ٔیى ٓٙدس خظ ثؼذیؾ سٛػظ دشادشسی setStandardButtonsدوٕٝ
ٞبیی س ٚؤ ٝیخٛاْ وبسثش ٍٙٞبْ ػٛاَ دشػی ثجی ٝٙسٔ ٚـخق ٔیى ٓٙو ٝدس ایٙؼب ػٌ ٝضیSave / ٝٙ
Cancel / Discardس ٗٔ ٚا٘شخبة ٔیى ٚ ٓٙدس خظ ثؼذ ٔـخق وشدْ و ٝدوٕ Save ٝث ٝػٛٙاٖ دوٕٝ
دیـفشم دس كبِز ا٘شخبة ؿذ ٜلشاس ثٍیش.ٜ
ٚدس ٟ٘بیز دیغبْ سٕ٘ ٚبیؾ ٔیذْ ٔ ٚمذاس ثبصٌـشی كبكُ اص ا٘شخبة وبسثش س ٚثٔ ٝشغیش retو ٝاص ٘ٛع int
ٞؼشؾ اسػبَ ٔیى.ٓٙ
خت كبال ػٛاِی ایٗ ٚػظ ٞؼشؾ و ٝاٌ ٝوبسثش ٞش وّیذی و ٝا٘شخبة وشد سٔ ٚ ٚمذاسؽ س ٚثبصٌـز داد
ثٍیش ٚ ٜی ٝوبسی ا٘ؼبْ ثذٔ ٜظال اٌ Save ٝس ٚصد ی ٝوبسی ٚاٌ ٝثمی ٝس ٚصد وبسٞبی ٔشفبٚر دیٍشی س ٚا٘ؼبْ
ثذ ... ٜثشای ایٗ وبس ث ٝسٚؽ صیش ػُٕ ٔیى:ٓٙ
{ )switch (ret
case QMessageBox::Save:
// Save was clicked
;break
case QMessageBox::Discard:
// Don't Save was clicked
;break
case QMessageBox::Cancel:
// Cancel was clicked
;break
default:
// should never be reached
;break
}
دػشٛس Switchیىی اص دػشٛسار ٔؼشٚفی ٞؼز و ٝدس ٔٛالغ دیـیذ ٜسش ٚؿٙذ ٌضی ٝٙای سش ثٟشش ػٛاة ٔیذ.ٜ
عشص وبسؽ ؿغٛسی ٝ؟ خت ٔشغیش retو ٝداؿشیٓ ا ٖٚثبال ٞش دوٕ ٝای س ٚؤ ٝب ا٘شخبة وٙیٓ سٛػظ دػشٛس
switchاسصیبثی ٔیـ٘ ٚ ٝشیؼ ٝثش اػبع ػّیمٔ ٝـخق خٛاٞذ ؿذ.
ٔظال ٔٗ دس ٔظبِی و ٝصدْ ث ٝكٛسر صیش ٞش ا٘شخبثی دیغبٔؾ س ٚاسػبَ خٛاٞذ وشد ث ٝیه Labelو ٝسٚی
فشٔٓ ٞؼز.
با کیوتیc + + آموزش | P a g e 91
switch (ret) {
case QMessageBox::Save:
// Save was clicked
ui->MyLabel->setText("Save");
break;
case QMessageBox::Discard:
// Don't Save was clicked
ui->MyLabel->setText("Discard");
break;
case QMessageBox::Cancel:
// Cancel was clicked
ui->MyLabel->setText("Cancel");
break;
default:
// should never be reached
break;
}
: یذٙسر صیش ػُٕ وٛ كٝٓ ثٞ ثشای ایٗ وبسٝ وICON ٖاٛٙ ػٝٓ داسیٓ ثٞ ایٍٝٓ دیٟٔ Property ٝی
msgBox.setIcon(QMessageBox::Question);
دس ثبسٕ٘ٛٞ ٓٞ Timer ٜغٛس ؤ ٝیذ٘ٚیذ یىی اص ٔٛاسدی ٞؼشؾ و ٝدس ػبد ٜسشیٗ كبِز ٔیـ ٝاصؽ ػبػز
و٘ٛٙی ػیؼشٓ سٌ ٚشفز ٚسغییش ػبػز /دلیم / ٝطب٘ی ٝس ٚث ٝكٛسر ٕ٘ Updateبیؾ داد .ثشای ایٗ وبس ٔب
ٔیش٘ٛیٓ والع وبُٔ ٚػبٔؼی س ٚثشای یه Timerاخشلبكی دس ثش٘بٔ ٝثٛٙیؼیٓ و ٝثش اػبع ٚ Signal
ٞSlotبی سؼشیف ؿذ ٜاصؽ اػشفبد ٜوشد.
ٔٗ دس ایٗ ٔشكّ٘ ٝلٕ٘ ٜٛبیؾ سغییشار ِلظ ٝصٔبٖ ػبسی ػیؼشٕٓ س٘ ٚـٔ ٖٛیذْ و ٝػبػز /دلیم / ٝطب٘ی ٝسٚ
سٚی فشٔٓ ٕ٘بیؾ خٛا ٓٞداد دس كبِشی وٞ ٝش طب٘ی ٝث ٝطب٘ی ٝػُٕ Updateكٛسر ثٍیش.ٜ
>#include <QTimer
دس فشْ ِٛد وذ صیش سٔ ٚیٛٙیؼٓ :
دس فبیُ mainwindow.hاػالر )ٔ (Slotشثٛط ث ٝایٗ سبثغ سٔ ٚؼشفی ٔیى ٓٙث ٝكٛسر صیش:
)(void MainWindow::updateClock
{
;)"QString timeString = QTime::currentTime().toString("hh:mm:ss
;)ui->LCurrenTtime->setText(timeString
}
خت ایٙؼب ٔٗ ثذ٘ ٝسبثغ س ٚسـىیُ ٔیذْ ٚیه ٔشغیشی اص ٘ٛع سؿش QString ٝایؼبد وشد ٚ ٜثؼذ سٛػظ سبثغ ٔٛػٛد دس
والع QTimeدلز وٙیذ ایٗ ٞ QTimeؼشؾ ثب QTimerفشق ٔیى ٝٙث ٝایٗ rسٛػ ٝوٙیذ !!! ٚظیف ٝایٗ والع ثشٌـز دادٖ صٔبٖ
ػبسی ػیؼشٓ ٞؼز و ٝسٛػظ ٔمذاس ثبصٌـشی طبثز ) (Staticث ٝكٛسر currentTimeسٚ ٚاسد ٔشغیشْ اص ٘ٛع سؿشٔ ٝیى ٓٙاِجش ٝلجّؾ
سجذیُ ث ٝسؿشٔ ٝیـ ٚ ٝسٛػظ اٍِٛی : hh:mm:ssػبػز :دلیم: ٝطب٘ی ٝاسػبَ ٔیـ ٝث ٝداخُ ٔشغیش.
دس خظ ثؼذی ٓٞؤ ٝـخلٔ ٝمذاس ٔشٗ ٛٔ labelػٛد سٚی فشٔٓ س ٚو ٝاػٕؾ سٌ LCurrenTtime ٚزاؿشٓ ثشاثش ٔیى ٓٙثب ٔشغیشی وٝ
صٔبٖ ػبسی ػیؼشٓ دس ا ٖٚرخیشٔ ٜیـ.ٝ
فمظ ی٘ ٝىش ٝو ٝثبیذ ثشای اػشفبد ٜاص ٓٞ QTimeوالػؾ سٚ ٚاسد فبیُ ٔىٙیذ ث ٝكٛسر صیش ٘ ٚشیؼٟ٘ ٝبیی...
"#include "QTime
c + +با کیوتی آموزش | P a g e 94
Threadؿیؼز ٚؿ ٝوبسٞبی ا٘ؼبْ ٔیذ ٜ؟ دس وُ ث ٝؿ ٝدسدی ٔیخٛس ٚ ٜؿشا ثبیذ اصؽ اػشفبد ٜوٙیٓ ؟
سٛضیق س ٚخیّی ٔخشلش ٚخیّی ػبد ٜث ٝصث ٖٛخٛدٔٔ ٖٛیٍٓ سب وؼبیی و ٝسبكبال ایٗ ٔٛضٛع س ٚدسن ٘ىشدٖ
ؿفبفشش ٚسٚؿٙشش دسوؾ وٙٙذ.
ث ٝعٛس وّی دس ٘ظش ثٍیشیذ یه دػشٍبٞ ٜبی كٛسی یب ٘ٛاس ٞبی ٚیذئٛیی لذیٕی س ٚو ٝاص فٙبٚسی Caset
اػشفبدٔ ٜیىٙٙذ دس ایٗ كبِز ؿٕب ٚلشی ٔٛصیه یب فیّٕی س ٚسٕبؿب ٔیىٙیذ اٌ ٝثیٗ فیّٓ و٘ٛٙی ٘یبص داؿش ٝثبؿیذ سب
ؿٙذ سشن اص ا ٖٚس ٚث ٝػّ ٛثذیٗ ٚؿٙذ فیّٓ دیٍ ٝس ٚثجیٙیذ ٔؼجٛس ٞؼشیذ سب ا ٖٚفیّٓ س ٚثیخیبَ ثـیذ ٚكبِز
Seekس ٚا٘ؼبْ ثذیٗ یؼٙی ثىـیذؽ ػّ ٛسب ث ٝفیّٓ ٔٛسد ٘ظشس ٖٛثشػیذ دس ایٗ كبِز ػُٕ سشسیجی ثشای سػیذٖ
ثٞ ٝذف كٛسر ٌشفش ٝیؼٛس ػؼشؼٛی سشسیجی ثشای سػیذٖ ثٞ ٝذف ٚاػشای اٞ ٖٚؼشؾ كبال ٔب ٚلشی دـز
وبٔذیٛسش ٔیـیٙیٓ ٚا٘شغبس داسیٓ ٚاسد ػیؼشٓ ػبُٔ و ٝؿذیٓ ؿٙذیٗ وبس س ٓٞ ٚصٔبٖ ا٘ؼبْ ثذیٓ ثشای ٔظبَ ٔٗ
ٔبیّٓ ی ٝعشف ثش٘بٔ ٝوبٔذبیُ و ٓٙی ٝعشف ٔٛصیىٌٕٛ ٛؽ ثذْ ی ٝعشفٓ ثش٘بٔٞ ٝبی Messengerآ٘الیٗ
و ... ٚ ٓٙدیٍ ٝایٙؼب ٞیؾ وغ كبَ ٚكٛكّ ٝای٘ ٛٙذاس ٜثیبد ثـی ٝٙد ٝ٘ٚد ٝ٘ٚوبس ؤ ٝٙظال ا َٚدیغبْ ثذٙٔ ٜشظش
ثـ ٝسٕ ْٛؿ ٚ ٝثؼذ ثش ٜثش٘بٔـ ٛوبٔذبیُ و ٚ ٝٙثؼذ اص ا ٓٞ ٖٚسبص ٜثیبد ٔٛصیه ٔٛسد ػاللـ Play ٛوٌٛ ٚ ٝٙؽ
ثذ ! ٜایٗ ن ٘ـذ ص٘ذٌی ػضیض ٔٗ ثشای ٕٞیٔ ٓٙب ثلض Threadسٔ ٚیبسیٓ ٚػظ و ٝسٕبْ ایٗ ٚظبیف سٚ
سٛػظ ایٗ ٔٛسد كّؾ ٔیىٙیٓ.
اال ثشای ؿشٚع وبس ٔٗ دس ٔظبِی و ٝآٔٛصؽ خٛا ٓٞداد دلیمب سٛضیق ٔیذْ و ٝؿی ث ٝؿیِٚ ٝی ػشػز وبٔذیٛسش
ٞب ا٘مذس صیبد ٜو ٝایٗ دشٚػٞ ٝب دس backgroundكٛسر ٔیٍیش٘ذ ٚؿٕب اكؼبع ٘خٛاٞیذ وشد و ٝوذْٚ
c + +با کیوتی آموزش | P a g e 95
Threadوی ٚؿ ٝصٔب٘ی اػشا ؿذ ! ِٚی ٘شیؼ ٝای و ٝخٛاٞیذ دیذ ای ٝٙوٛٔ ٝاسدی و ٝدسخٛاػز دشداصؽ
فشػشبدیٓ ثٕٞCPU ٝـ ٖٛدس كبَ اػشا ٞؼشٙذ ؿ ٖٛدس وُ CPUثش اػبع ٞ Threadب ثش٘بٔٞ ٝبسٚ
اِٛٚیز ثٙذی ٔیى ٝٙثشای ٔظبَ ث ٝدشٚػٞ ٝبی صیش دلز وٙیذ
عجك سلٛیش اٌ ٝدلز وٙیذ وّی ثش٘بٔ ٝدس كبَ اػشا ٞؼشٙذ وٞ ٝش وذٔٚـ ٖٛوّی ثٙذ ٚثؼبط ثشای خٛدؿٖٛ
د ٟٗوشدٖ ػش CPUو ٝاٌ ٝؿٙیٗ ٔٛاسد س ٚسٛػظ ٞ Threadب ٔذیشیز ٘ىٙیٓ CPUلبدس ث ٝدشداصؽ
ٞشیه اص دسخٛاػز ٞبی ٔشفبٚر ٔ ٚخشق ٕٝٞایٗ ثش٘بٔٞ ٝبی دس كبَ اػشا ث ٝكٛسر ٓٞصٔبٖ س٘ ٚخٛاٞذ
c + +با کیوتی آموزش | P a g e 96
داؿز دس كیٗ اػشا دشٚػ ٝؿٕب ثش٘بٔش ًٙٞ ٖٛخٛاٞذ وشد ! ثٙبثشایٗ اػشفبد ٜاص ٞ Threadب دس ثش٘بٔٞ ٝب خیّی
ٚاػج ٝدس وُ یؼٙی ثش٘بٔ ٝای ؤ ٝیٛٙیؼیذ اٌ Thread ٝسٛؽ ثىبس ثشد٘ ٜـذ ٜثبؿ ٝیه سیبَ ٓٞاسصؽ ٘ذاسٜ
اِجش ٝایٗ ٘ظش ؿخلی ٔٗ ٞؼز!
خت كبال ی ٝثلض دیٍ ٝثشای سٚؿٙشش وشدٖ یىی دیٍ ٝاص فٛایذ ٞ Threadب ...ث ٝعٛس وّی ٞشوذ ْٚاص ثش٘بٔٝ
ٞبی دس كبَ اػشا ثش اػبع اِٛٚیز ثٙذی Threadا ٖٚثش٘بٔ ٝدس اخشیبس CPUلشاس ٔیٍیش ٜیؼٙی اٌش اِٛٚیز
ثش٘بٔ ٗٔ Visual Studio ٝثیـشش اص ثش٘بٔٔ ٝظال ٗٔ Qt Creatorثبؿ ٚ ٝدس ایٗ كٛسر اٌش ٕٞضٔبٖ سٚی
c + +با کیوتی آموزش | P a g e 97
ٞش دٚسبی ایٟٙب ثش٘بٔ ٝای س ٚوبٔذبیُ و ٓٙا٘ٚی و ٝاِٛٚیز دشداصؽ سٚؽ ثبالسش ٞؼز ػشیؼشش ٚاثشذا دس اخشیبس
دشداصؽ ثشای CPUاسػبَ ٔیـٛد و ٝای ٓٙیىی دیٍ ٝاص فٛایذ ٞ Threadؼشؾ دغ ثجیٙیذ خیّی ٔ ٕٟٝدس
ثش٘بٔٞ ٝبیی و ٝدش اص ؿشایظ س ٛدس س ٚ ٛسٛاثغ اػشایی دائٕب دس كبَ اػشا ٞؼشٗ اص ٞ Threadب اػشفبد ٜوٙیٓ.
ث ٝعٛس وّی ٞش صٔب٘یى ٝثخٛاٞیٓ دس ثیؾ اص یه وبس سا ث ٝعٛس ٓٞصٔبٖ دیؾ ثجشیٓ ثٟشش اػز اػشفبدٜ
ٞب س ٚفشأٛؽ ٘ىٙیٓ. اص Thread
خت ثشای ؿشٚع ایٗ وبس ثٟشش اػز یه والػی ایؼبد وٙیٓ اثشذا یه دشٚط ٜاص ٘ٛع QConsole
ٚApplicationثؼذ ث ٝكٛسر صیش سٚی دشٚط ٜساػز وّیه وٙیذ ٚ Add new ٚثؼذ لؼٕز C++
ٌضی C++ Class ٝٙس ٚا٘شخبة ٔیىٙیٓ ث ٝكٛسر صیش ٚادأ ٝآٖ....
كبال اعالػبر والع سٔ ٚیذیٓ ث ٝكٛسر صیش ٘ ...بٔؾ سٔ ٚیضاسْMyThread
با کیوتیc + + آموزش | P a g e 98
#ifndef MYTHREAD_H
#define MYTHREAD_H
class MyThread
{
public:
MyThread();
};
#endif // MYTHREAD_H
.cppُٓ اص فبیٙ ایٚ
#include "mythread.h"
MyThread::MyThread()
{
}
c + +با کیوتی آموزش | P a g e 99
والع ٔٗ اػٕؾ ٞؼز MyThreadاص ٘ٛع ِٚ publicی ٔٗ ثشای ؿشٚع وبس ثب والع ٞبی Threadثٝ
والع ٘ Threadیبص داسْ ثبیذ ث ٝكٛسر صیش فشاخٛا٘یؾ و:ٓٙ
>#include <QThread
ٚثؼذ والػٓ س ٚث ٝعٛس وّی ٚػٕٔٛی اص ٘ٛع یه والع ٔ Threadـخق و ٓٙث ٝكٛسر صیش والػٓ سٚ
سغییش ٔیذْ:
//Function run
;)(void Run
;}
ٛ٘ ٓٞع والع س ٚاص ٘ٛع ٔ Threadـخق وشدْ ٕٞ ٚیٙغٛس یه سبثغ ثشای اػشای ٛ٘ Threadؿشٓ.
ٕٝٞایٗ وبسٞب دس فبیُ .hیؼٙی ٞیذس والع MyThreadثٛد .كبال ٔٗ ثذ٘ ٝسبثغ خٛدْ س ٚدس فبیُ .cpp
ٔیؼبصْ ث ٝكٛسر صیش:
)(void MyThread::Run
{
;"! qDebug() << "My Thread is running
}
كذا صدٖ سبثغ ثشٌشفش ٝؿذ ٜاص والع ٚ MyThreadایؼبد ثذ٘ ٝسبثغ ثب ٔلشٛیبر ؿبح ایٗ ثش٘بٔ ٝدس كبَ
اػشا ٔی ثبؿذ!
اِجش ٝاٌ ٝاص qDebugاػشفبدٔ ٜیىٙیذ ثٟشش ٜوالع qDebugس ٓٞ ٚفشاخٛا٘ی وٙیذ.یب ایٙى ٝثب
ٔ ٓٞstd::coutیش٘ٛیذ ایٗ وبس س ٚا٘ؼبْ ثذیٗ.
كبال ثشای ایٙى ٝثجیٙیٓ ایٗ سبثغ ػبد ٜو ٝوبسؽ ػُٕ ؿبح یه ٔشٗ ػبدٞ ٜؼز سٛػظ والع ٞبی Thread
وبس ٔیى ٝٙیب ٘ ٝث ٝكٛسر صیش دس فبیُ mainاثشذا فبیُ mythread.hس ٚفشاخٛا٘ی وٙیذ:
"#include "mythread.h
س ٚكذا ٔیض٘ٓ. كبال اصؽ یه وذی ٔیٍیشْ ٚسبثغ Run
;MyThread iThread
;)(iThread.start
با کیوتیc + + آموزش | P a g e 100
#include <QCoreApplication>
#include "mythread.h"
MyThread iThread;
iThread.start();
return a.exec();
}
:سر صیشٛ كٝ ثٝػی ٔیـٚخش
سیٛ ؿغٝ اسػبَ ثـCPU ٝ ثThread ػظٛ سٝٓ وٙ ایؼبد وٝػٚذ سب دشٙاْ ؿٛ اص وبس ٔیخّٝخت دس ایٗ ٔشك
...ٛ ٔیذْ ٔغّجٝٔسر صیش اداٛ كٝ؟ ث
:سر صیشٛ كٝٓ ثٙسؼشیف ٔیى QString عٛ٘ یه ٔشغیش اصmythread.h ُثشای والػٓ دس فبی
QString Value;
:ْ سغییش ٔیذ.ٚسر صیش دیجبي سٛ كٝ ث.cpp ُدس لؼٕز ثؼذی فبی
;MyThread iTH1
;MyThread iTH2
;MyThread iTH3
;"iTH1.Value = "T1
;"iTH2.Value = "T2
;"iTH3.Value = "T3
;)(iTH1.start
;)(iTH2.start
;)(iTH3.start
خت ٘شیؼٔ ٝیـ ٝث ٝكٛسر صیش:
خت سمشیجب ٔفٞ Thread ْٟٛب ٔـخق ؿذ كبال ٔٗ ٔیخٛاْ یه سبثغ سٚ ٚاسد Threadو ٓٙی ٝؿیض خبف
ٚػٍٙیٙی ث ٝرٕ٘ ٓٙٞیشػ ٝو ًٙٞ ٝوِٚ ٝٙی فشم وٙیذ اٌش ٔٗ سبثغ سبیٕش س ٚسٛػظ Threadفشاخٛا٘ی وٓٙ
ٚاصؽ اػشفبد ٜو ٓٙؿی ٔیـ ٝ؟ فشم وٙیذ ٞش سبثغ دیٍشی وٛ٘ ٝؿشیٗ ٚوبس ا ٖٚسبثغ ثبسٌضاسی یب ٔظال ٚكُ
ؿذٖ ث ٝی ٝػشٚس ٚآدّٛد وشدٖ ی ٝؿیضی ٞؼشؾ اٛ٘ٚلز "100ثذ ٖٚؿ ٛ٘ٛؿشا ثش٘بٔشٍٙٞ ٖٛبْ اػشای ٖٕٛٞ
سبثغ ٔ ًٙٞیى ٝٙثشای ایٙى ٝاص ٔـىُ ًٙٞوشدٖ خالف ثـیٓ ثبص ٓٞؿبس ٜوبس اػشفبد ٜاص ٞ Threadؼز ٔب
c + +با کیوتی آموزش | P a g e 102
ثب اػشفبد ٜاص ایٗ والع سبثؼی و ٝالصٔ ٝاػشا ثـ ٝس ٚث ٝداخُ Threadاسػبَ ٔیى ٓٙسب كیٗ اػشا سٛػظ
ThreadثCPU ٝثشای دشداصؽ اسػبَ ؿٛد.
ث ٝكٛسر صیش ٔٗ سٚی ٖٕٛٞدشٚط Timer ٜوبس ٔیىِٚ ٓٙی ایٙجبس كشوشؾ ٔیذْ داخُ یهThread
"#include "QThread
وذ صیش دس داخُ فشْ ِٛد دس ٖٕٛٞدشٚط Timer ٜثب سغییشار صیش:
;)timer->moveToThread(iTH
س ٚاػشا وشدْ ثب دػشٛس صیش: ٚدس خظ آخش Thread
;)(iTH->start
كبال ایٗ ثش٘بٍٔٙٞ ٝبْ اػشا ٚاسد ٔThreadیـٔ ٚ ٝـىُ ًٙٞوشدٖ دیؾ ٘خٛاٞذ آٔذ.
ثٕٞ ٝیٗ ػبدٌی ! دس كبِی و ٝدس دار ٘ز ٞضاس ٚیه سب وبس خٛد ٔٗ ا٘ؼبْ دادْ سب ٕٞیٗ سبیٕش ٔٗ ٍٙٞبٔی وٝ
دیٔ ًٙیٍشفشٓ ث ٝدسػشی ثذ ًٙٞ ٖٚوشدٖ وبس وِٚ ! ٝٙی ایٙؼب ػٕؼب 3خظ وذ ثشای خٛد Thread
٘ٛٙؿشیٓ.
ٚأب دس ساثغ ٝثب QMapیه ٘ٛع لبِت ثب اٍِٛی خبكی ٞؼشؾ و ٝلبثّیز سؼشیف ِیؼشی ٔشـىُ اص ؿٙذیٗ
سؿش ٛوّیذ ٞبی اخشلبكی سا داسد ثش فشم ٔظبَ ث ٝكٛسر صیش اٌش ثبؿذ...
>QMap<Key, T
ثشای سؼشیف وشدٖ ایٗ اٍِٛ٘ ٛع والع ٚ QMapثؼذ وّیذ ٚثؼذ سؿشٛٔ ٝسد ٘ظش ,دس وذ صیش ٔٗ ػٙبٚیٙی سٚ
سؼشیف وشدْ وٞ ٝش وذاْ ثشاثش اػز ثب وّیذ ٞبی اخشلبكی :
>#include <QMap
))(foreach(int i, Languages.keys
{
;]qDebug() << Languages[i
}
كبال دس خظ ا َٚوالع QMapس ٚكذا ٔیض٘ٓ ٚاصؽ یه وذی ٔیٍیشْ ثب ؿٙبػ ٝاص ٘ٛع ٚintلبِت آٖ اص
٘ٛع سؿش ٚ ٝثؼذ سٛػظ سبثغ insertوّیذ ٚسؿش ٝسٚ ٚاسد ٔیى ٚ ٓٙدس ٟ٘بیز سٛػظ foreachوّیذ ٞب ٚ
سؿشٞ ٝبس ٚثب ٓٞؿبح ٔیى٘ ٓٙشیؼٔ ٝیـ ٝث ٝكٛسر صیش:
با کیوتیc + + آموزش | P a g e 104
:ٓیؼیٛٙ ٔیٚسر صیش وذ سٛ كٖٝ ثٛدؿٛبی خٞ ٝ ثب سؿشٜٕشاٞ بٞ ا٘ی وّیذٛخت كبال ٔیشیٓ ػشاؽ فشاخ
: بییٟ٘ وذ
foreach(int i, Languages.keys())
{
qDebug() << Languages[i];
}
}
سؼشیف ایٗ والع دلیمب ٕٞب٘ٙذ والع ٞ QMapؼشؾ ثب سفبٚر ٞبی صیش ٘ؼجز ثQmapٝ
>#include <QHash
ثمیٔ ٝشاكُ ٕٞب٘ٙذQMap...
))(foreach(int i, Languages.keys
c + +با کیوتی آموزش | P a g e 106
{
;]qDebug() << Languages[i
}
}
هرحلِ تیست ٍ ّطتن :هعرفی ٍ کار تاQstringList
ایٗ والع اص سؿشٞ ٝب أىبٖ ایؼبد ِیؼشی اص سؿشٞ ٝبس ٚدس اخشیبس ٔب ٔیٍزاسد ثشای ٔظبَ اٌش ثخٛاٞیٓ ٔشغیشی
سؼشیف وٙیٓ و ٝكشٚف اِفجب س ٚثشأ ٖٛث ٝسشسیت ٘ـ ٖٛثذ ٜاص ایٗ والع ٔیش٘ٛیٓ وٕه ثٍیشیٓ.
ثشای فشاخٛا٘ی اص والع ِیؼز سؿش ٝای ث ٝكٛسر صیش ػُٕ ٔیىٙیٓ:
>#include <QStringList
دس وذ صیش اثشذا ٕ٘ ٝ٘ٛای اص ٔ QStringListیؼبصْ ٚیه ٔشغیش اص ٘ٛع سؿش ٝو ٝكبٚی ثخـی اص كشٚف اِفجب
ٞؼشؾ ٔـخق ٔیى.ٓٙ
;QStringList MyList
;"QString MyLine = "A,B,C,D,E,F,G
;)"MyList = MyLine.split(",
)foreach(QString Item, MyList
{
;qDebug() << Item
}
دس خظ ثؼذی ٔشغیشی و ٝاص ٘ٛع ٔ QStringListـخق وشدْ سٔ ٚمذاسدٞی ٔیى ٚ ٓٙدس كیٗ ٔمذاس دٞی
سٛػظ ٔ splitلشٛیبر سؿش ٝس ٚػذا ٌب٘ ٝدس داخُ MyListلشاس ٔیذْ ٚثؼذ سٛػظ دػشٛس foreach
ٔشغیشی س ٚث ٝػٛٙاٖ آیشٓ اص ٘ٛع سؿش ٝدس ٘ظش ٌشفش ٚ ٝؿبح ٔیى٘ ٚ ٓٙشیؼ ٝث ٝكٛسر صیش خٛاٞذ ثٛد...
""A
""B
""C
""D
""E
""F
""G
یب ٔظال ٔٗ ٔیخٛاْ ٔمذاس كشف Cس ٚثشاثش ثب C++سغییشؽ ثذْ یؼٙی كشف Cس ٚثب C++ػبیٍضیٗ وٓٙ
ث ٝساكشی سٛػظ دػشٛس صیش:
;)"MyList.replaceInStrings("C", "C++
;QStringList MyList
;"QString MyLine = "A,B,C,D,E,F,G
;)"MyList = MyLine.split(",
;)"MyList.replaceInStrings("C", "C++
""A
""B
""C++
""D
""E
""F
""G
هرحلِ تیست ٍ ًْن :هعرفی ٍ کار تا الگَریتن ّای هرتة سازی
ٕ٘ٛٞغٛس ؤ ٝیذ٘ٚیذ دس C++اٍِٛسیشٓ ٞبی ٔشست ػبصی ٔشفبٚسی ٚػٛد داس ٜو ٝدس ایٗ ٔیبٖ Qtدس والع
ٞبی خٛدؽ اٍِٛسیشٓ ٞبی ٔشست ػبصی خٛدؽ س ٚاسائ ٝداد ...ٜو ٝیىی اص ػبد ٜسشیٗ ایٟٙب
سبثغ ٞ qSortؼشؾ.
ثشای ٔظبَ ٔٗ اػذاد صیش س ٚو ٝث ٝكٛسر صیش أٚذٔ ٜیخٛاْ ٔشست و:ٓٙ
4
8
2
1
6
3
خت وذ س ٚث ٝكٛسر صیش ٔیٛٙیؼیٓ...
;QList<int> MyList
{ )foreach(int i, MyList
1
2
3
4
6
8
هرحلِ سی ام :هعرفی ٍ کار تا الگَریتن ّای جستجَ کٌٌذُ
یىی اص ٔٛاسدی و ٝث ٝدسد ٔیخٛس ٜاٍِٛسیشٓ ػؼشؼٞ ٛؼز و ٝدس ایٙؼب سٛػظ سبثغ ٔ qFindیش٘ٛیٓ ث ٝساػشی
ٔمذاس ٔٛسد ٘ظش س ٚدس كٛسر ٚػٛد دس ِیؼز دادٞ ٜب دیذا وٙیٓ.
;QList<int> MyList
;MyList << 12 << 0 << 133 << 64 << 512 << 128
QList<int>::const_iterator MyIterator = qFind(MyList.begin(), MyList.end(),
;)64
else
{
;"!qDebug() << "Not found
}
اثشذا ٔشغیشْ س ٚاص ٘ٛع یه ٘ٛع ِیؼز ػذدی دس ٘ظش ٔیٍیشْ ٚدس خظ ثؼذ ٔمبدیش ٔٛسد ٘ظشْ سٚ ٚاسد ِیؼز
ٔیى.ٓٙ
كبال دس خظ ثؼذی ػُٕ ػؼشؼ ٛیؼٙی سٛػظ یه ِیؼز ػذیذی اص اػذاد ایؼبد وشد ٚ ٜسٛػظ
سبثغ ٔ qFindمذاس 64س ٚاص ٘مغ ٝآغبص ٔمبدیش ٔٛػٛد دس ِیؼز سب ا٘شٟبی ا ٖٚس ٚثشسػی ٔیى.ٓٙ
دس خظ ثؼذی یه دػشٛس ؿشعی ثشػىغ آٚسدْ و ٝدس ایٙؼب ٔـخق وشدْ اٌش ٔمذاس ٔٛسد ٘ظش ٔٗ دس ِیؼز
ٔٛػٛد ثٛد دیغبْ Foundسٕٞ ٚشا ٜثب ٔمذاس یبفز ؿذ ٜؿبح وٗ دس غیش ایٙلٛسر دیغبْ Not foundسٚ
ؿبح خٛاٞذ وشد ٚدس ٟ٘بیز ٘شیؼ ٝث ٝكٛسر صیش خٛاٞذ ثٛد...
Found = 64
هرحلِ سی یکن :هعرفی ٍ کارToolTip
c + +با کیوتی آموزش | P a g e 109
ٞToolTipب ؿی ٞؼشٗ ٚث ٝؿ ٝدسدی ٔیخٛسٖ ؟ دس وُ ثیـششیٗ وبسثشد ایٗ ٔٛسد دس ٍٙٞبْ Mouse
Hoverثش سٚی اؿیبء ٔٛػٛد سٚی ساثظ وبسثشی ٚفشْ ٞبی ؿٕبػز و ٝثشای اػشفبد ٜاص ایٗ أىب٘بر ث ٝسٚؽ
ٞبی صیش ػُٕ خٛاٞیٓ وشد...
دس ایٗ ثخؾ ٔٗ ٔیخٛاْ یه اػشبیُ صیجب ٕٞشا ٜثب ٔشٗ ٔٛسد ٘ظش ثشای ToolTipوٙششِٓ سٚی فشْ اخشلبف
ثذْ سٛػظ دػشٛس ٔ setStyleSheetیش ٓٙ٘ٛاػشبِٓ س ٚثش اػبع وذ ٞبی CSSث ٝؿیئ ٔٛسد ٘ظشْ اخشلبف
ثذْ.
ٚسٛػظ دشادشسی ٔ setToolTipیشٔ ٓ٘ٛلشٛیبٖ ToolTipس ٚث ٝوٙششِٓ اخشلبف ثذْ ث ٝكٛسر صیش...
داخُ فشْ ِٛد وذ صیش سٔ ٚیٛٙیؼٓ اِجش ٝاػٓ وٙششِٓ سٔ ٚیضاسْMyButton.
ui->MyButton->setStyleSheet(" QToolTip{text-align:left;color:
#ffffff;background-color: #006700;font-family: Tahoma ,'PT Sans',
'Helvetica', arial, serif; border: 2px solid #d5def2;padding: 2px;opacity:
;)"};200
ui->MyButton->setToolTip("<br><font
;)"!color='#C90'><b>C++</b></font><br>Welcome to C++ Qt Tutorial
اكال ٕ٘یخٛاْ آٔٛصؽ CSSثذْ ؿٚ ٖٛالؼب كبِـ٘ ٛذاسْ ِٚی ثبیذ ث ٝی٘ ٝىشٕٟٔ ٝی اؿبس ٜو ٓٙوٚ ٝلشی اػشبیّی
س ٚسٚی وٙششَ یب فشٔش ٖٛػز ٔیىٙیذ كشٕب سخلیلؾ ثذیٗ ثٞ ٝذفی و ٝداسیذ ! ٔظال ٔٗ دس اػشبیُ ایٗ ثخؾ
ٌفشٓ }{ٞ ٚ QToolTipش وذی و ٝداخّؾ ثٛٙیؼٓ ٔخشق ToolTipخٛاٞذ ثٛد دس غیش ایٙلٛسر اٌش
ثذٔ ٖٚـخق وشدٖ آثؼىز ٞبی ٔٛسد ٘ظشس ٖٛاػشبیّی س ٚاخشلبف ثذیٗ دس آٖ كٛسر ٕٝٞلؼٕز ٞبی
وٙششَ اص اػشبیُ ؿٕب اسص خٛاٙٞذ ثشد.
ی ٝسٛضیلی ثذْ دس ساثغ ٝثب عشف ٚاػشبیُ ایٗ ٔٛسد و ٝسٕبٔی ایٟٙب ٔشثٛع ٝث ٝوذٞبی CSSاٌ ٝاؿخبكی وٝ
دس عشاكی ٚة ٚوبس ثب ٟٔ CSSبسر ٚسؼشث ٝوبفی داسٖ ٔیذ ٗ٘ٚو ٝؿ ٝوبسٞبیی ٔیـ ٝوشد ثب ایٗ!!! CSS
هرحلِ سی دٍم :هعرفی ٍ کار تا ضثکِ /استفادُ از پرٍتکل ّای FTPٍ HTTP
دس ایٙشش٘ز ٕٞب٘ٙذ ػبیش ؿجىٞ ٝبی وبٔذیٛسشی اص دشٚسىُ ٞبی ٔشؼذد ٚثب اٞذاف ٔخشّف اػشفبدٔ ٜی ٌشددٞ .ش
دشٚسىُ اص یه ػبخشبس خبف ثشای اسػبَ ٚدسیبفز اعالػبر $ثؼشٞ ٝبی اعالػبسی #اػشفبدٕٛ٘ ٜد ٚ ٜسشافیه
ٔخشق ث ٝخٛد سا دس ؿجى ٝایؼبد ٔی ٕ٘بیذ ( . HTTPثشٌشفش ٝاص Hyper Text Transfer
) ،Protocolیىی اص ٔشذاِٚششیٗ دشٚسىُ ٞبی الی application ٝاػز ؤ ٝؼئِٛیز اسسجبط ثیٗ
ػشٚیغ ٌیش٘ذٌبٖ ٚػشٚیغ دٙٞذٌبٖ ٚة سا ثشػٟذ ٜداسد.
ث ٝعٛس وّی دس ایٗ لؼٕز ٔیشػیٓ ثٛٔ ٝاسد ؿجى ٚ ٝوبس ثب دشٚسىُ ٞب ...ٚ
دس C++وشبثخب٘ٞ ٝبی Qtوالع ٞبیی س ٚثشای ؿجى ٝداس٘ذ و ٝثشای فشاخٛا٘ی والع ٞب ث ٝثش٘بٔ ٝاثشذا
الصٔ ٝدس فبیُ ٛٔ .proػٛد دس دشٚط ٜوذ صیش س ٚاضبف ٝوٙیٓ:
QT += network
اِجشٔ ٝیش٘ٛیذ دس ادأٛٔ QT += ٖٕٛٞ ٝػٛد ث ٝایٗ كٛسر ػُٕ وٙیذ:
یه سٛضیلی ثذْ و ٝؿشا اص ٕ٘بد ٞبی = +اػشفبدٔ ٜیىٙیٓ دِیّؾ ایٔ ٚ ٝٙـخل ٝو ٝدػشٛس افضٚدٖ س ٚدادیٓ
ث QT ٝسب سفش٘غ ٔٛسد ٘ظش سٚ ٚاسد دشٚطٔ ٜیىٙذ ِٚی اٌ ٝثخٛاْ سفش٘غ ٔٛسد ٘ظش س ٚكزف یب اص دشٚط ٜثیشٖٚ
و ٓٙؿغٛس ؟ ایٗ ٔٛلز ثبیذ ثٍٓ = -ثٔ ٝظبَ صیش سٛػ ٝوٙیذ:
با کیوتیc + + آموزش | P a g e 111
QT += core network
QT -= gui
ٝش ساثظ وبسثشی ثٞ یبٚ بٞ widget ُٔ ؿبٝ وgui ٝط ثٛبی ٔشثٞ سفش٘غْٝ ٔـخق وشدْ وٚدس خظ د
.ٓ ٘ذاسیgui سفش٘غٝی ٘یبصی ثٙ كزف وٗ یؼٜطٚ اص دشٚؼشؾ سٞ Console ػض
.ٓٙ ٔیىٝطْ اضبفٚ دشٝ ثٚ سnetwork ضیلبر دس دؼز لجّی سفش٘غٛ سلز سٚ ٓٙ ایؼبد ٔیىٚطْ سٚخت دش
C++ ٝٙ ٌضیFile and Classes لؼٕزٚ Add New ٚ ٓٙطْ ساػز وّیه ٔیىٚی دشٚكبال س
.ٓٙسر صیش ٔـخق ٔیىٛ كٝ ثٚ اعالػبسؾ سٚ ٓٙ ا٘شخبة ٔیىٚسClass
ٚ یذسٞ ُ فبیٚ ٓٙسر صیش ایؼبد ٔیىٛ كٝٓ ثٙ ایؼبد وHTTP ُسىٚاثشذا ٔٗ ٘یبص داسْ یه والع ثشای دش
.ٓٙ ٔیىٜ آٔبدٚاكّی س
#ifndef MYHTTP_H
#define MYHTTP_H
#include <QObject>
#include <QtGlobal>
#include <QObject>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QFile>
#include <QTimer>
public:
explicit MyHttp(QObject *parent = 0);
virtual ~MyHttp();
signals:
void addLine(QString qsLine);
void downloadComplete();
void progress(int nPercentage);
public slots:
void download(QUrl url);
void pause();
void resume();
با کیوتیc + + آموزش | P a g e 112
private slots:
void download();
void finishedHead();
void finished();
void downloadProgress(qint64 bytesReceived, qint64 bytesTotal);
void error(QNetworkReply::NetworkError code);
void timeout();
private:
QUrl _URL;
QString _qsFileName;
QNetworkAccessManager* _pManager;
QNetworkRequest _CurrentRequest;
QNetworkReply* _pCurrentReply;
QFile* _pFile;
int _nDownloadTotal;
bool _bAcceptRanges;
int _nDownloadSize;
int _nDownloadSizeAtPause;
QTimer _Timer;
};
#endif // MYHTTP_H
بیٞ سلز والعٚسد ٘یبص سٛٔ اثغٛ سٚ والعHTTP خت دس ایٗ والع ٔٗ ثشای
.ْایؼبد وشدQNetworkAccessManager / QNetworkRequest / QNetworkReply
: سر صیش اػزٛ كٝشوذاْ ثٞ ٝظیفٚ ٝو
Qt اثغ اػبػیٛ سٚ بٞ یذسٞ یٓ صیشاٙا٘ی وٛ فشاخٚ ایٗ والع سٝٔب الصٟلشٚ ثؼضیQtGlobal : والع
س وّی اصٛ عٝؼز سب ثٞ ٓٞ بی دیٍشیٞ ؽٚ سٝ اِجشٝؼشؾ وٞ بػبییٙد وشدٖ ایٗ والع لبثُ ؿّٛىٙػظ ایٛس
ٓیٞاٛضیلبسی خٛب سٞ ثؼذٝیٓ وٌٙیشی وّٛ ػٜطٚبی ٔخشّف دشٞ اسد دس لؼٕزٛٔ ٗیٙد وشدٖ ؿّٛىٙش ثبس ایٞ
.داد
c + +با کیوتی آموزش | P a g e 113
والع ٔ QObject :ـخل ٝو ٝثشای ایؼبد ٚؿٙبػبیی آثؼىز ٞب اػشفبدٔ ٜیـٛد.
والع QFile :ثشای وبس ثب فبیّٟب ٔٛسد ٘یبص ٞؼشؾ ث ٝػٛٙاٖ ٔظبَ اٌ ٝلشاس ٞؼز فبیّی س ٚداّ٘ٛد وٙیٓ ٚ
ػُٕ ٔظال وذی س ٚسٚی فبیُ داّ٘ٛد ؿذ ٜا٘ؼبْ دٞیٓ ث ٝایٗ والع ٘یبص اػبػی خٛاٞیٓ داؿز.
والع QTimer :ثشا وبس ثب صٔبٖ ٔٛسد اػشفبد ٜلشاس ٔیٍیش ٜو ٝدس ایٗ ٔظبَ اصؽ ثشای ٔـخق ػبصی صٔبٖ
دسیبفز ٚاسػبَ اػشفبد ٜخٛاٞیٓ وشد.
خت اثشذا ٔٗ والػٓ س ٚاص ٘ٛع ػٕٔٛی ٚآثؼىز ٔـخق وشدْ ث ٝكٛسر صیش:
Q_OBJECT
دس خظ ثؼذی سؼشیف وّی والع ٔـخق ؿذ ٚ ٜثؼذ ػیٍٙبَ /اػالر ٞب ٔ ٚشغیش ٞبی ٔٛسد ٘یبص اػٕبَ ٌشدیذٜ
اػز.
سب ایٙؼب وبس ٔب ثب فبیُ MyHttp.hسٕٔ ٝ٘ٛیشیٓ دس دؼز ثؼذی وبس ثب فبیُMyHttp.cpp
خت فبیُ ٔ cppب كبٚی وذ ٞبی صیش خٛاٞذ ثٛد و ٝدس ایٗ فبیُ ٔب ثذ٘ ٝسٛاثغ خٛدٔ ٖٛس ٚوبُٔ وشدیٓ ٚ
ثشای داّ٘ٛد فبیّٕٕٞ ٖٛشا ٜثب اعالػبر دلیك اسػبَ ٚدسیبفز الصْ داسیٓ ! اؿبس ٜو ٓٙو ٝخیّی ػبد ٜسش اص ایٟٙب
ٔیـ ٝوذ داّ٘ٛد فبیُ س ٚسٛػظ ٛ٘ httpؿز ِٚی ٘یبص د٘ٚؼشٓ وٕی دشٚط ٜدیـیذ ٜسش س ٚا٘شخبة و ٓٙسب ٘شیؼٝ
كبكُ اص فبیُ داّ٘ٛد ؿذٕٞ ٜشا ٜثب دىیغ ٞبی اسػبِی ٚدسیبفشی ٕٞب٘ٙذ ػیؼشٓ اسػبَ ٚدسیبفز وٙٙذٜ
ٔTeamViewerـخق ثـ ٝؤٕ ٝى ٝٙخیّی ٞب ث ٝایٗ ٘یبص داؿش ٝثبؿٙذ.
#include ""myhttp.h
#include ><QFileInfo
#include ><QDateTime
#include ><QDebug
با کیوتیc + + آموزش | P a g e 114
MyHttp::MyHttp(QObject *parent) :
QObject(parent)
, _pManager(NULL)
, _pCurrentReply(NULL)
, _pFile(NULL)
, _nDownloadTotal(0)
, _bAcceptRanges(false)
, _nDownloadSize(0)
, _nDownloadSizeAtPause(0)
{
}
MyHttp::~MyHttp()
{
if (_pCurrentReply != NULL)
{
pause();
}
}
_URL = url;
{
QFileInfo fileInfo(url.toString());
_qsFileName = fileInfo.fileName();
}
_nDownloadSize = 0;
_nDownloadSizeAtPause = 0;
_pCurrentReply = _pManager->head(_CurrentRequest);
_Timer.setInterval(5000);
_Timer.setSingleShot(true);
connect(&_Timer, SIGNAL(timeout()), this, SLOT(timeout()));
_Timer.start();
void MyHttp::pause()
{
qDebug() << "pause() = " << _nDownloadSize;
if (_pCurrentReply == NULL)
{
return;
}
_Timer.stop();
disconnect(&_Timer, SIGNAL(timeout()), this, SLOT(timeout()));
disconnect(_pCurrentReply, SIGNAL(finished()), this, SLOT(finished()));
disconnect(_pCurrentReply, SIGNAL(downloadProgress(qint64, qint64)), this,
SLOT(downloadProgress(qint64, qint64)));
disconnect(_pCurrentReply, SIGNAL(error(QNetworkReply::NetworkError)),
this, SLOT(error(QNetworkReply::NetworkError)));
_pCurrentReply->abort();
// _pFile->write( _pCurrentReply->readAll());
_pFile->flush();
_pCurrentReply = 0;
_nDownloadSizeAtPause = _nDownloadSize;
_nDownloadSize = 0;
}
void MyHttp::resume()
{
qDebug() << "resume() = " << _nDownloadSizeAtPause;
download();
}
void MyHttp::download()
{
qDebug() << "download()";
if (_bAcceptRanges)
{
QByteArray rangeHeaderValue = "bytes=" +
QByteArray::number(_nDownloadSizeAtPause) + "-";
if (_nDownloadTotal > 0)
{
rangeHeaderValue += QByteArray::number(_nDownloadTotal);
}
_CurrentRequest.setRawHeader("Range", rangeHeaderValue);
}
_pCurrentReply = _pManager->get(_CurrentRequest);
_Timer.setInterval(5000);
_Timer.setSingleShot(true);
connect(&_Timer, SIGNAL(timeout()), this, SLOT(timeout()));
با کیوتیc + + آموزش | P a g e 116
_Timer.start();
void MyHttp::finishedHead()
{
_Timer.stop();
_bAcceptRanges = false;
if (_pCurrentReply->hasRawHeader("Accept-Ranges"))
{
QString qstrAcceptRanges = _pCurrentReply->rawHeader("Accept-Ranges");
_bAcceptRanges = (qstrAcceptRanges.compare("bytes", Qt::CaseInsensitive) ==
0);
qDebug() << "Accept-Ranges = " << qstrAcceptRanges << _bAcceptRanges;
}
_nDownloadTotal = _pCurrentReply-
>header(QNetworkRequest::ContentLengthHeader).toInt();
// _CurrentRequest = QNetworkRequest(url);
_CurrentRequest.setRawHeader("Connection", "Keep-Alive");
_CurrentRequest.setAttribute(QNetworkRequest::HttpPipeliningAllowedAttribut
e, true);
_pFile = new QFile(_qsFileName + ".part");
if (!_bAcceptRanges)
{
_pFile->remove();
}
_pFile->open(QIODevice::ReadWrite | QIODevice::Append);
_nDownloadSizeAtPause = _pFile->size();
download();
}
void MyHttp::finished()
با کیوتیc + + آموزش | P a g e 117
{
qDebug() << __FUNCTION__;
_Timer.stop();
_pFile->close();
QFile::remove(_qsFileName);
_pFile->rename(_qsFileName + ".part", _qsFileName);
_pFile = NULL;
_pCurrentReply = 0;
emit downloadComplete();
}
_pFile->write(_pCurrentReply->readAll());
int nPercentage =
static_cast<int>((static_cast<float>(_nDownloadSizeAtPause + bytesReceived)
* 100.0) / static_cast<float>(_nDownloadSizeAtPause + bytesTotal));
qDebug() << nPercentage;
emit progress(nPercentage);
_Timer.start(5000);
}
void MyHttp::timeout()
{
qDebug() << __FUNCTION__;
}
د یهّٛ٘د دس عی داٛػٛٔ بیٞ سٕبٔی سخذادٚ دسیبفز اعالػبر/ َدس ایٗ والع سٕبٔی اسفبلب٘ی ٔظُ اسػب
.ذ داؿزٞاٛ خٚدؽ سٛ خبف خٝظیفٚ ْش وذاٞ ٝ ایؼبد وشدیٓ وٚفبیُ س
...ٜ خجشٝؽ ؿٛیٓ سٙ سلّیُ ایٗ والع ثجیٝخت كبال ثیبییٓ ػشاؽ سؼضی
#include ""myhttp.h
#include ><QFileInfo
#include ><QDateTime
#include ><QDebug
دِیّـٚ ٖٛاظل ! ٝاِٚیش ٚكشٕب ثبیذ ایٙىّٛد وٙیٓ ؿ ٖٛثذ ٖٚا ٖٚدػششػی ث ٝوالع ٚسٛاثغ اص دیؾ سؼشیف ؿذٜ
دس فبیُ .hأىب٘ذزیش ٘خٛاٞذ ثٛد.
QFileInfoثشای وبس ثب اعالػبر فبیُ ٞؼشؾ ٌ ٚضی ٓٞ QDateTime ٝٙخت ثشای وبس ثب سبسیخ ٛصٔب٘ٛ
ایٙؼٛس ؿیضا ٚدس ٟ٘بیز QDebugثشای وبس QDebugو ٗٔ ٝخٛدْ ؿخلب اصؽ ٔشٙفشْ ؿ ٖٛخیّی
ضؼیفشش اص std::coutػُٕ ٔیىِٚ ٝٙی خت عی ایٗ آٔٛصؽ ٞب اص ٕٞیٗ سٚؽ اػشفبدٔ ٜیىٙیٓ ٞشؿٙذ ٞیؾ
ٔٛسدی ٘خٛاٞذ داؿز اٌ ٝؿٕب دس دشٚطٞ ٜبس ٖٛث ٝػبی QDebugاص ٚ iostreamفشاخٛا٘ی
std::coutثشای ؿبح ٔٛاسد ٔٛسد ٘ظشس ٖٛاػشفبد ٜوٙیذ فمظ دس ثؼضی اص ٔٛاسد ثبیذ ػُٕ سجذیُ QString
ثٞ StdString ٝب س ٚسػبیز وٙیذ ٚدس ساثغ ٝثب ٔمبدیش دیٍٕٞ ٓٞ ٝیٙغٛس...ٜ
)(MyHttp::~MyHttp
{
)if (_pCurrentReply != NULL
{
;)(pause
}
}
دس ثذ٘ ٝوالع ٚیشاٍ٘ش دػشٛس ؿشعی آٔذ ٜو ٝاٌش دبػخی اسػبَ ؿذ ٜاص عشف ػشٚس ث ٝكٛسر ٘ NULLجبؿذ
سبثغ pauseاػشا خٛاٞذ ٌشدیذ.
با کیوتیc + + آموزش | P a g e 119
_URL = url;
{
QFileInfo fileInfo(url.toString());
_qsFileName = fileInfo.fileName();
}
_nDownloadSize = 0;
_nDownloadSizeAtPause = 0;
_pCurrentReply = _pManager->head(_CurrentRequest);
_Timer.setInterval(5000);
_Timer.setSingleShot(true);
connect(&_Timer, SIGNAL(timeout()), this, SLOT(timeout()));
_Timer.start();
_URL = url;
{
QFileInfo fileInfo(url.toString());
_qsFileName = fileInfo.fileName();
}
c + +با کیوتی آموزش | P a g e 120
ایٙؼب آدسع اسػبَ ؿذ ٜسٛػظ وبسثش دسیبفز ٔ ٚـخلبر آدسع سٛػظ والع QFileInfoثشسػی ٘ ٚبْ
فبیُ اص آدسع ٌشفش ٝؿذ ٚ ٜثٔ ٝشغیش اص لجُ سؼشیف ؿذ ٜیؼٙی _qsFileNameاسػبَ ٔیـٛد.
;_nDownloadSize = 0
;_nDownloadSizeAtPause = 0
ٔمذاس 0س ٚثٔ ٝشغیش ٞبی ٕٞ ٚ _nDownloadSizeـٙیٗ _nDownloadSizeAtPauseاخشلبف
ٔیذیٓ.
كبال ایٙؼب والع اكّی ٔب و ٝاصؽ اػشفبد ٜخٛاٞیٓ وشد ٚاس وبس خٛاٞذ ؿذ ث ٝكٛسر صیش...
;)_pCurrentReply = _pManager->head(_CurrentRequest
ٔمذاس _pCurrentReplyس ٚثشاثش ٔیىٙیٓ ثب ٞیذس ) (Headerای و ٝسٛػظ والع
ٌ_CurrentRequestشفش ٝؿذ.ٜ
;)_Timer.setInterval(5000
;)_Timer.setSingleShot(true
خت ایؼب ٔب ٘یبص داسیٓ ثٔ ٝذر صٔب٘ی و ٝثبیذ سٛػظ سبیٕشٔ ٖٛایؼبد وٙیٓ ثشای ٔظبَ دس ایٙؼب ٔیبٍ٘یٗ صٔب٘ی سٚ
ثشاثش 5000هیلی ثاًیِ لشاس دادیٓ ٚدس خظ ثؼذیؾ ٔمذاس SingleShotیب ٕٞبٖ سبیٕش ؿبر و ٝیىی اص
دشادشسی ٞبی ٞ QTimerؼشؾ س ٚثشاثش ثب trueلشاس دادیٓ.
َبٍٙ ٔؼذدا ػیٚ َ اسػبtimeout ػظ سبثغٛ سٚػظ سبیٕش سٛبَ اسػبِی سٍٙ ػیconnect ػظ سبثغٛس
.ٓیٙ اسػبَ ٔیىtimeout ػظ سبثغٛ سٕٚبٖ اػالر سٞ ثبصٌـشی یب
void MyHttp::pause()
{
qDebug() << "pause() = " << _nDownloadSize;
if (_pCurrentReply == NULL)
{
return;
}
_Timer.stop();
disconnect(&_Timer, SIGNAL(timeout()), this, SLOT(timeout()));
disconnect(_pCurrentReply, SIGNAL(finished()), this, SLOT(finished()));
disconnect(_pCurrentReply, SIGNAL(downloadProgress(qint64, qint64)),
this, SLOT(downloadProgress(qint64, qint64)));
disconnect(_pCurrentReply, SIGNAL(error(QNetworkReply::NetworkError)),
this, SLOT(error(QNetworkReply::NetworkError)));
_pCurrentReply->abort();
// _pFile->write( _pCurrentReply->readAll());
_pFile->flush();
_pCurrentReply = 0;
_nDownloadSizeAtPause = _nDownloadSize;
_nDownloadSize = 0;
}
ٓ ٔـخقٞ ٔیشػیٓ اص ٘بْ سبثغٝ ایٗ خظ وٝ ثTimert.Stop ؼز ٔیشْ ػشاؽٞ اسد اثشذاییؾ ٔـخقٛٔ
ٗد ثیٛػٛٔ سٕبٔی اسسجبعبرdisconnect ػظ سبثغٛؼب سٙ دس ایٝؼز وٞ لف وشدٖ ػّٕیبرٛظیفؾ ٔشٚ
ٝظیفٚ یب ٔظالٝد ثبؿّٛ٘ فبیّی دس كبَ داٌٝسر اٛی دس ایٗ كٙذ سفز یؼٙٞاٛب اصثیٗ خٞ اػالرٚ بٞ َبٍٙػی
. ا٘ؼبْ دادٚلف سٛ ػُٕ سٝ ٔیـٝؼز وٞ ػظ ایٗ سبثغٛ سٝ ثبؿٜ اسٕبْ سػیذٝد ثّٛ٘دا
ضیلبرٛذیٗ ػغش سٙب ؿٞ ْ اص ایٗ والعٚش وذٞ الؼبٚ ٖٛ خغی ثذْ ؿٝضیلبر خظ ثٛ سیض سٝاْ سیض ثٕٛ٘یخ
ٝ ؿبیذ ٔفیذ ثبؿٝب ثذْ وٞ ٗ وبس ایٜٛضیق ٔخشلشی دس ٘لٛیٓ سٕٙیٗ ػؼی ٔیىٞ ثشاٜاخشلبكی داس
c + +با کیوتی آموزش | P a g e 122
دس ایٗ سبثغ دس وُ ثب اػشفبد ٜاص سبثغ disconnectسٕبٔی اسسجبط ٞب اص ثیٗ سفش ٚ ٝثؼذ اص آٖ دػشٛس اص ثیٗ
ثشدٖ سٕبٔی دسخٛاػز ٞب سٛػظ سبثغ abortاسػبَ ٔی ؿٛد.
دس خظ ثؼذ ایٗ ٞب یه ٌضی ٝٙای داسیٓ ث٘ ٝبْ Flushث ٝكٛسر صیش اصؽ اػشفبد ٜؿذ:ٜ
;)(_pFile->flush
ٔیذ٘ٚیذ ایٗ ؿیىبس ٔیى! ٝٙ؟ اٌش دس ع َٛدسیبفز فبیُ اعالػبر ث ٝدسػشی ٚوبُٔ ثذٞ ٖٚیـٍ ٝ٘ٛخشاثی سٚی
فیبَ ث Buffer ٝا٘شمبَ دیذا وٙٙذ دس ایٗ كبِز ٔ Flushمذاس trueس ٚاسػبَ ٔیى ٚ ٝٙدس غیش ایٙلٛسر
ٔمذاس falseس ٚاسػبَ خٛاٞذ وشد دس ٚالغ سٛػظ ایٗ ٔیش٘ٛیٓ ساكز ٔـخق وٙیٓ و ٝفبیّٕ ٖٛثب ٔٛفمیز ٚ
ثذٞ ٖٚیـٍ ٝ٘ٛخشاثی داّ٘ٛد ؿذ یب خیش!
خت ٚأب سبثغ resumeدس ثبس ٜایٗ سبثغ ٓٞایٙغٛس سٛضیق ثذْ وٚ ٝظیفؾ ادأ ٝػّٕیبر داّ٘ٛد ٞؼز
دسٚالغ ثب اػشای ایٗ سبثغ ٔؼّٕب ثبیذ سبثغ دیٍشی ث٘ ٝبْ downloadػّٕیبر خٛدؽ س ٚا٘ؼبْ ثذ ٜث ٝكٛر
صیش...
)(void MyHttp::resume
{
;qDebug() << "resume() = " << _nDownloadSizeAtPause
;)(download
}
خیّی ساكز سبثغ فشاخٛا٘ی ؿذ ٚ ٜدس ثذ٘ ٝسبثغ سٛػظ ٔ qDebugشٙیشٍٙٞ ٚبْ دسخٛاػز ادأ ٝثب ػٛٙاٖ
ٔمذاس ػبیض اص ٔشغیشی و ٝدس سبثغ ٔ pauseمذاس دٞی ؿذ ٜثٛد دسیبفز ٔیى.ٝٙ
ٚدس ٟ٘بیز ادأ ٝوبس سٛػظ اػشا ؿذٖ سبثغ downloadكٛسر خٛاٞذ ٌشفز.
خت ایٙؼب دٚثبسٔ ٜب سبثؼی ٘ٛؿشیٓ ثب ٘بْ ِٚ downloadی ثب ایٗ سفبٚر و ٝدیٍ ٝایٙؼب آدسع فبیّی ثشای
داّ٘ٛد ٕ٘یخٛاد ایٗ سبثغ وی اػشفبدٔ ٜیـ ٝاٌٌ ٝفشیٗ !؟! خت ٕٞیٗ ؿٙذ خظ لجُ ٔٗ دس ٟ٘بیز سبثغ
downloadس ٚفشاخٛا٘ی وشدْ ؿ ٖٛلشاس ثٛد ادأ ٝوبس س ٚا٘ؼبْ ثذ !!! ٜدغ ٘جبیذ اص سبثغ downloadای
و ٝؿبُٔ دبسأشش URLثٛد اػشفبدٔ ٜی وشدیٓ.
ٚأب سبثغ finishedHeadوٚ ٝظیف ٝایٗ سبثغ دسیبفز اعالػبر اص ٞیذس ٚاسػبَ ا ٖٚثشای وبسثش ٞؼشؾ.
)(void MyHttp::finishedHead
{
با کیوتیc + + آموزش | P a g e 123
_Timer.stop();
_bAcceptRanges = false;
if (_pCurrentReply->hasRawHeader("Accept-Ranges"))
{
QString qstrAcceptRanges = _pCurrentReply->rawHeader("Accept-
Ranges");
_bAcceptRanges = (qstrAcceptRanges.compare("bytes",
Qt::CaseInsensitive) == 0);
qDebug() << "Accept-Ranges = " << qstrAcceptRanges <<
_bAcceptRanges;
}
_nDownloadTotal = _pCurrentReply-
>header(QNetworkRequest::ContentLengthHeader).toInt();
// _CurrentRequest = QNetworkRequest(url);
_CurrentRequest.setRawHeader("Connection", "Keep-Alive");
_CurrentRequest.setAttribute(QNetworkRequest::HttpPipeliningAllowedAttribut
e, true);
_pFile = new QFile(_qsFileName + ".part");
if (!_bAcceptRanges)
{
_pFile->remove();
}
_pFile->open(QIODevice::ReadWrite | QIODevice::Append);
_nDownloadSizeAtPause = _pFile->size();
download();
}
...ؼشؾٞ سر صیشٛ كٝد ثّٛ٘سر وّی سبثغ اسٕبْ داٛ دس كٚ
void MyHttp::finished()
{
qDebug() << __FUNCTION__;
_Timer.stop();
_pFile->close();
QFile::remove(_qsFileName);
_pFile->rename(_qsFileName + ".part", _qsFileName);
_pFile = NULL;
_pCurrentReply = 0;
emit downloadComplete();
}
با کیوتیc + + آموزش | P a g e 124
ٗؿشیٓ ؿبح وٛ٘ ...ٝ ٘جبؿٜذٙٙ وٜ ٌٕشاٝضیلی ثذْ وٛ ثبیذ یه سٝؼز وٞ سدیٛٔ ایٗ ػب یه
سرٛ كٝ ثٝؼشؾ وٞ (MACRO) ٚػی ٔبوشٛ٘ ! __FUNCTION__ ٚ__سFUNCTION__
یٙذ وشد ! یؼٞاٛضؼیز وبسی ایٗ سبثغ اسػبَ خٚ ثبٝ ثشای ٔب اعالػبسی دس ساثغٚ ذٙٙ ػُٕ ٔیىٜدیؾ دشداص٘ذ
دٛػٛٔ بیٞ ثشای وبٔذبیّشٝؾ ٌفز وٟ ثٝ ٔیـLOG سٛ یؼٜسٛ ٔیخٜذٙٞ دٝػؼٛ سٚ یغٛ٘ ٝٔ دسد ثش٘بٝفمظ ث
.ؼشؾٞ بػبییٙ لبثُ ؿPHP ٚC++ دس
یذٙب سلمیك وٟٙ ثب ایٝ٘یذ دس ساثغٛ ٔیشٝ وٜبی اػشب٘ذاسد اص دیؾ سؼشیف ؿذٞٚؼشؾ اص ایٗ ٔبوشٞ اسد صیبدیٛٔ
__FUNCTION__ٚ: __FILE__, __LINE__,
_pFile->write(_pCurrentReply->readAll());
int nPercentage =
static_cast<int>((static_cast<float>(_nDownloadSizeAtPause + bytesReceived)
* 100.0) / static_cast<float>(_nDownloadSizeAtPause + bytesTotal));
qDebug() << nPercentage;
emit progress(nPercentage);
_Timer.start(5000);
}
..ٗٓ یه سبثؼی ثشای ٔـخق ػبصی ٔـىالر ٕٔىٞ ثبصٚ
void MyHttp::timeout()
{
qDebug() << __FUNCTION__;
}
...ٓیٙ عشاكی ٔیىٚش ؿیضی فشْ صیش سٞ ٓ لجُ اصٙ وٜاثغ اػشفبدٛاْ دس كبِز عشاكی اص ایٗ سٛخت كبال ٔٗ ٔیخ
با کیوتیc + + آموزش | P a g e 125
بیٞ آثؼىزٚ بٞ ٔشغیشٚ بٞ َبٍٙ ؿبُٔ ػیٝد وٛذ ثٞاٛسر صیش خٛ كٝیذس فشٔٓ ثٞ ُ فبیٝط ثٛبی ٔشثٞ وذ
...ؼشؾٞ ٖٛٔسد ٘ظشٛٔ
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include "downloadmanager.h"
namespace Ui {
class MainWindow;
}
public:
;)explicit MainWindow(QWidget *parent = 0
;)(~MainWindow
private slots:
;)void addLine(QString qsLine
;)void progress(int nPercentage
;)(void finished
;)(void on_downloadBtn_clicked
;)(void on_pauseBtn_clicked
;)(void on_resumeBtn_clicked
protected:
;)void changeEvent(QEvent *e
private:
;Ui::MainWindow *ui
;DownloadManager* mManager
;}
#endif // MAINWINDOW_H
ی ٝسٛضیلی دس ساثغ ٝثب وذ صیش ثذْ ؿبیذ ثشای خیّی ٞب ٔـخق ٘ـذ ٜثبؿ ٝؿی...ٝ
ایٗ ٞب لٛاػذ خبكی داسٖ ثشای خٛدؿ ٖٛدس ساثغ ٝثب ایٙؼٛس ؿیضا سلمیك وٙیذ ٔظال 0x050000سٔ ٚیش٘ٛیذ
ث ٝایٙلٛسر ٓٞثٛٙیؼیذ: 5.0
كبال ثشیٓ ػشاؽ فشْ ِٛد و ٝالصٔ ٝوذ ٞبی صیش س ٚثٛٙیؼیٓ...
با کیوتیc + + آموزش | P a g e 127
ui->urlEdit->setText("http://qt.digia.com/Static/Images/QtLogo.png");
ui->listView->reset();
QUrl url(ui->urlEdit->text());
mManager->download(url);
ui->downloadBtn->setEnabled(false);
ui->pauseBtn->setEnabled(true);
...سر صیشٛ كٝ ثPause ٕٝدو
mManager->pause();
ui->pauseBtn->setEnabled(false);
ui->resumeBtn->setEnabled(true);
...سر صیشٛ كٝ ثResume ٕٝدو
mManager->resume();
ui->pauseBtn->setEnabled(true);
ui->resumeBtn->setEnabled(false);
.h ُ فبیٛد سٛثQString عٛ٘ اصAddLine ْ ٘بٝ ٔشغیشی داؿشٓ ثٝعٛ ثشای ٕ٘بیؾ دادٖ اعالػبر ٔشثٚ
...ٓیؼیٛٙسر ثٛ ایٗ كٝ ثبیذ ثٚشٙ ایٝط ثٛ سبثغ ٔشث...یذٙعشف فشٔٓ ثٍشدیٗ دیذاؽ ٔیى
{
int nRow = ui->listView->model()->rowCount();
ui->listView->model()->insertRow(nRow);
ui->listView->model()->setData(ui->listView->model()->index(nRow, 0),
qsLine);
}
...سر صیشٛ كٝ ثProgressBar ٝط ثٛ سبثغ ٔشثٚ
void MainWindow::finished()
{
ui->downloadBtn->setEnabled(true);
ui->pauseBtn->setEnabled(false);
ui->resumeBtn->setEnabled(false);
}
....دٛذ ثٞاٛسر صیش خٛ كٝ وبس ثٝ ٘شیؼٚ
دس ساثغ ٝثب ثلض ٔ Serializationیش ٓ٘ٛای ٍٝ٘ٛٙسٛضیق د ٓٞو ٝث ٝعٛس وّی دس وبٔذیٛسش ٚػیؼشٓ ٞبی
رخیش ٜػبصی ٔلشٛیبر فبیُ ٞب ث ٝكٛسر ٞبی ٔشٙی ٚثبیٙششی رخیشٔ ٜی ؿ٘ٛذ.
كبال دس كبِز ػبدی یب ٕٞبٖ دیـفشم اٌش ؿٕب عجك ٔظبَ صیش سؿش ٝای س ٚدس داخُ یه فبیُ ثٛٙیؼیٓ...
{ )( int main
;)"ofstream myfile ("example.txt
))(if (myfile.is_open
{
;"myfile << "This is a line.\n
;"myfile << "This is another line.\n
;)(myfile.close
}
;"else cout << "Unable to open file
;return 0
}
وبٔال ث ٝكٛسر ػبدی ٔ ٚشٙی دس فبیُ ٔٛسد ٘ظش رخیش ٜخٛاٞذ ؿذ ِٚی دس كبِز ثبیٙشی سٕبٔی اؿیبء ث ٝكٛسر
یه كبِز ٔٙللش ثفشد ٚخبكی رخیشٔ ٜی ؿ٘ٛذ یؼٙی لجُ اص رخیشٔ ٜؼشمیٓ ٔلشٛیبر دس فبیُ اؿیبء ٔٛسد ٘ظش
ث ٝكٛسر Byte streamسجذیُ ؿذ ٚ ٜػذغ دس فبیُ رخیشٔ ٜی ؿٛد.
ٔب دس وُ ؿبیذ ؿٙیذ ٜثبؿیذ د ٚكبِز DeSerialization ٚ Serializationس ٚدس ثلض ثش٘بٔٝ
٘ٛیؼی ٔ ٚجلض رخیش ٜػبصی دادٞ ٜب داسیٓ و ٝث ٝػُٕ سجذیُ آثؼىز ث ٝكٛسر ثبیٙشی ٕٞبٖ
ٚSerializationث ٝػىغ آٖ ػُٕ ٔ DeSerializationیٍٛیٙذ
كبال دس ایٗ ٔظبَ ٔٗ سٚؿی س ٚثشای خٛا٘ذٖ ٛ٘ ٚؿشٗ اعالػبر دس داخُ یه فبیُ س ٚثٝ
كٛسر DeSerializationٚ Serializationث ٝوٕه والع QDataStreamسٛضیق
خٛا ٓٞداد.
ی ٝدشٚط ٜاص ٘ٛع وٙؼ َٛایؼبد ٔیىٔ ٚ ٓٙیشْ ػش اكُ ٔغّت...
C++ 1
C++ 2
C++ 3
با کیوتیc + + آموزش | P a g e 130
...سر صیشٛ كٝٓ ثٙس ثبیذ ػُٕ وٛ ! ؿغٝشی ثبؿٙسر ثبیٛ كٝ دس فبیُ ثٜ ؿذٜ رخیشٝبیز ٘شیؼٟ٘ دسٚ
#include <QCoreApplication>
#include <QFile>
#include <QString>
#include <QDebug>
#include <QMap>
void SaveObject()
{
//Save to file.
QFile iFile("c:/Test/itest.txt");
if(!iFile.open(QIODevice::WriteOnly))
{
iFile.flush();
iFile.close();
SaveObject();
c + +با کیوتی آموزش | P a g e 131
;)(return a.exec
}
اثشذا ٞیذس ٞبی QMap ٚ QFile , QStringس ٚفشاخٛا٘ی ٔیى ٓٙؿٞ ٖٛذفٓ ٘ٛؿشٗ دس داخُ یه فبیُ
ٞؼشؾ اص ٔذَ QIODevice::WriteOnlyاػشفبد ٜوشدْ.
ثؼذ أٚذْ یه سبثغ سؼشیف وشدْ و ٝاثشذا ث ٝكٛسر ػّیم ٝای یه ٘ٛع كلیق دس ٘ظش ٌشفشٓ ثشای ایٙىٝ
ٔیخٛاْ ٕٞشا ٜثب ٔشٗ ٔٛسد ٘ظشْ ٔخّٛط ثـ ٚ ٝد٘جبَ ا ٖٚیه ٘ٛع سؿش ٝای اص ٘ٛع ِ Qmapیؼز ػبخشٓ ٚیه
ػشی اعالػبر س ٚث ٝكٛسر ِیؼز ایؼبد وشدْ.
سٛػظ دػشٛس صیش یه وذی اص والع ٌ QFileشفشٓ ٔ ٚؼیش ٔٛسد ٘ظشْ س ٚثشای رخیش ٜػبصی ٔلشٛا دس فبیُ
س ٚدادْ...
;)"QFile iFile("c:/Test/itest.txt
دػشٛس ثؼذیؾ یه ؿشط سؼشیف وشدْ و ٝالب اٌ ٝفبیُ ثبص ٘ـذ دیغبْ فالٖ س ٚثذ ٜد سغیش ایٙلٛسر ثش ٚادأٝ
ٔشاكُ ...اِجش ٝدلز وٙیذ و ٝؿ ٖٛللذْ ٘ٛؿشٗ دس فبیُ ٞؼز اص اكّی سشیٗ
لؼٕشؾ ٞ QDataStreamؼز وٚ ٝظیف ٝایٗ والع فشا ٓٞوشدٖ أىبٖ ا٘شمبَ دادٞ ٜبی ثبیٙشی س ٚثٝ
ٔؼشای ٔ QIODeviceیذ ٜو ٝایٙؼب ٔٗ یه وذی اصؽ ػبخشٓ ٌ ٚفشٓ فبیّٓ س ٚدس ٘ظش ثٍیش ٚثش اػبع
٘ؼخ ٝسؼییٗ ؿذ ٜو ٝایٙؼب ٔٗ اص 5.2خٛد Qtاػشفبد ٜوشدْ س ٚثٟؾ اخشلبف دادْ و ٝاكٛال اص ٘ؼخٞ ٝبی
اِٚی Qt_1_0 ٝثٍیشیذ ثشیذ سب Qt_5_3و ٝاالٖ ٞؼز دس ِیؼشٓ ٔٛػٛدٔ ٜیش ٓ٘ٛاػشفبد ٜو.ٓٙ
خت دس خظ ثؼذیؾ ٌفشٓ iNumس ٚو ٝاص ٘ٛع ػذد كلیق ٞؼشؾ سٕٞ ٚشا ٜثب ٔ iMapخغ ٚ َٛدس iOut
ثشیض و ٝث ٝسشسیت اِٛٚیز اص ساػز ث ٝؿخ ٚاسد خٛاٞذ ؿذ.
دس خظ ثؼذی فالؽ صدْ و ٝدس دؼز ٞبی لجّی سٛضیق دادْ وبسؽ ؿی ٚ ٝدس ٟ٘بیز فبیُ س ٚثؼذ اص ٘ٛؿشٗ ٚ
فالؽ ثؼشٕؾ.
٘شیؼ ٝثبیذ دس ٔؼیش روش ؿذ ٜث ٝكٛسر ثبیٙشی رخیش ٜؿذ ٜثبؿ !!! ٝث ٝكٛسر ضٕیٕ ٝؿذٔ ٜیش٘ٛیذ دسیبفز ٚ
ثشسػیؾ وٙیذ فمظ ٔؼیش فبیُ س ٚعجك ؿشایظ خٛدس ٖٛسغییش ثذیٗ.
عجك سلٛیش ٔـبٞذٔ ٜیىٙیذ و ٝاعالػبر ث ٝكٛسر ثبیٙشی رخیش ٜؿذ ٜاػز...
٘شیؼ ٝخشٚػی كبكُ ٔخّٛط ؿذٖ ٔشٗ ٚا ٖٚػذدی ٞؼشؾ و ٝا ٖٚثبال سؼشیف وشدْ یؼٙی .64
با کیوتیc + + آموزش | P a g e 132
ٝ ثٜشی ؿذٙ اعالػبسؾ ثبیٝا٘ذٖ اعالػبر اص داخُ فبیّی وٖٛ خٕٛٞ وشدٖ یبDeSerialize خت ثشیٓ ػشاؽ
...سر صیشٛك
void ReadObject()
{
int iNum;
QMap<int,QString> iMap;
if(!iFile.open(QIODevice::ReadOnly))
{
ٔشاكُ ثؼذؽ دیٍ ٝاص ِیؼز QMapخجشی ٘یؼز ؿ ٖٛثبصْ ٞذف فمظ خ٘ٛذٖ ٞؼز دغ ٔیشْ ػش اكُ
ٔغّت...ایٙجبس ٌفشٓ ٚ QIODevice::ReadOnlyاعالػبر س ٚث ٝكٛسر یه سؿش ٝث ٗٔ ٝدس وٙؼَٛ
ٕ٘بیؾ ثذ ٜسٛػظ دػشٛس صیش...
اثشذا ٔمذاس ثبصٌـشی ػذد س ٚدس ٔشغیش iNumسیخش ٚ ٝؿبدؾ ٔیى ٚ ٓٙثشای ٔلشٛیبر سؿش ٝای ٓٞث ٝكٛسر
صیش...
ٖا٘ذٛ خٚ ٗؿشٛ٘ ٖ أىبٝ وQTextStream ْ ٘بٝب والػی داسیٓ ثٞ ٝؿشٗ دس سؿشٛ٘ ٖا٘ذٛ ثب خٝدس ساثغ
دسٝر وٚؼشؾ ثب ایٗ سفبٞ دس دؼز لجّیQDataStream ٝؽ وبسؽ ٔـبثٚ س...ٝٙٓ ٔیىٞ ثشای ٔب فشاٚس
...ٓ وبس داسیٚب ػشٞ ٝؼب ثب سؿشٙای
ا٘ذٖ ثبٛیؼٓ ثشای خٛٙ اثشذا سبثؼی ٔیٝیؼی وٛ٘ ٔیشْ ػشاؽ وذٚ َٛؼٙع وٛ٘ ٓ اصٙ ای ایؼبد ٔیىٜطٚدش
...سر صیشٛ كٝ ثWrite ْؿشٗ ثب ٘بٛ٘ یؼٓ ثشایٛٙ سبثؼی ٔیٚ Read ْ٘ب
#include <QTextStream>
#include <QFile>
Readٝط ثٛوذ ٔشث
void Read()
{
QFile MyFile("d://MyFile.txt");
if(MyFile.open(QIODevice::ReadOnly | QIODevice::Text))
{
QTextStream MyStream(&MyFile);
QString MyLine;
do
MyLine = MyStream.readLine();
qDebug() << MyLine;
while(!MyLine.isNull());
}
MyFile.close();
qDebug() << "MyFile Read.";
}
Writeٝط ثٛ وذ ٔشثٚ
void Write()
با کیوتیc + + آموزش | P a g e 135
{
QFile MyFile("d://MyFile.txt");
if(MyFile.open(QIODevice::WriteOnly | QIODevice::Text))
{
QTextStream MyStream(&MyFile);
MyStream << "Hello \r\n";
MyStream << "World \r\n";
MyStream.flush();
MyFile.close();
qDebug() << "MyFile Written.";
}
...ٓٙا٘ی ٔیىٛا٘ذٖ فشاخٛ ثؼذ خٚ ٗؿشٛ٘ َٚ سشسیت اٝ ثٚ سبثغ سٚش دٞ ٓٞسر دـز ػشٛ كٝبیز ثٟ٘ دسٚ
return a.exec();
}
ٝر وٚ فمظ ثب ایٗ سفبٜ ػبصی ؿذٜ دیبدQDataStream ذٕٙ٘بٞ ٖٛسد الصْ ٘یؼز ؿٛٔ ٗضیلبر ثشای ایٛس
.ٓ وشدیٜ اػشفبدQTextStream ع ا٘للبسیٛ٘ اص
:هسایا
c + +با کیوتی آموزش | P a g e 136
ٔ ؼٕٛال ثش٘بٔ ٝثشای وبسثش ٟ٘بیی یب ٕٞبٖ End userیه ثؼش ٝػٕغ ٚػٛس ٚوبُٔ س ٚفشأ ٓٞیىٙیذ
ٕٞ ٚـٙیٗ فبیُ اػشائی دس وٓ كؼٕششیٗ ٚفـشد ٜسشیٗ كبِز خبسع خٛاٞذ ؿذ.
وشبثخب٘ٞ ٝبی Qtس ٚؿٕب ٔیش٘ٛیذ ثذ ٖٚسغییش ٚوبٔذبیُ ٔؼذد دشٚط ٜآٖ ٞب سا ثشای سٛػؼ ٝدٙٞذٌبٖ
ثبصخٛسد داد ٚ ٜیب ث ٝسٚص سػب٘ی ٕ٘بییذ ٚكشی آٖ ٞب سا سغییش دٞیذ.
٘ یبص ثٙٔ ٝبثغ ػخز افضاسی ثؼیبس وٕی ٔیجبؿذ ثشای ٔظبَ اؿغبَ كبفظ Ram ٝثؼیبس وٕشش اص كبِز
ٔStaticیجبؿذ.
هعایة :
ثشای ٔغٕئٗ ؿذٖ اص وبسائی دسػز ثش٘بٔ ٝدس ٞش ػیؼشٓ ٞ ٚش ػىٛیی ٘یبص اػز ثبسٞب ٚثبسٞب اص ٞش
ػٛا٘جی ثش٘بٔ ٝس٘ ٚؼجز ث ٝوشبثخب٘ ٝثشسػی ٕ٘بییذ سب ٚلشی ٔٛسد اػشفبد ٜسٛػظ وبسثش یب ٕٞبٖ End -
Userلشاس ٔیٍیشد ثذ ٖٚثشٚص ٔـىُ یب خغبیی اػشا ؿٛد ٔ ,ؼٕٛال ثش سٚی ػیؼشٓ ٞبی ٘ Linuxیض
ثبیذ وشبثخب٘ٞ ٝبی ث ٝدسػشی ٘لت ٌشدد.
ؿٕب ثبیذ ٔغٕئٗ ؿٛیذ و ٝسٕبْ وشبثخب٘ٞ ٝبی ٔٛسد ٘یبص دس ػیؼشٓ ٞذف ) (End Userدس دػششع
ٞؼشٙذ دس كٛسسی و ٝثش سٚی ػیؼشٓ ٔٛسد ٘ظش دس دػششع ٘یؼشٙذ ثبیذ سا ٜكُ ٔٙبػجی ثشای اسائٝ
وشبثخب٘ٞ ٝبی ٔٛسد ٘ظش فشإ٘ ٓٞبییذ ٚخذٔبر آٖ سا دس اخشیبس وبسثش لشاس دٞیذ.
c + +با کیوتی آموزش | P a g e 137
هسایا:
ٔ ؼٕٛال ثش٘بٔ ٝثشای وبسثش ٟ٘بیی یب ٕٞبٖ End userیه ثؼش ٝػٕغ ٚػٛس ٚوبُٔ س ٚفشأ ٓٞیىٙیذ.
ثش٘بٔ ٝؿٕب ٔیشٛایٙذ ٔؼشمُ اص ٞش ٘ؼخ ٝاص وشبثخب٘ٞ ٝبی ٔٛػٛد ثش سٚی ػیؼشٓ وبسثش ثش٘بٔ ٝس ٚاػشا
وٙیذ كبال ؿ Qt4 ٝثبؿ ٝؿ Qt5.3.1 ٝثبؿٞ ٝیؾ سذاخّی ٘خٛاٞذ داؿز.
وٕی ػشیغ ٘ؼجز ثغ كبِز دایٙبٔیىی اػشا ٔیـٛد و$ ٝدس ٞ CPUبی أشٚص ؿٕب ث ٝػخشی آٖ سا
ٔشٛػ ٝخٛاٞیذ ؿذ(
هعایة:
دسخٛاػز ٞبی ثش٘بٔ ٝؿٕب ث ٝوشبثخب٘ ٝثؼیبس صیبد ٚػٍٙیٗ خٛاٞذ ثٛد صیشا وشبثخب٘ٞ ٝب ٘یض ث ٝثش٘بٔ ٝؿٕب
ٔشلُ ِ ٚیٙه ؿذٞ ٜؼشٙذ.
ٕٔ ىٗ اػز ثشای سفغ ٔـىالر وشبثخب٘ ٚ ٝسغییش /ث ٝسٚص سػب٘ی ٔ ... ٚؼجٛس ث ٝوبٔذبیُ ٔؼذد ثش٘بٔٝ
ؿٛیذ.
ٔ لشف ٔٙجغ Ramدس كٛسر دسخٛاػز ٞبی دی دس دی ٚؿٙذ ٌب٘ ٝثؼیبس صیبد خٛاٞذ ثٛد.
دس كبِز Runtimeؿٕب لبدس ث ٝاػشای pluginsسٛػظ ٘ QPluginLoaderخٛاٞیذ ثٛد.
وبٔذبیُ اػشبسیه ثذ ٖٚداؿشٗ ِیؼب٘غ ٔشثٛع ٝاص عشف ٔ Digiaؼبص ٘یؼز.
c + +با کیوتی آموزش | P a g e 138
للذ داسْ ٘ل ٜٛافضٚدٖ وشبثخب٘ٞ ٝبی دیٍ ٝس ٚدس ٔلیظ Qtسٛضیق ثذْ ثب ایٗ سٚؽ ؿٕب ٔیش٘ٛیذ ٞش وشبثخب٘ٝ
ای سٚ ٚاسد دشٚط ٜوشدٕٞ ٚ ٜشا ٜثب وشبثخب٘ Qt ٝاصؽ اػشفبد ٜوٙیذ ثشای ٔظبَ ٔٗ خٛدْ ث ٝؿخلٕٞ ٝیـ ٝساثظ
وبسثشی س ٚثب Qtعشاكی ٔیى ٚ ٓٙثشای ثش٘بٔٛ٘ ٝیؼی اكّی اص وشبثخب٘ٞ ٝبی اػشب٘ذاسد ٚ C++یب دیٍش
وشبثخب٘ٞ ٝبی اخشلبكی ٔظُ Poco ٚ Boostاػشفبدٔ ٜیى.ٓٙ
دس ایٗ آٔٛصؽ ٔٗ ٘لٚ ٜٛاسد وشدٖ وشبثخب٘ Poco ٝس ٚثشاس ٖٛسٛضیق ٔیذْ.
صثبٖ C/C++یىی اص لبثّیز ٞبیی و٘ ٝؼجز ث ٝصثبٖ ٞبی دیٍشی ٔب٘ٙذ C#یب غیش ٜداس٘ ٜبٔلذٚد ثٛدٖ
اػشفبد ٜاص وشبثخب٘ٞ ٝبی ایٗ صثبٖ ٞؼز و ٝث ٝكٛسر دیـفشم وشبثخب٘ٞ ٝبی اػشب٘ذاسد ٚاص لجُ سؼشیف ؿذ ٜدس
صثبٖ C++لبثُ اػشفبدٞ ٜؼشٙذ ٔب٘ٙذ والع ٞبی ... ٚ iostreamو ٝوبٔال دیـفشم سٚص ایٗ صثبٖ اسائٝ
ؿذ ٜاػز.
اال دس ساثغ ٝثب ایٗ ٔٛضٛع ثبیذ سٛضیلی ثذْ و ٝاٌش ثش٘بٔٛ٘ ٝیغ یب سٛػؼ ٝدٙٞذ ٜای ٘یبصٔٙذ اػشفبد ٜاص وشبثخب٘ٝ
ای ٔٙللشثفشد س ٚداسٔ ٜیش ٝ٘ٛا ٖٚس ٚث ٝصثبٖ C++اضبف ٝو ٚ ٝٙاصؽ اػشفبد ٜو ٝٙثشای ٔظبَ ٔٗ ثشای وبس ثب
ؿجى ٚ ٝایٙشش٘ز وشبثخب٘ POCO ٝس ٚسشػیق ٔیذْ دغ ثشای اػشفبد ٜاص ایٗ اثشذا ثبیذ دیىشثٙذی ٚآٔبد ٜػبصی
الصْ س ٚا٘ؼبْ ثذْ ث ٝكٛسر صیش ػُٕ ٔیى.ٓٙ
اثشذا وشبثخب٘ ٝس ٚداّ٘ٛد ٔیى ٚ ٓٙدس ٔؼیش ٔمبثُ ث ٝكٛسر دِخٛا ٜلشاس ٔیذْ( ٗٔ : C:\poco-1.5.3-all
أشٚص دس ٔلیظ ٚیٙذٚص ٞؼشٓ ثشای ٕٞیٗ سٚی ٚیٙذٚص ایٗ س ٚسٛضیق ٔیذْ سٛضیلبر دلیمب سٚی ٔلیظ
ٓٞ Linuxكذق ٔیى ٝٙسفبٚر ؿٙذا٘ی ٘ذاس ٜفمظ ثبیذ وشبثخب٘ ٝس ٚاص لجُ وبٔذبیُ وشد ٜثبؿیذ(
لجُ اص ٞش ؿیضی ثبیذ ثذ٘ٚیذ وٞ ٝش وشبثخب٘ ٝداسای ٞ include ٚ libsؼشؾ ٞش ٘ٛع وشبثخب٘ ٝای و ٝداّ٘ٛد
وٙیذ ایٗ د ٚسب ٌضی ٝٙس ٚثبیذ داؿش ٝثبؿ ٝو ٝثؼذ اص وبٔذبیُ وشبثخب٘ ٝفبیُ ٞ dll ٚ libبؽ دس ٚیٙذٚص یب
Linuxایؼبد خٛاٞذ ؿذ.
c + +با کیوتی آموزش | P a g e 139
ٔٗ ث ٝدِیُ دیـیذ ٜثٛدٖ وشبثخب٘ POCO (ٝدٛو #ٛس ٚا٘شخبة وشدْ ؿ ٖٛؿبُٔ وشبثخب٘ٞ ٝبی ٔشثٛط ثNet ٝ
ٞ ... ٚؼشؾ و ٝثشای آٔٛصؽ ٞذف ٔٗ وبس ثب ٞ Netؼز ثٙبثشایٗ دٛؿٞ ٝبی libs ٚ includeدس وٙبس ٓٞ
٘خٛاٙٞذ ثٛد ِزا ٔ includeشثٛط ثٞ ٝش وشبثخب٘ ٝدس داخُ خٛدؽ لشاس ٌشفش.ٝ
خت ثشیٓ ػش اكُ ٔغّت اثشذا ی ٝدشٚط ٜای ایؼبد ٔیى ٓٙثب ٘بْ MyLibsاص ٞش ٘ٛػی ایؼبد ٔیىٙیذ ٔ٘ ٟٓیؼز.
سٚی دشٚط ٜعجك سلٛیش ساػز وّیه وٙیذ ٌ ٚضی Add library ٝٙس ٚثض٘یذ.
٘ؼش ٜصیش ٕ٘بیٗ ٔیـ ٝو ٝؿبُٔ ٌضیٞ ٝٙبی صیش ٞؼشؾ:
ثؼذ ح
c + +با کیوتی آموزش | P a g e 140
ٌضیٔ Internal Library ٝٙشثٛط ٞؼز ثشای صٔب٘ی و ٝؿٕب وشبثخب٘ ٝس ٚدس داخُ دشٚط ٜخٛدس ٖٛایؼبد
وشدیٗ ؤ ٝؼٕٛال ٔؼیش ٚالغ سٛػظ فبیُ ٔ .proـخق خٛاٞذ ؿذ ث ٝعٛس وّی وشبثخب٘ٞ ٝبی داخّی ٚغیش
Externalسٔ ٚیش٘ٛیذ اص ایٗ لؼٕز ؿٙبػبیی وٙیذ.
ٌضی External library ٝٙاص ایٗ ٌضی ٝٙصٔب٘ی اػشفبدٔ ٜیـ ٝو ٝوشبثخب٘ٔ ٝب دس ٔؼیش دشٚطٔ ٜب ٘یؼشؾ یب ثٝ
عٛس وّی دس داخُ دشٚطٔ ٜب لشاس ٍ٘شفش ٝدلیمب ثشػىغ ٌضی ٝٙا َٚؤ ٝیـ ٖٕٛٞ ٝوشبثخب٘ ٝخبسػی یب خبسع اص
دشٚط.ٜ
ٌضیٔ ٓٞ System library ٝٙشثٛط ٔیـ ٝث ٝوشبثخب٘ٞ ٝبی ػیؼشٕی ٞؼشؾ.
ٚیه ٌضی ٝٙای ٓٞخٛاٞیٓ داؿز دس ٔلیظ ٞبی Unixو ٝث٘ ٝبْ Package Libraryلبثُ ٔـبٞذٜ
خٛاٞذ ثٛد ایٗ ٌضی ٓٞ ٝٙصٔب٘ی ٔٛسد اػشفبد ٜلشاس ٔیٍیش ٜو ٝؿٕب ٘یبص داسیذ وشبثخب٘ ٝس ٚاص عشیك ػشٚیغ
pkg-configدس ایؼشٍبٞ ٜبی Unixو ٝؿبُٔ ٞ Linux ٚ Mac OS Xؼشؾ سٙظیٓ وٙیذ.
c + +با کیوتی آموزش | P a g e 141
كبال ٔب ثب ایٗ ٞب وبسی ٘ذاسیٓ ٚدس اػشب٘ذاسد سشیٗ كبِز اص External Libraryاػشفبد ٜخٛاٞیٓ وشد
ثٙبثشایٗ ٌضی External Library ٝٙس ٚا٘شخبة ٔ Next ٚیض٘یٓ.
خت دس ایٗ لؼٕز ٔب ٌضیٞ ٝٙبیی داسیٓ ؤ ٝشثٛط ث ٝدیىشثٙذی ٔ ٚـخق وشدٖ ٔؼیش وشبثخب٘ ٝای ٞؼشؾ وٝ
اص لجُ وبٔذبیُ ٚخشٚػی ٞبی ٚ libیب dllأ ٖٚـخق ؿذ ٜاػز.
ٌضیٔ Library file ٝٙشثٛط ٞؼز ثٔ ٝؼیش فبیُ ٞبی ٔشثٛط ثٛٔ libs ٝػٛد دس وشبثخب٘ ٝثشای ٔظبَ ٔؼیش lib
ثشای وشبثخب٘ Poco ٝدس ایؼشٍبٚ ٜیٙذٚصی ٔٗ ٞؼشؾC:\poco-:
1.5.3-all\libدغ سٚی ٌضی Browse ٝٙوّیه وشد ٚ ٜایٗ ٔؼیش س ٚثب ا٘شخبة فبیُ ٔٛسد ٘ظشْ ٔظال
ٔPocoNetd.libـخق ٔیى ٓٙدس ٟ٘بیز ٔؼیش ٔیـ ٝث ٝكٛسرC:\poco-:
1.5.3-all\lib\PocoNetd.lib
c + +با کیوتی آموزش | P a g e 142
ٌضیٔ Include path ٝٙشثٛط ٞؼشؾ ث ٝدٛؿٔ Include ٝشثٛط ث ٝوشبثخب٘ ٝو ٝؿبُٔ فبیُ ٞبی .hیب
ٞ ٖٕٛٞذس ٞبػز ثٙبثشایٗ ثشای ایٙىٔ Include ٝشثٛط ث ٝوالع ٞبی Netس ٚا٘شخبة ؤ ٓٙیشْ ثٔ ٝؼیش :
C:\poco-1.5.3-all\Net\includeو ٝؿبُٔ ٞ Includeبی ٔـخق ثشای فبیُ ٞ Netؼز.
ٌضیٔ Platforms ٝٙـخق وٙٙذٔ ٜؼیش دس فبیُ .proثشای ٘ٛع ػیؼشٓ ػبُٔ ٞؼشؾ.
ٌضیٔ Linkage - Dynamic ٝٙـخق وٙٙذ ٜوشبثخب٘ ٝاص ٘ٛع Dynamicیب ٌ ٚ Staticضیٝٙ
ٞFrameworkؼشؾ.
ٚدس ٟ٘بیز ٚ Finishedػذغ دس داخُ فبیُ .proوذ ٞبی صیش س ٚخٛاٞیٓ دیذ.
INCLUDEPATH += $$PWD/../../../../../poco-1.5.3-all/Net/include
DEPENDPATH += $$PWD/../../../../../poco-1.5.3-all/Net/include
ْ ٘بٝسد ٘ظش دیؾ ٘یبصی داسیٓ ثٛٔ اص والعٜ ثشای اػشفبدPoco ٖ دسِٛی ؿٚ ؼشؾٞ ٜ ٔٗ آٔبدٝ٘وشبثخب
سر صیشٛ كٝبیز ثٟ٘ دسٝیٓ وٙ وٝ ٌفشٓ اضبفٝؿی وٚٓ ثبیذ عجك سٞ ٚ سٖٝٙ ٌضیٚدغ اFoundation
:دٛذ ثٞاٛخ
INCLUDEPATH += $$PWD/../../../../../poco-1.5.3-all/Net/include
DEPENDPATH += $$PWD/../../../../../poco-1.5.3-all/Net/include
INCLUDEPATH += $$PWD/../../../../../poco-1.5.3-all/Foundation/include
DEPENDPATH += $$PWD/../../../../../poco-1.5.3-all/Foundation/include
ٜطٚیٓ سب دشٙ وّیه ٔیىRun qmake ثؼذٚ build ٝٙی ٌضیٚ سٚ ٜ وشدSave ٚ س.pro ُخت كبال فبی
.دٛ ؿٜ آٔبدٚ ذیٙ ؿذ دیىشثٜ دادٝثب سغییشاسی و
: ؼشؾٞ ٜ اػشفبدٚ ٖ ٔـىُ لبثُ دػششػیٚ ثذٝ٘ وشبثخبٚ ٓیؼٛٙ ٔیٚثشای آصٔبیؾ وذ صیش س
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <Poco/Net/Net.h>
#include <Poco/Net/MailMessage.h>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
c + +با کیوتی آموزش | P a g e 144
)ui(new Ui::MainWindow
{
;)ui->setupUi(this
;MailMessage mail
}
)(MainWindow::~MainWindow
{
;delete ui
}
فمظ ثبصْ سبویذ ٔیىٛ٘ ٓٙع وبٔذبیّشی و ٝوشبثخب٘ ٝس ٚثبٞبؽ وبٔذبیُ وشدیٗ خیّی ٔٔ ٕٟٝظال ٔٗ اص لجُ ایٗ
وشبثخب٘ ٝس ٚثب ٘ MSVC 2013ؼخ 32 ٝثیز دس ٔذ Debugوبٔذبیُ وشدْ دغ دس ٓٞ Qtثبیذ اص ٔذ
ٚDebugوبٔذبیّش MSVC 2013ثب ٔؼٕبسی 32ثیز اػشفبد ٜوٙیذ.
٘ ٝسٟٙب ٗٔ Pocoایٗ ٔظبَ س ٚفمظ ثشای آٔٛصؽ ٔشاكُ سؼشیف وشبثخب٘ ٝصدْ ثٙبثشایٗ اص سٕبٔی وشبثخب٘ٞ ٝب ثٝ
ٕٞیٗ سٚؽ ٔیش٘ٛیذ اػشفبد ٜوٙیذ.