Getting Started on the Commandline/mk: Difference between revisions
AutoSpider (talk | contribs) (Add "cleanup" tag) |
m (Wieland moved page GettingStartedQtMacedonian to Getting Started on the Commandline/mk: Macedonian) |
||
(4 intermediate revisions by one other user not shown) | |||
Line 1: | Line 1: | ||
{{Cleanup | reason=Auto-imported from ExpressionEngine.}} | {{Cleanup | reason=Auto-imported from ExpressionEngine.}} | ||
= Започнување програмирање во Qt = | = Започнување програмирање во Qt = | ||
Line 27: | Line 26: | ||
}</code> | }</code> | ||
Ајде да одиме низ кодот линија по линија. Во првите две линии, ние ги вклучивме заглавјата за | Ајде да одиме низ кодот линија по линија. Во првите две линии, ние ги вклучивме заглавјата за [http://doc.qt.nokia.com/4.7/qapplication.html QApplication] и [http://doc.qt.nokia.com/4.7/qtextedit.html QTextEdit], две класи кои се потребни за овој пример. Сите Qt класи имаат заглавја именувани по нив. | ||
Линијата 6 создава објект | Линијата 6 создава објект [http://doc.qt.nokia.com/4.7/qapplication.html QApplication]. Овој објект управува со ресурсите на апликацијата и мора да се стартува во било која Qt апликација во која има GUI. Потребни му се argv и argc бидејќи Qt прифаќа неколку аргументи од командна линија. | ||
Линијата 8 создава објект | Линијата 8 создава објект [http://doc.qt.nokia.com/4.7/qtextedit.html QTextEdit]. Текст едиторот е визуелен елемент во GUI. Во Qt, ние ги нарекуваме графички контроли. Примери за други графички контроли се лизгачи, етикети, и радио копчиња. Графичкиот контролер може да биде контејнер и за други графички контроли, дијалог или главниот прозорец, на пример. | ||
Линијата 9 го покажува текст едиторот на екран во сопствената рамка на прозорецот. Бидејќи графичките контроли може да служат како контејнери (на пример | Линијата 9 го покажува текст едиторот на екран во сопствената рамка на прозорецот. Бидејќи графичките контроли може да служат како контејнери (на пример [http://doc.qt.nokia.com/4.7/qmainwindow.html QMainWindow], кој има алатник, менија, статусна лента и неколку други елементи), можно е да се покаже една графичка контрола во својот прозорец. Графичките контроли, стандардно, не се видливи, функцијата [http://doc.qt.nokia.com/4.7/qwidget.html#show show()] ги прави видливи. | ||
Линијата 11 прави | Линијата 11 прави [http://doc.qt.nokia.com/4.7/qapplication.html QApplication] да влезе во јамката на настани. Кога Qt апликацијата работи, настаните се генерираат и се испраќаат до графичките контроли на апликацијата. Пример за настани се кликови на глушецот и тастатурата. Кога ќе напишете текст во текст едиторот, добива настани за притиснати копчиња на тастатурата и реагира со цртање на текстот кој бил истипкан. | ||
За да ја стартувате апликацијата, отворете Command Prompt и влезете во директориумот во кој е .cpp фајлот на програмата. Следниве команди ќе го изградат програмот. | За да ја стартувате апликацијата, отворете Command Prompt и влезете во директориумот во кој е .cpp фајлот на програмата. Следниве команди ќе го изградат програмот. | ||
Line 45: | Line 44: | ||
Ова ќе остави извршен фајл во part1 директориумот (забелешка, во Windows може да користите nmake наместо make. Исто така, извршниот фајл ќе биде сместен во part1/debug или part1/release). qmake е Qt алатка за градење., која зема конфигурациски фајл. qmake го генерира ова за нас ако се користи -project аргументот. За даден конфигурациски фајл (суфикс .pro), qmake произведува make фајл кој ќе го искомпајлира програмот за вас. Ќе разгледаме покасно како сами да напишеме .pro фајлови. | Ова ќе остави извршен фајл во part1 директориумот (забелешка, во Windows може да користите nmake наместо make. Исто така, извршниот фајл ќе биде сместен во part1/debug или part1/release). qmake е Qt алатка за градење., која зема конфигурациски фајл. qmake го генерира ова за нас ако се користи -project аргументот. За даден конфигурациски фајл (суфикс .pro), qmake произведува make фајл кој ќе го искомпајлира програмот за вас. Ќе разгледаме покасно како сами да напишеме .pro фајлови. | ||
=== Научете повеќе === | |||
Графички контроли и геометрија на прозорот- [http://doc.qt.nokia.com/4.7/application-windows.htm Window and Dialog Widgets] | |||
Настани и справување со настани - [http://doc.qt.nokia.com/4.7/eventsandfilters.html The Event System] | |||
== Додавање на копче за излез == | |||
Во реална апликација, нормално ви треб повеќе од една графичка контрола. Ние сега ќе воведеме [http://doc.qt.nokia.com/4.7/qpushbutton.html QPushButton] под текст едиторот. Со копчето ќе излезете од апликацијата кога ќе се притисне (т.е. кога ќе се кликне со глувчето). | |||
Во реална апликација, нормално ви треб повеќе од една графичка контрола. Ние сега ќе воведеме | |||
[[Image:http://doc.qt.nokia.com/4.7/images/gs2.png|http://doc.qt.nokia.com/4.7/images/gs2.png]] | [[Image:http://doc.qt.nokia.com/4.7/images/gs2.png|http://doc.qt.nokia.com/4.7/images/gs2.png]] | ||
Line 68: | Line 65: | ||
QPushButton quitButton("Quit"); | QPushButton quitButton("Quit"); | ||
QObject::connect(& | QObject::connect(&quitButton, SIGNAL (clicked()), qApp, SLOT (quit())); | ||
QVBoxLayout layout; | QVBoxLayout layout; | ||
layout.addWidget(& | layout.addWidget(&textEdit); | ||
layout.addWidget(& | layout.addWidget(&quitButton); | ||
QWidget window; | QWidget window; | ||
window.setLayout(& | window.setLayout(&layout); | ||
window.show(); | window.show(); | ||
Line 83: | Line 80: | ||
</code> | </code> | ||
Линијата 1 го вклучува | Линијата 1 го вклучува [http://doc.qt.nokia.com/4.7/qtgui.html QtGui] кој ги содржи сите Qt GUI класи. | ||
Линијата 10 го користи Qt механизмот на сигнали и слотови за да направи апликацијата да излезе кога Quit копчето ќе се притисне. Слот е функција која може да се повика со користење на нејзиното име (како буквален стринг). Сигналот е функција која кога е повикана ќе повика слотови регистрарани со него; тоа го нарекуваме поврзување или конектирање слот со сигналот и да емитираме сигнал. | Линијата 10 го користи Qt механизмот на сигнали и слотови за да направи апликацијата да излезе кога Quit копчето ќе се притисне. Слот е функција која може да се повика со користење на нејзиното име (како буквален стринг). Сигналот е функција која кога е повикана ќе повика слотови регистрарани со него; тоа го нарекуваме поврзување или конектирање слот со сигналот и да емитираме сигнал. | ||
[http://doc.qt.nokia.com/4.7/qcoreapplication.html#quit quit()] е слот од [http://doc.qt.nokia.com/4.7/qapplication.html QApplication] кој ја напушта апликацијата. [http://doc.qt.nokia.com/4.7/qabstractbutton.html#clicked clicked()] е сигнал кој [http://doc.qt.nokia.com/4.7/qpushbutton.html QPushButton] го емитира кога е притиснат. Статичката функција [http://doc.qt.nokia.com/4.7/qobject.html#connect QObject::connect()] се грижи за поврзување на слот со сигналот. SIGNAL () и SLOT() се две макроа кои ги земаат функциските потписи на сигналот и слотот за поврзување. Ние исто така треба да ги ставиме поинтерите на објектите кои треба да го праќаат и примат сигналот. | |||
Линијата 12 креира | Линијата 12 креира [http://doc.qt.nokia.com/4.7/qvboxlayout.html QVBoxLayout]. Како што спомнавме, графичките контроли може да содржат други графички контроли. Можно е да се постават границите (локацијата и големината) на децата графички контроли директно, но обично е полесно да се користи layout (распоред). Распоредот управува со границите на децата графички контроли. [http://doc.qt.nokia.com/4.7/qvboxlayout.html QVBoxLayout], на пример, ги става децата во вертикален ред. | ||
Линијата 13 и 14 додава текст едитор и копче во распоредот. Во линијата 17, го поставуваме распоредот на графичката контрола. | Линијата 13 и 14 додава текст едитор и копче во распоредот. Во линијата 17, го поставуваме распоредот на графичката контрола. | ||
Line 95: | Line 92: | ||
=== Научете повеќе: === | === Научете повеќе: === | ||
Сигнали и слотови - | Сигнали и слотови - [http://doc.qt.nokia.com/4.7/signalsandslots.html Signals & Slots] | ||
Распореди - | Распореди - [http://doc.qt.nokia.com/4.7/layout.html Layout Management], [http://doc.qt.nokia.com/4.7/widgets-and-layouts.html Widgets and Layouts], [http://doc.qt.nokia.com/4.7/examples-layouts.html Layout Examples] | ||
Графички контроли кој доаѓаат со Qt - | Графички контроли кој доаѓаат со Qt - [http://doc.qt.nokia.com/4.7/gallery.html Qt Widget Gallery], [http://doc.qt.nokia.com/4.7/examples-widgets.html Widget Examples] | ||
== Наследување на QWidget == | == Наследување на QWidget == | ||
Кога корисникот сака да излезе од апликацијата, можеби ќе сакате да се појави скок-прозорец (дијалог) што прашува дали тој/таа навистина сака да излезе. Во овој пример, го наследуваме | Кога корисникот сака да излезе од апликацијата, можеби ќе сакате да се појави скок-прозорец (дијалог) што прашува дали тој/таа навистина сака да излезе. Во овој пример, го наследуваме [http://doc.qt.nokia.com/4.7/qwidget.html QWidget], и додаваме слот на кој ќе го конектираме Quit копчето. | ||
[[Image:http://doc.qt.nokia.com/4.7/images/gs3.png|Наследување на QWidget]] | [[Image:http://doc.qt.nokia.com/4.7/images/gs3.png|Наследување на QWidget]] | ||
Line 124: | Line 121: | ||
</code> | </code> | ||
Q_OBJECT макрото мора да биде прво во дефиницијата на класата, и ја декларира нашата класа како | Q_OBJECT макрото мора да биде прво во дефиницијата на класата, и ја декларира нашата класа како [http://doc.qt.nokia.com/4.7/qobject.html QObject] (природно, таа мора да наследува од [http://doc.qt.nokia.com/4.7/qobject.html QObject]). [http://doc.qt.nokia.com/4.7/qobject.html QObject] додава неколку способности за нормалната C++ класа. Имено, името на класата и имињата на слотовите може да бидат прашувани во run-time. Исто така е можно е да се најдат типот на параметри на слотот и да се повика. | ||
Линијата 13 го декларира слотот quit(). Ова е лесно со користење на макроа за слотовите. quit() слотот сега може да биде конектиран на сигнали со одговарачки потпис (било кој сигнал кој нема параметри). | Линијата 13 го декларира слотот quit(). Ова е лесно со користење на макроа за слотовите. quit() слотот сега може да биде конектиран на сигнали со одговарачки потпис (било кој сигнал кој нема параметри). | ||
Line 150: | Line 147: | ||
Како што видовте во дефиницијата на класата, ние користиме поинтери кон нашите QObject-и (textEdit и quitButton). Како правило, треба QObject-ите да ги алоцирате на heap и никогаш да не ги копирате. | Како што видовте во дефиницијата на класата, ние користиме поинтери кон нашите QObject-и (textEdit и quitButton). Како правило, треба QObject-ите да ги алоцирате на heap и никогаш да не ги копирате. | ||
Ние сега ја користиме функцијата | Ние сега ја користиме функцијата [http://doc.qt.nokia.com/4.7/qobject.html#tr tr()] околу видливите стрингови. Оваа функцијата е потребна кога сакате да ја користите вашата апликација на повеќе од еден јазик. Нема да навлегуваме во детали, но можете да го следите Qt Linguist линкот на „научи повеќе“ табелата. | ||
=== Научи повеќе === | |||
tr() и интернационализација - [http://doc.qt.nokia.com/4.7/linguist-manual.html Qt Linguist Manual], [http://doc.qt.nokia.com/4.7/i18n-source-translation.html Writing Source Code for Translation], [http://doc.qt.nokia.com/4.7/linguist-hellotr.html Hello tr() Example], [http://doc.qt.nokia.com/4.7/internationalization.html Internationalization with Qt] | |||
QObject-и и Qt објектен модел (ова е есенцијално за да го разберете Qt) - [http://doc.qt.nokia.com/4.7/object.html Object Model] | |||
qmake и Qt системот на градба - [http://doc.qt.nokia.com/4.7/qmake-manual.html qmake Manual] | |||
=== Креирање на .pro фајл === | |||
За овој пример, ние ќе пишуваме свој .pro фајл, наместо да ја користиме qmake -project опцијата. | За овој пример, ние ќе пишуваме свој .pro фајл, наместо да ја користиме qmake -project опцијата. | ||
Line 174: | Line 169: | ||
</code> | </code> | ||
== Користење на QMainWindow == | |||
Многу апликации имаат корист од користење на [http://doc.qt.nokia.com/4.7/qmainwindow.html QMainWindow] кој користи сопствен распоред на кој можете да додадете, лента со мени, закотвени графички контроли, алатник и статусна линија. [http://doc.qt.nokia.com/4.7/qmainwindow.html QMainWindow] има централна област која може да содржи било како графичка контрола. Во нашиот случај, текст едиторот ќе го сместиме таму. | |||
Многу апликации имаат корист од користење на | |||
[[Image:http://doc.qt.nokia.com/4.7/images/gs4.png|Користење QMainWindow]] | [[Image:http://doc.qt.nokia.com/4.7/images/gs4.png|Користење QMainWindow]] | ||
Line 210: | Line 204: | ||
Ќе воведеме два нови слота кои можат да снимат и отворат документ. Ќе ги имплементираме во наредниот дел. | Ќе воведеме два нови слота кои можат да снимат и отворат документ. Ќе ги имплементираме во наредниот дел. | ||
Често, во главниот прозорец, на ист слот треба да се повикаат неколку графички контроли. Примери се елементи од менијата и копчињата на алатникот. За да се направи ова полесно Qt нуди | Често, во главниот прозорец, на ист слот треба да се повикаат неколку графички контроли. Примери се елементи од менијата и копчињата на алатникот. За да се направи ова полесно Qt нуди [http://doc.qt.nokia.com/4.7/qaction.html QAction] (акции), кој може да биде додадено на неколку графички контроли, и да биде поврзан на слот. На пример, двете [http://doc.qt.nokia.com/4.7/qmenu.html QMenu] и [http://doc.qt.nokia.com/4.7/qtoolbar.html QToolBar] можат да креираат елементи во менито и копчиња од алатникот од исти [http://doc.qt.nokia.com/4.7/qaction.html акции] . Ќе видиме како тоа функционира наскоро. | ||
Како и претходно го користиме Notepad конструкторот за да го наместиме GUI-то. | Како и претходно го користиме Notepad конструкторот за да го наместиме GUI-то. | ||
Line 217: | Line 211: | ||
Notepad::Notepad() | Notepad::Notepad() | ||
{ | { | ||
saveAction = new QAction(tr("& | saveAction = new QAction(tr("&Open"), this); | ||
saveAction = new QAction(tr("& | saveAction = new QAction(tr("&Save"), this); | ||
exitAction = new QAction(tr("E& | exitAction = new QAction(tr("E&xit"), this); | ||
connect(openAction, SIGNAL (triggered()), this, SLOT (open())); | connect(openAction, SIGNAL (triggered()), this, SLOT (open())); | ||
Line 225: | Line 219: | ||
connect(exitAction, SIGNAL (triggered()), qApp, SLOT (quit())); | connect(exitAction, SIGNAL (triggered()), qApp, SLOT (quit())); | ||
fileMenu = menuBar()->addMenu(tr("& | fileMenu = menuBar()->addMenu(tr("&File")); | ||
fileMenu->addAction(openAction); | fileMenu->addAction(openAction); | ||
fileMenu->addAction(saveAction); | fileMenu->addAction(saveAction); | ||
Line 238: | Line 232: | ||
</code> | </code> | ||
[http://doc.qt.nokia.com/4.7/qaction.html Акциите] се создадени со текст треба да се појават графичките контроли на кои ги додаваме (во нашиот случај, елементи од менито). Ако сакаме да ги додадеме на алатникот, можеме да ставиме и икони на тие акции. | |||
Кога елемент од менето е кликнат, елементот ќе ја активира акцијата, и соодветниот слот ќе биде повикан. | Кога елемент од менето е кликнат, елементот ќе ја активира акцијата, и соодветниот слот ќе биде повикан. | ||
=== Научете повеќе: === | |||
Главни прозорци и нивните класи - [http://doc.qt.nokia.com/4.7/mainwindow.html Application Main Window], [http://doc.qt.nokia.com/4.7/examples-mainwindow.html Main Window Examples] | |||
Главни прозорци и нивните класи - | MDI апликации - [http://doc.qt.nokia.com/4.7/qmdiarea.html QMdiArea], [http://doc.qt.nokia.com/4.7/mainwindows-mdi.html MDI Example] | ||
MDI апликации - | |||
== Снимање и вчитување == | |||
Во овој пример, ќе ја имплементираме функционалноста на open() и save() слотовите што ги додадовме во претходниот пример. | Во овој пример, ќе ја имплементираме функционалноста на open() и save() слотовите што ги додадовме во претходниот пример. | ||
Line 272: | Line 264: | ||
</code> | </code> | ||
Првиот чекор е да го прашаме корисникот за името на фајлот што треба да се вчита. Qt доаѓа со | Првиот чекор е да го прашаме корисникот за името на фајлот што треба да се вчита. Qt доаѓа со [http://doc.qt.nokia.com/4.7/qfiledialog.html QFileDialog], што е дијалог од кој корисникот може да избере фајл. Горната слика го покажува дијалогот во Kubuntu. Статичката функција [http://doc.qt.nokia.com/4.7/qfiledialog.html#getOpenFileName getOpenFileName()] прикажува модален дијалог, и не се враќа се дур корисникот не одбере фајл. Се враќа со патеката на фајлот на селектираниот фајл, или празен стринг ако корисникот го откаже дијалогот. | ||
Ако го имаме името на фајлот, ни ќе се обидеме да го отвориме фајлот со | Ако го имаме името на фајлот, ни ќе се обидеме да го отвориме фајлот со [http://doc.qt.nokia.com/4.7/qiodevice.html#open open()], кој враќа true ако фајлот може да се отвори. Нема да навлегуваме во справување со грешки, но можете да го следите линкот во „научете повеќе“ секцијата. Ако фајлот не може да се отвори, ние ќе користиме [http://doc.qt.nokia.com/4.7/qmessagebox.html QMessageBox] да прикажем дијалот со порака за грешка (види [http://doc.qt.nokia.com/4.7/qmessagebox.html QMessageBox] за повеќе информации). | ||
Всушност читањето на податоци е тривијално со користење на | Всушност читањето на податоци е тривијално со користење на [http://doc.qt.nokia.com/4.7/qiodevice.html#readAll readAll()], која ги враќа сите податоци на фајлот во [http://doc.qt.nokia.com/4.7/qbytearray.html QByteArray]. Методот [http://doc.qt.nokia.com/4.7/qbytearray.html#constData constData()] ги враќа сите податоци во низа од const char''', за кој [http://doc.qt.nokia.com/4.7/qstring.html QString] има конструктор. Содржината тогаш може да биде прикажана во текст едиторот. Потоа го повикуваме методот [http://doc.qt.nokia.com/4.7/qiodevice.html#close close()] за да го вратиме фајл дескрипторот назад во оперативниот систем. | ||
Сега, да продолжиме кон save() слотот: | Сега, да продолжиме кон save() слотот: | ||
Line 289: | Line 281: | ||
// error message | // error message | ||
} else { | } else { | ||
QTextStream stream(& | QTextStream stream(&file); | ||
stream << textEdit->toPlainText(); | stream << textEdit->toPlainText(); | ||
stream.flush(); | stream.flush(); | ||
Line 297: | Line 289: | ||
</code> | </code> | ||
Кога ја запишуваме содржината на текст едиторот во фајл, ние ја користиме | Кога ја запишуваме содржината на текст едиторот во фајл, ние ја користиме [http://doc.qt.nokia.com/4.7/qtextstream.html QTextStream] (текстуален тек) класата, која ја го содржи [http://doc.qt.nokia.com/4.7/qfile.html QFile] објектот. Текстуалниот тек може директно да запишува QString во фајлот; [http://doc.qt.nokia.com/4.7/qfile.html QFile] прифаќа само сурови податоци (char''') со користење на [http://doc.qt.nokia.com/4.7/qiodevice.html#write write()] во [http://doc.qt.nokia.com/4.7/qiodevice.html QIODevice]. | ||
=== Научете повеќе === | === Научете повеќе === |
Latest revision as of 17:54, 24 March 2016
This article may require cleanup to meet the Qt Wiki's quality standards. Reason: Auto-imported from ExpressionEngine. Please improve this article if you can. Remove the {{cleanup}} tag and add this page to Updated pages list after it's clean. |
Започнување програмирање во Qt
Добредојдовте во светот на Qt - мултиплатформска GUI алатка. Во овој почетнички водич, ќе го научиме базичното Qt знаење со имплементирање на едноставна Notepad апликација. По читањето на овој водич, треба да бидете подготвени да ги истражувате нашите прегледи и API документација, и да ги најдете информациите што ви се потребни за апликацијата која ја развивате.
Hello Notepad
Во овој прв пример, ние едноставно ќе креираме и прикажеме текст едитор во рамка на прозорец. Ова претставува наједноставна Qt програма која има графички интерфејс.
Еве го кодот:
#include <QApplication>
#include <QTextEdit>
int main(int argv, char *'''args)
{
QApplication app(argv, args);
QTextEdit textEdit;
textEdit.show();
return app.exec();
}
Ајде да одиме низ кодот линија по линија. Во првите две линии, ние ги вклучивме заглавјата за QApplication и QTextEdit, две класи кои се потребни за овој пример. Сите Qt класи имаат заглавја именувани по нив.
Линијата 6 создава објект QApplication. Овој објект управува со ресурсите на апликацијата и мора да се стартува во било која Qt апликација во која има GUI. Потребни му се argv и argc бидејќи Qt прифаќа неколку аргументи од командна линија.
Линијата 8 создава објект QTextEdit. Текст едиторот е визуелен елемент во GUI. Во Qt, ние ги нарекуваме графички контроли. Примери за други графички контроли се лизгачи, етикети, и радио копчиња. Графичкиот контролер може да биде контејнер и за други графички контроли, дијалог или главниот прозорец, на пример.
Линијата 9 го покажува текст едиторот на екран во сопствената рамка на прозорецот. Бидејќи графичките контроли може да служат како контејнери (на пример QMainWindow, кој има алатник, менија, статусна лента и неколку други елементи), можно е да се покаже една графичка контрола во својот прозорец. Графичките контроли, стандардно, не се видливи, функцијата show() ги прави видливи.
Линијата 11 прави QApplication да влезе во јамката на настани. Кога Qt апликацијата работи, настаните се генерираат и се испраќаат до графичките контроли на апликацијата. Пример за настани се кликови на глушецот и тастатурата. Кога ќе напишете текст во текст едиторот, добива настани за притиснати копчиња на тастатурата и реагира со цртање на текстот кој бил истипкан.
За да ја стартувате апликацијата, отворете Command Prompt и влезете во директориумот во кој е .cpp фајлот на програмата. Следниве команди ќе го изградат програмот.
qmake -project
qmake
make
Ова ќе остави извршен фајл во part1 директориумот (забелешка, во Windows може да користите nmake наместо make. Исто така, извршниот фајл ќе биде сместен во part1/debug или part1/release). qmake е Qt алатка за градење., која зема конфигурациски фајл. qmake го генерира ова за нас ако се користи -project аргументот. За даден конфигурациски фајл (суфикс .pro), qmake произведува make фајл кој ќе го искомпајлира програмот за вас. Ќе разгледаме покасно како сами да напишеме .pro фајлови.
Научете повеќе
Графички контроли и геометрија на прозорот- Window and Dialog Widgets Настани и справување со настани - The Event System
Додавање на копче за излез
Во реална апликација, нормално ви треб повеќе од една графичка контрола. Ние сега ќе воведеме QPushButton под текст едиторот. Со копчето ќе излезете од апликацијата кога ќе се притисне (т.е. кога ќе се кликне со глувчето).
http://doc.qt.nokia.com/4.7/images/gs2.png
Да го погледнеме кодот:
#include <QtGui>
int main(int argv, char'''*args)
{
QApplication app(argv, args);
QTextEdit textEdit;
QPushButton quitButton("Quit");
QObject::connect(&quitButton, SIGNAL (clicked()), qApp, SLOT (quit()));
QVBoxLayout layout;
layout.addWidget(&textEdit);
layout.addWidget(&quitButton);
QWidget window;
window.setLayout(&layout);
window.show();
return app.exec();
}
Линијата 1 го вклучува QtGui кој ги содржи сите Qt GUI класи.
Линијата 10 го користи Qt механизмот на сигнали и слотови за да направи апликацијата да излезе кога Quit копчето ќе се притисне. Слот е функција која може да се повика со користење на нејзиното име (како буквален стринг). Сигналот е функција која кога е повикана ќе повика слотови регистрарани со него; тоа го нарекуваме поврзување или конектирање слот со сигналот и да емитираме сигнал.
quit() е слот од QApplication кој ја напушта апликацијата. clicked() е сигнал кој QPushButton го емитира кога е притиснат. Статичката функција QObject::connect() се грижи за поврзување на слот со сигналот. SIGNAL () и SLOT() се две макроа кои ги земаат функциските потписи на сигналот и слотот за поврзување. Ние исто така треба да ги ставиме поинтерите на објектите кои треба да го праќаат и примат сигналот.
Линијата 12 креира QVBoxLayout. Како што спомнавме, графичките контроли може да содржат други графички контроли. Можно е да се постават границите (локацијата и големината) на децата графички контроли директно, но обично е полесно да се користи layout (распоред). Распоредот управува со границите на децата графички контроли. QVBoxLayout, на пример, ги става децата во вертикален ред.
Линијата 13 и 14 додава текст едитор и копче во распоредот. Во линијата 17, го поставуваме распоредот на графичката контрола.
Научете повеќе:
Сигнали и слотови - Signals & Slots Распореди - Layout Management, Widgets and Layouts, Layout Examples Графички контроли кој доаѓаат со Qt - Qt Widget Gallery, Widget Examples
Наследување на QWidget
Кога корисникот сака да излезе од апликацијата, можеби ќе сакате да се појави скок-прозорец (дијалог) што прашува дали тој/таа навистина сака да излезе. Во овој пример, го наследуваме QWidget, и додаваме слот на кој ќе го конектираме Quit копчето.
Да го погледнеме кодот:
class Notepad : public QWidget
{
Q_OBJECT
public:
Notepad();
private slots:
void quit();
private:
QTextEdit *textEdit;
QPushButton *quitButton;
};
Q_OBJECT макрото мора да биде прво во дефиницијата на класата, и ја декларира нашата класа како QObject (природно, таа мора да наследува од QObject). QObject додава неколку способности за нормалната C++ класа. Имено, името на класата и имињата на слотовите може да бидат прашувани во run-time. Исто така е можно е да се најдат типот на параметри на слотот и да се повика.
Линијата 13 го декларира слотот quit(). Ова е лесно со користење на макроа за слотовите. quit() слотот сега може да биде конектиран на сигнали со одговарачки потпис (било кој сигнал кој нема параметри).
Наместо поставувањето на GUI и конектирање на слотот во main() функцијата, сега тоа го правиме во Notepad конструкторот.
Notepad::Notepad()
{
textEdit = new QTextEdit;
quitButton = new QPushButton(tr("Quit"));
connect(quitButton, SIGNAL (clicked()), this, SLOT (quit()));
QVBoxLayout '''layout = new QVBoxLayout;
layout->addWidget(textEdit);
layout->addWidget(quitButton);
setLayout(layout);
setWindowTitle(tr("Notepad"));
}
Како што видовте во дефиницијата на класата, ние користиме поинтери кон нашите QObject-и (textEdit и quitButton). Како правило, треба QObject-ите да ги алоцирате на heap и никогаш да не ги копирате.
Ние сега ја користиме функцијата tr() околу видливите стрингови. Оваа функцијата е потребна кога сакате да ја користите вашата апликација на повеќе од еден јазик. Нема да навлегуваме во детали, но можете да го следите Qt Linguist линкот на „научи повеќе“ табелата.
Научи повеќе
tr() и интернационализација - Qt Linguist Manual, Writing Source Code for Translation, Hello tr() Example, Internationalization with Qt QObject-и и Qt објектен модел (ова е есенцијално за да го разберете Qt) - Object Model qmake и Qt системот на градба - qmake Manual
Креирање на .pro фајл
За овој пример, ние ќе пишуваме свој .pro фајл, наместо да ја користиме qmake -project опцијата.
HEADERS = notepad.h
SOURCES = notepad.cpp main.cpp
Ова ќе го изгради примерот.
qmake
make
Користење на QMainWindow
Многу апликации имаат корист од користење на QMainWindow кој користи сопствен распоред на кој можете да додадете, лента со мени, закотвени графички контроли, алатник и статусна линија. QMainWindow има централна област која може да содржи било како графичка контрола. Во нашиот случај, текст едиторот ќе го сместиме таму.
Да ја погледнеме новата Notepad дефиниција на класата.
#include <QtGui>
class Notepad : public QMainWindow
{
Q_OBJECT
public:
Notepad();
private slots:
void open();
void save();
void quit();
private:
QTextEdit *textEdit;
QAction *openAction;
QAction *saveAction;
QAction *exitAction;
QMenu '''fileMenu;
};
Ќе воведеме два нови слота кои можат да снимат и отворат документ. Ќе ги имплементираме во наредниот дел.
Често, во главниот прозорец, на ист слот треба да се повикаат неколку графички контроли. Примери се елементи од менијата и копчињата на алатникот. За да се направи ова полесно Qt нуди QAction (акции), кој може да биде додадено на неколку графички контроли, и да биде поврзан на слот. На пример, двете QMenu и QToolBar можат да креираат елементи во менито и копчиња од алатникот од исти акции . Ќе видиме како тоа функционира наскоро.
Како и претходно го користиме Notepad конструкторот за да го наместиме GUI-то.
Notepad::Notepad()
{
saveAction = new QAction(tr("&Open"), this);
saveAction = new QAction(tr("&Save"), this);
exitAction = new QAction(tr("E&xit"), this);
connect(openAction, SIGNAL (triggered()), this, SLOT (open()));
connect(saveAction, SIGNAL (triggered()), this, SLOT (save()));
connect(exitAction, SIGNAL (triggered()), qApp, SLOT (quit()));
fileMenu = menuBar()->addMenu(tr("&File"));
fileMenu->addAction(openAction);
fileMenu->addAction(saveAction);
fileMenu->addSeparator();
fileMenu->addAction(exitAction);
textEdit = new QTextEdit;
setCentralWidget(textEdit);
setWindowTitle(tr("Notepad"));
}
Акциите се создадени со текст треба да се појават графичките контроли на кои ги додаваме (во нашиот случај, елементи од менито). Ако сакаме да ги додадеме на алатникот, можеме да ставиме и икони на тие акции.
Кога елемент од менето е кликнат, елементот ќе ја активира акцијата, и соодветниот слот ќе биде повикан.
Научете повеќе:
Главни прозорци и нивните класи - Application Main Window, Main Window Examples MDI апликации - QMdiArea, MDI Example
Снимање и вчитување
Во овој пример, ќе ја имплементираме функционалноста на open() и save() слотовите што ги додадовме во претходниот пример.
Ќе започнеме со open() слотот:
QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "",
tr("Text Files ('''.txt);;C++ Files ('''.cpp'''.h)"));
if (fileName != "") {
QFile file(fileName);
if (!file.open(QIODevice::ReadOnly)) {
QMessageBox::critical(this, tr("Error"),
tr("Could not open file"));
return;
}
QString contents = file.readAll().constData();
textEdit->setPlainText(contents);
file.close();
}
Првиот чекор е да го прашаме корисникот за името на фајлот што треба да се вчита. Qt доаѓа со QFileDialog, што е дијалог од кој корисникот може да избере фајл. Горната слика го покажува дијалогот во Kubuntu. Статичката функција getOpenFileName() прикажува модален дијалог, и не се враќа се дур корисникот не одбере фајл. Се враќа со патеката на фајлот на селектираниот фајл, или празен стринг ако корисникот го откаже дијалогот.
Ако го имаме името на фајлот, ни ќе се обидеме да го отвориме фајлот со open(), кој враќа true ако фајлот може да се отвори. Нема да навлегуваме во справување со грешки, но можете да го следите линкот во „научете повеќе“ секцијата. Ако фајлот не може да се отвори, ние ќе користиме QMessageBox да прикажем дијалот со порака за грешка (види QMessageBox за повеќе информации).
Всушност читањето на податоци е тривијално со користење на readAll(), која ги враќа сите податоци на фајлот во QByteArray. Методот constData() ги враќа сите податоци во низа од const char, за кој QString има конструктор. Содржината тогаш може да биде прикажана во текст едиторот. Потоа го повикуваме методот close() за да го вратиме фајл дескрипторот назад во оперативниот систем.
Сега, да продолжиме кон save() слотот:
QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"), "",
tr("Text Files ('''.txt);;C++ Files ('''.cpp '''.h)"));
if (fileName != "") {
QFile file(fileName);
if (!file.open(QIODevice::WriteOnly)) {
// error message
} else {
QTextStream stream(&file);
stream << textEdit->toPlainText();
stream.flush();
file.close();
}
}
Кога ја запишуваме содржината на текст едиторот во фајл, ние ја користиме QTextStream (текстуален тек) класата, која ја го содржи QFile објектот. Текстуалниот тек може директно да запишува QString во фајлот; QFile прифаќа само сурови податоци (char) со користење на write() во QIODevice.