|
QT Designer е приложение на Trolltech (създателите на QT) за визулно построяване на приложения с QT класове. Той прилича на среди за разработка от рода на Delphi и Visual Basic, но му липсва много от тяхната функционалност. Не може да компилира кода, който създава, от тук няма интегриран към него дебъгер, освен това съдържа и някои малки бъгчета (версията ми е 3.2 под Mandrake), които не са страшни ако се внимава. Но от друга QT Designer улеснява много разработването на приложения.
![]() Фиг.1 Разполага с: 1. Редактор на свойства 2. Редактор на действия 3. Редактор на форми 4. Текстови редактор на код 5. Дърво на проекта 6. Редактор на обекта на формата 7. Различни Toolboxes. Задачата ни ще бъде да създадем просто приложение с QTDesigner, което да ни показва системна информация за компютъра. ![]() Фиг.2 Стартираме QTDesigner и обикновено ни посреща диалога: ![]() Фиг. 3 От New File/Project избираме C++ Project(Или от File->New). Потвърждаваме, избираме директорията където ще бъдат файловете на проекта и създаваме проект, например с име SysInfo. След като създадем проекта отново избираме New и създаваме MainWindow. Избираме го него, а не Dialog, защото искаме приложението ни да има меню. Стартира се Wizard. От прозереца му махаме всички отметки на Checkbox-те. Трябва да изглежда ето така: ![]() Фиг.4 Next, Finish и формата е построена. Записваме я например с име MainForm. Смаляваме формата до по-малък размер (като провлачваме ъгъл на формата). Променяме свойството caption на формата на System informacion. От менюто Tools->Views избираме ListBox и го разполaгаме в лявата част на формата, след това от Tools->Input избираме TextEdit и го поставяме в дясната част на формата. Трябва да изглежда нещо като това: ![]() Фиг.5 Забележете, че има оставено място в горната част на формата. Там ще бъде менюто. Кликваме с десният бутон на мишката върху формата. Явява контексно зависимото меню (нявсякъде "кликване с десният бутон" се разбира бутонът на мишката, който не е активен). Избираме Add Menu Item. Върху формата се появява меню. ![]() Фиг.6 Кликваме два пъти върху Menu. Сега можем да редактираме текста. Пишем &File. Повтаряме същите действия с new menu, като тук пишем &Help. & се поставя, за да се асоциира определена буква с клавиша Alt. Избираме File от формата, явява се падащо меню. Кликваме два пъти върху new item от падащото меню и пишем &Exit. ![]() Фиг.7 Аналогично под Help добавяме About. Действията, които ще извършва менюто нямат нужда от пояснения. Listbox-a ще съдържа имената на параметрите, които ще искаме да видим(CPU info, Mem info и т.н.), а TextBox ще извежда съдържанието на съответните параметри. Изменяме свойството font на textbox-a на Fixed, тъй като така информацията ще се извежда в по-подреден вид. Също readOnly на true, тъй като само ще извеждаме информация и wordWrap на NoWrap. Могат още свойства да се променят, но тези са най-необходимите. Кликваме два пъти върху listBox1 и пред нас се явява редакторът му ![]() Фиг.8 В Text въвеждаме CPU info и кликваме върху Apply. После кликваме върху New Item и въвеждаме Mem info. Кликваме върху OK. Остава да направим и последната крачка - създаване на файлът, който ще съдържа входната точка на нашата програма функцията main. От File->New избираме C++ Main-File (main.cpp). ![]() Фиг.9 Form1 (името на формата на приложението) трябва да е селектирано. OK и main.cpp е създаден. Сега можем да отворим конзолата да отидем в директорията на приложението и да въведем последователно командите: qmake -project qmake make ./SysInfo и приложението се стартира. И така, скелета на приложението е готов. Остава да добавим малко функционалност. Ще започнем с Exit. Затваряме приложението. Кликваме с десния бутон върху формата, от контексно зависимото меню избираме Connections. От диалога, който ни се явява се избираме New ![]() Фиг.10 От падащото меню за Sender избираме fileExitAction, от Signal - activated(),от Receiver - Form1,а от падащото меню за Slot - close(). Надявам се, че е интуитивно ясно какво правим по-горе. Всяко от менютата, които създадохме си създава Action. Когато това действие се активира (activated()) се казва, че Form1 трябва да го приеме и да изпълни close() за себе си. OK и компилираме. Сега, ако натиснем Exit приложението ще се затвори. Дойде времето да си зададем въпроса: А от къде ще вземаме необходимата ни актуална системна информация? За запознатите с Linux отговорък е очевиден - от /proc. От /proc/cpuinfo ще вземаме информацията за процесора, а от /proc/meminfo за паметта. С една дума ще четем съдържанието на файлове. Тъй като ще имаме абсолютния път (/proc/cpuinfo)на множество различни файлове, с които ще работим, ще ни трябва една променлива от тип стринг, в която ще пазим абсолютният път до файлът, който искаме да отворим. Добре е тази променлива да е private за класа на формата. Да кръстим тази променлива df. От ![]() Фиг.11 кликваме с десния бутон върху private избираме New и пишем QString df; Така добавихме private променлива, от тип QString, към класа на формата. QString е клас за стрингове подобен на string от STL. Следващата задача, която ще стои пред нас е като кликнем върху избрана от нас позиция в listBox1 в textEdit1 да се извежда исканата от нас информация. Отваряме диалога за редактиране на connections (Фиг.10) опитваме се да направим исканата връзка(listBox1,clicked(...) да свържем с Form1 с textEdit1), но виждаме, че не става:-) Няма необходимият слот. Щом го нямаме значи трябва да си го създадем. Кликваме с десния бутон на мишката върху формата и избираме Slots, от диалога, който се явява избираме New Function и при Function пишем SelChangetListBox(). Останалите параметри ги оставяме каквито са по подразбиране. ![]() Фиг.12 Ако кликнем два пъти върху формата ще бъдем запитани да ли искаме да създадем нов ui.h файл. Отговаряме с Yes. Отваря се текстовия редактор. Много е важно да прочетем какво пише в коментара намиращ се в началото му. Накратко тук е мястото, където ще пишем функциите си, слотовете си, конструктора и деструктора (особено за тях е важно да се прочете!). Виждаме, че имплементацията на нашия слот е вече започната ![]() Фиг.13 Сега вече можем да изградим връзката ![]() Фиг.14 Сега в Form1::SelChangeListBox() пишем if(listBox1->currentText()=="CPU info") allot("/proc/cpuinfo"); if(listBox1->currentText()=="Mem info") allot("/proc/meminfo"); където allot() е наша (потребителска) функция, която ще чете от файловете и ще ги извежда в textEdit1. Да декларираме allot(). Това може да стане от диалога за редактиране на слотове и функции Фиг.12. Избираме New Function и пишем allot( QString df ) срещу етикета Function, но сега избираме function при Type, също така Access да е private. Имплементацията на allot() вече е започната и в нея пишем //Създаваме променлива file от тип QFile асоциирана с пътя предаден от df QFile file(df); // Създаваме текстови поток свързан с file. С него ще четем данните и ще следим за достигане // на края на файла QTextStream str(&file); //Изчистваме текстовото поле от стара информация textEdit1->clear(); // Ако файлът може да се отвоори само за четене if(file.open(IO_ReadOnly)) { // Докато не сме достигнали края на файла while(!str.atEnd()) { //добаваме прочетените редове в textEdit1 textEdit1->append(str.readLine()); }; } else QMessageBox::critical(this,"Open failed","Could not open file for reading") ; //Позиционираме се в началото на текст полето textEdit1->setContentsPos(0,0); file.close(); Като не забравяме да включим #include <qfile.h> #include <qmessagebox.h> Сега можем да компилираме и да стартираме програмата. Виждаме, че като избираме с мишката CPU info или Mem info исканата информация се извежда в текстовото поле. Но би било добре, ако обхождаме listBox1 с клавиатурата (стрелки надолу и нагоре) също да може да се извежда информация. Е, няма да пишем още код. От диалога за редакция на връзки (Фиг.10) създаваме нова връзка ![]() Фиг.15 Което е и достатъчно! Ето и всички код, който написахме: #include <qfile.h> #include <qmessagebox.h> void Form1::SelChangetListBox() { if(listBox1->currentText()=="CPU info") allot("/proc/cpuinfo"); if(listBox1->currentText()=="Mem info") allot("/proc/meminfo"); } void Form1::allot( QString df ) { QFile file(df); QTextStream str(&file); textEdit1->clear(); if(file.open(IO_ReadOnly)) { while(!str.atEnd()) { textEdit1->append(str.readLine()); }; } else QMessageBox::critical(this,"Open failed","Could not open file for reading") ; textEdit1->setContentsPos(0,0); file.close(); } Обемът на горния код ни показва полезността на QT Designer, който скрива доста код от погледа на програмиста и върши доста работа вместо него. Естествено нищо не пречи да се разглежда и редактира (внимателно!) генерираният от QT Designer код. Вече би трябвало да можете да решите следните задачи: 1. Да се дадете възможност за преглед на още файлове със системна информация 2. Да реализирате (чрез QMessageBox) действие за About 3. Също така да разположите компонентите в контейнери (или да ограничи размера на формата) 4. Генериране на отчети и т.н. и т.н. Надявам се да съм бил полезен! Приятно кодиране!
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
























