Getting Started on the Commandline/mk: Difference between revisions
No edit summary |
No edit summary |
||
Line 1: | Line 1: | ||
[toc align_right= | [toc align_right="yes" depth="2"] | ||
= Започнување програмирање во Qt = | = Започнување програмирање во Qt = | ||
Line 11: | Line 11: | ||
[[Image:http://doc.qt.nokia.com/4.7/images/gs1.png|Hello Notepad]] | [[Image:http://doc.qt.nokia.com/4.7/images/gs1.png|Hello Notepad]] | ||
Еве го кодот: | Еве го кодот: | ||
<code>#include <QApplication> | |||
#include <QTextEdit> | |||
int main(int argv, char *'''args) | int main(int argv, char *'''args) | ||
{ | |||
QApplication app(argv, args); | |||
QTextEdit textEdit;< | QTextEdit textEdit; | ||
textEdit.show(); | |||
return app.exec(); | |||
}</code> | |||
Ајде да одиме низ кодот линија по линија. Во првите две линии, ние ги вклучивме заглавјата за "QApplication":http://doc.qt.nokia.com/4.7/qapplication.html и "QTextEdit":http://doc.qt.nokia.com/4.7/qtextedit.html, две класи кои се потребни за овој пример. Сите Qt класи имаат заглавја именувани по нив. | |||
Линијата 6 создава објект "QApplication":http://doc.qt.nokia.com/4.7/qapplication.html. Овој објект управува со ресурсите на апликацијата и мора да се стартува во било која Qt апликација во која има GUI. Потребни му се argv и argc бидејќи Qt прифаќа неколку аргументи од командна линија. | |||
Линијата 8 создава објект "QTextEdit":http://doc.qt.nokia.com/4.7/qtextedit.html. Текст едиторот е визуелен елемент во GUI. Во Qt, ние ги нарекуваме графички контроли. Примери за други графички контроли се лизгачи, етикети, и радио копчиња. Графичкиот контролер може да биде контејнер и за други графички контроли, дијалог или главниот прозорец, на пример. | |||
Линијата 9 го покажува текст едиторот на екран во сопствената рамка на прозорецот. Бидејќи графичките контроли може да служат како контејнери (на пример "QMainWindow":http://doc.qt.nokia.com/4.7/qmainwindow.html, кој има алатник, менија, статусна лента и неколку други елементи), можно е да се покаже една графичка контрола во својот прозорец. Графичките контроли, стандардно, не се видливи, функцијата "show()":http://doc.qt.nokia.com/4.7/qwidget.html#show ги прави видливи. | |||
Линијата 11 прави "QApplication":http://doc.qt.nokia.com/4.7/qapplication.html да влезе во јамката на настани. Кога Qt апликацијата работи, настаните се генерираат и се испраќаат до графичките контроли на апликацијата. Пример за настани се кликови на глушецот и тастатурата. Кога ќе напишете текст во текст едиторот, добива настани за притиснати копчиња на тастатурата и реагира со цртање на текстот кој бил истипкан. | |||
За да ја стартувате апликацијата, отворете Command Prompt и влезете во директориумот во кој е .cpp фајлот на програмата. Следниве команди ќе го изградат програмот. | |||
<code>qmake -project | |||
qmake | |||
make</code> | |||
Ова ќе остави извршен фајл во part1 директориумот (забелешка, во Windows може да користите nmake наместо make. Исто така, извршниот фајл ќе биде сместен во part1/debug или part1/release). qmake е Qt алатка за градење., која зема конфигурациски фајл. qmake го генерира ова за нас ако се користи -project аргументот. За даден конфигурациски фајл (суфикс .pro), qmake произведува make фајл кој ќе го искомпајлира програмот за вас. Ќе разгледаме покасно како сами да напишеме .pro фајлови. | |||
h3. Научете повеќе | |||
Графички контроли и геометрија на прозорот- "Window and Dialog Widgets":http://doc.qt.nokia.com/4.7/application-windows.htm | |||
Настани и справување со настани - "The Event System":http://doc.qt.nokia.com/4.7/eventsandfilters.html | |||
h2. Додавање на копче за излез | |||
Во реална апликација, нормално ви треб повеќе од една графичка контрола. Ние сега ќе воведеме "QPushButton":http://doc.qt.nokia.com/4.7/qpushbutton.html под текст едиторот. Со копчето ќе излезете од апликацијата кога ќе се притисне (т.е. кога ќе се кликне со глувчето). | |||
[[Image:http://doc.qt.nokia.com/4.7/images/gs2.png|http://doc.qt.nokia.com/4.7/images/gs2.png]] | |||
Да го погледнеме кодот: | |||
<code> | |||
#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())); | QObject::connect(&quitButton, SIGNAL (clicked()), qApp, SLOT (quit())); | ||
QVBoxLayout layout; | QVBoxLayout layout; | ||
layout.addWidget(&textEdit); | |||
layout.addWidget(&quitButton); | |||
QWidget window; | QWidget window; | ||
window.setLayout(&layout); | |||
window.show(); | window.show(); | ||
return app.exec | return app.exec(); | ||
} | |||
</code> | |||
Линијата 1 го вклучува | Линијата 1 го вклучува "QtGui":http://doc.qt.nokia.com/4.7/qtgui.html кој ги содржи сите Qt GUI класи. | ||
Линијата 10 го користи Qt механизмот на сигнали и слотови за да направи апликацијата да излезе кога Quit копчето ќе се притисне. Слот е функција која може да се повика со користење на нејзиното име (како буквален стринг). Сигналот е функција која кога е повикана ќе повика слотови регистрарани со него; тоа го нарекуваме поврзување или конектирање слот со сигналот и да емитираме сигнал. | Линијата 10 го користи Qt механизмот на сигнали и слотови за да направи апликацијата да излезе кога Quit копчето ќе се притисне. Слот е функција која може да се повика со користење на нејзиното име (како буквален стринг). Сигналот е функција која кога е повикана ќе повика слотови регистрарани со него; тоа го нарекуваме поврзување или конектирање слот со сигналот и да емитираме сигнал. | ||
"quit()":http://doc.qt.nokia.com/4.7/qcoreapplication.html#quit е слот од "QApplication":http://doc.qt.nokia.com/4.7/qapplication.html кој ја напушта апликацијата. "clicked()":http://doc.qt.nokia.com/4.7/qabstractbutton.html#clicked е сигнал кој "QPushButton":http://doc.qt.nokia.com/4.7/qpushbutton.html го емитира кога е притиснат. Статичката функција "QObject::connect()":http://doc.qt.nokia.com/4.7/qobject.html#connect се грижи за поврзување на слот со сигналот. SIGNAL () и SLOT() се две макроа кои ги земаат функциските потписи на сигналот и слотот за поврзување. Ние исто така треба да ги ставиме поинтерите на објектите кои треба да го праќаат и примат сигналот. | |||
Линијата 12 креира | Линијата 12 креира "QVBoxLayout":http://doc.qt.nokia.com/4.7/qvboxlayout.html. Како што спомнавме, графичките контроли може да содржат други графички контроли. Можно е да се постават границите (локацијата и големината) на децата графички контроли директно, но обично е полесно да се користи layout (распоред). Распоредот управува со границите на децата графички контроли. "QVBoxLayout":http://doc.qt.nokia.com/4.7/qvboxlayout.html, на пример, ги става децата во вертикален ред. | ||
Линијата 13 и 14 додава текст едитор и копче во распоредот. Во линијата 17, го поставуваме распоредот на графичката контрола. | Линијата 13 и 14 додава текст едитор и копче во распоредот. Во линијата 17, го поставуваме распоредот на графичката контрола. | ||
Line 57: | Line 93: | ||
=== Научете повеќе: === | === Научете повеќе: === | ||
Сигнали и слотови - | Сигнали и слотови - "Signals & Slots":http://doc.qt.nokia.com/4.7/signalsandslots.html | ||
Распореди - "Layout Management":http://doc.qt.nokia.com/4.7/layout.html, "Widgets and Layouts":http://doc.qt.nokia.com/4.7/widgets-and-layouts.html, "Layout Examples":http://doc.qt.nokia.com/4.7/examples-layouts.html | |||
Графички контроли кој доаѓаат со Qt - "Qt Widget Gallery":http://doc.qt.nokia.com/4.7/gallery.html, "Widget Examples":http://doc.qt.nokia.com/4.7/examples-widgets.html | |||
== Наследување на QWidget == | == Наследување на QWidget == | ||
Кога корисникот сака да излезе од апликацијата, можеби ќе сакате да се појави скок-прозорец (дијалог) што прашува дали тој/таа навистина сака да излезе. Во овој пример, го наследуваме | Кога корисникот сака да излезе од апликацијата, можеби ќе сакате да се појави скок-прозорец (дијалог) што прашува дали тој/таа навистина сака да излезе. Во овој пример, го наследуваме "QWidget":http://doc.qt.nokia.com/4.7/qwidget.html, и додаваме слот на кој ќе го конектираме 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 67: | Line 105: | ||
Да го погледнеме кодот: | Да го погледнеме кодот: | ||
<code> | <code> | ||
class Notepad : public QWidget | |||
{ | |||
Q_OBJECT | |||
public: | public: | ||
Notepad(); | |||
private slots: | private slots: | ||
void quit(); | |||
private: | private: | ||
QTextEdit *textEdit; | |||
QPushButton *quitButton; | |||
}; | |||
</code> | |||
Q_OBJECT макрото мора да биде прво во дефиницијата на класата, и ја декларира нашата класа како | Q_OBJECT макрото мора да биде прво во дефиницијата на класата, и ја декларира нашата класа како "QObject":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 додава неколку способности за нормалната C++ класа. Имено, името на класата и имињата на слотовите може да бидат прашувани во run-time. Исто така е можно е да се најдат типот на параметри на слотот и да се повика. | ||
Линијата 13 го декларира слотот quit(). Ова е лесно со користење на макроа за слотовите. quit() слотот сега може да биде конектиран на сигнали со одговарачки потпис (било кој сигнал кој нема параметри). | Линијата 13 го декларира слотот quit(). Ова е лесно со користење на макроа за слотовите. quit() слотот сега може да биде конектиран на сигнали со одговарачки потпис (било кој сигнал кој нема параметри). | ||
Line 81: | Line 128: | ||
Наместо поставувањето на GUI и конектирање на слотот во main() функцијата, сега тоа го правиме во Notepad конструкторот. | Наместо поставувањето на GUI и конектирање на слотот во main() функцијата, сега тоа го правиме во Notepad конструкторот. | ||
<code> | <code> | ||
Notepad::Notepad() | |||
{ | |||
textEdit = new QTextEdit; | |||
quitButton = new QPushButton(tr("Quit")); | |||
connect(quitButton, SIGNAL (clicked()), this, SLOT (quit())); | connect(quitButton, SIGNAL (clicked()), this, SLOT (quit())); | ||
QVBoxLayout '''layout = new QVBoxLayout; | QVBoxLayout '''layout = new QVBoxLayout; | ||
layout->addWidget(textEdit); | |||
layout->addWidget(quitButton); | |||
setLayout(layout); | |||
setWindowTitle(tr("Notepad")); | |||
} | |||
</code> | |||
< | |||
Како што видовте во дефиницијата на класата, ние користиме поинтери кон нашите QObject-и (textEdit и quitButton). Како правило, треба QObject-ите да ги алоцирате на heap и никогаш да не ги копирате. | |||
Ние сега ја користиме функцијата "tr()":http://doc.qt.nokia.com/4.7/qobject.html#tr околу видливите стрингови. Оваа функцијата е потребна кога сакате да ја користите вашата апликација на повеќе од еден јазик. Нема да навлегуваме во детали, но можете да го следите Qt Linguist линкот на „научи повеќе“ табелата. | |||
h3. Научи повеќе | |||
tr() и интернационализација - "Qt Linguist Manual":http://doc.qt.nokia.com/4.7/linguist-manual.html, "Writing Source Code for Translation":http://doc.qt.nokia.com/4.7/i18n-source-translation.html, "Hello tr() Example":http://doc.qt.nokia.com/4.7/linguist-hellotr.html, "Internationalization with Qt":http://doc.qt.nokia.com/4.7/internationalization.html | |||
QObject-и и Qt објектен модел (ова е есенцијално за да го разберете Qt) - "Object Model":http://doc.qt.nokia.com/4.7/object.html | |||
qmake и Qt системот на градба - "qmake Manual":http://doc.qt.nokia.com/4.7/qmake-manual.html | |||
h3. Креирање на .pro фајл | |||
За овој пример, ние ќе пишуваме свој .pro фајл, наместо да ја користиме qmake -project опцијата. | |||
<code> | |||
HEADERS = notepad.h | |||
SOURCES = notepad.cpp main.cpp | |||
</code> | |||
Ова ќе го изгради примерот. | |||
<code> | |||
qmake | |||
make | |||
</code> | |||
h2. Користење на QMainWindow | |||
Многу апликации имаат корист од користење на "QMainWindow":http://doc.qt.nokia.com/4.7/qmainwindow.html кој користи сопствен распоред на кој можете да додадете, лента со мени, закотвени графички контроли, алатник и статусна линија. "QMainWindow":http://doc.qt.nokia.com/4.7/qmainwindow.html има централна област која може да содржи било како графичка контрола. Во нашиот случај, текст едиторот ќе го сместиме таму. | |||
[[Image:http://doc.qt.nokia.com/4.7/images/gs4.png|Користење QMainWindow]] | |||
Да ја погледнеме новата Notepad дефиниција на класата. | |||
<code> | |||
#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; | |||
}; | |||
</code> | |||
Ќе воведеме два нови слота кои можат да снимат и отворат документ. Ќе ги имплементираме во наредниот дел. | |||
Често, во главниот прозорец, на ист слот треба да се повикаат неколку графички контроли. Примери се елементи од менијата и копчињата на алатникот. За да се направи ова полесно Qt нуди "QAction":http://doc.qt.nokia.com/4.7/qaction.html (акции), кој може да биде додадено на неколку графички контроли, и да биде поврзан на слот. На пример, двете "QMenu":http://doc.qt.nokia.com/4.7/qmenu.html и "QToolBar":http://doc.qt.nokia.com/4.7/qtoolbar.html можат да креираат елементи во менито и копчиња од алатникот од исти "акции":http://doc.qt.nokia.com/4.7/qaction.html . Ќе видиме како тоа функционира наскоро. | |||
Како и претходно го користиме Notepad конструкторот за да го наместиме GUI-то. | |||
<code> | |||
Notepad::Notepad() | |||
{ | |||
saveAction = new QAction(tr("&Open"), this); | |||
saveAction = new QAction(tr("&Save"), this); | |||
exitAction = new QAction(tr("E&amp;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")); | |||
} | |||
</code> | |||
"Акциите":http://doc.qt.nokia.com/4.7/qaction.html се создадени со текст треба да се појават графичките контроли на кои ги додаваме (во нашиот случај, елементи од менито). Ако сакаме да ги додадеме на алатникот, можеме да ставиме и икони на тие акции. | |||
Кога елемент од менето е кликнат, елементот ќе ја активира акцијата, и соодветниот слот ќе биде повикан. | |||
h3. Научете повеќе: | |||
Главни прозорци и нивните класи - "Application Main Window":http://doc.qt.nokia.com/4.7/mainwindow.html, "Main Window Examples":http://doc.qt.nokia.com/4.7/examples-mainwindow.html | |||
MDI апликации - "QMdiArea":http://doc.qt.nokia.com/4.7/qmdiarea.html, "MDI Example":http://doc.qt.nokia.com/4.7/mainwindows-mdi.html | |||
h2. Снимање и вчитување | |||
Во овој пример, ќе ја имплементираме функционалноста на open() и save() слотовите што ги додадовме во претходниот пример. | |||
[[Image:http://doc.qt.nokia.com/4.7/images/gs5.png|Вчитување фајл во Kubuntu]] | |||
Ќе започнеме со open() слотот: | |||
<code> | |||
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(); | |||
} | |||
</code> | |||
Првиот чекор е да го прашаме корисникот за името на фајлот што треба да се вчита. Qt доаѓа со "QFileDialog":http://doc.qt.nokia.com/4.7/qfiledialog.html, што е дијалог од кој корисникот може да избере фајл. Горната слика го покажува дијалогот во Kubuntu. Статичката функција "getOpenFileName()":http://doc.qt.nokia.com/4.7/qfiledialog.html#getOpenFileName прикажува модален дијалог, и не се враќа се дур корисникот не одбере фајл. Се враќа со патеката на фајлот на селектираниот фајл, или празен стринг ако корисникот го откаже дијалогот. | |||
Ако го имаме името на фајлот, ни ќе се обидеме да го отвориме фајлот со "open()":http://doc.qt.nokia.com/4.7/qiodevice.html#open, кој враќа true ако фајлот може да се отвори. Нема да навлегуваме во справување со грешки, но можете да го следите линкот во „научете повеќе“ секцијата. Ако фајлот не може да се отвори, ние ќе користиме "QMessageBox":http://doc.qt.nokia.com/4.7/qmessagebox.html да прикажем дијалот со порака за грешка (види "QMessageBox":http://doc.qt.nokia.com/4.7/qmessagebox.html за повеќе информации). | |||
Всушност читањето на податоци е тривијално со користење на "readAll()":http://doc.qt.nokia.com/4.7/qiodevice.html#readAll, која ги враќа сите податоци на фајлот во "QByteArray":http://doc.qt.nokia.com/4.7/qbytearray.html. Методот "constData()":http://doc.qt.nokia.com/4.7/qbytearray.html#constData ги враќа сите податоци во низа од const char''', за кој "QString":http://doc.qt.nokia.com/4.7/qstring.html има конструктор. Содржината тогаш може да биде прикажана во текст едиторот. Потоа го повикуваме методот "close()":http://doc.qt.nokia.com/4.7/qiodevice.html#close за да го вратиме фајл дескрипторот назад во оперативниот систем. | |||
Сега, да продолжиме кон save() слотот: | Сега, да продолжиме кон save() слотот: | ||
<code> | <code> | ||
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(); | |||
} | |||
} | |||
</code> | |||
Кога ја запишуваме содржината на текст едиторот во фајл, ние ја користиме "QTextStream":http://doc.qt.nokia.com/4.7/qtextstream.html (текстуален тек) класата, која ја го содржи "QFile":http://doc.qt.nokia.com/4.7/qfile.html објектот. Текстуалниот тек може директно да запишува QString во фајлот; "QFile":http://doc.qt.nokia.com/4.7/qfile.html прифаќа само сурови податоци (char''') со користење на "write()":http://doc.qt.nokia.com/4.7/qiodevice.html#write во "QIODevice":http://doc.qt.nokia.com/4.7/qiodevice.html. | |||
=== Научете повеќе === | === Научете повеќе === |
Revision as of 13:00, 25 February 2015
[toc align_right="yes" depth="2"]
Започнување програмирање во 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":http://doc.qt.nokia.com/4.7/qapplication.html и "QTextEdit":http://doc.qt.nokia.com/4.7/qtextedit.html, две класи кои се потребни за овој пример. Сите Qt класи имаат заглавја именувани по нив.
Линијата 6 создава објект "QApplication":http://doc.qt.nokia.com/4.7/qapplication.html. Овој објект управува со ресурсите на апликацијата и мора да се стартува во било која Qt апликација во која има GUI. Потребни му се argv и argc бидејќи Qt прифаќа неколку аргументи од командна линија.
Линијата 8 создава објект "QTextEdit":http://doc.qt.nokia.com/4.7/qtextedit.html. Текст едиторот е визуелен елемент во GUI. Во Qt, ние ги нарекуваме графички контроли. Примери за други графички контроли се лизгачи, етикети, и радио копчиња. Графичкиот контролер може да биде контејнер и за други графички контроли, дијалог или главниот прозорец, на пример.
Линијата 9 го покажува текст едиторот на екран во сопствената рамка на прозорецот. Бидејќи графичките контроли може да служат како контејнери (на пример "QMainWindow":http://doc.qt.nokia.com/4.7/qmainwindow.html, кој има алатник, менија, статусна лента и неколку други елементи), можно е да се покаже една графичка контрола во својот прозорец. Графичките контроли, стандардно, не се видливи, функцијата "show()":http://doc.qt.nokia.com/4.7/qwidget.html#show ги прави видливи.
Линијата 11 прави "QApplication":http://doc.qt.nokia.com/4.7/qapplication.html да влезе во јамката на настани. Кога Qt апликацијата работи, настаните се генерираат и се испраќаат до графичките контроли на апликацијата. Пример за настани се кликови на глушецот и тастатурата. Кога ќе напишете текст во текст едиторот, добива настани за притиснати копчиња на тастатурата и реагира со цртање на текстот кој бил истипкан.
За да ја стартувате апликацијата, отворете Command Prompt и влезете во директориумот во кој е .cpp фајлот на програмата. Следниве команди ќе го изградат програмот.
qmake -project
qmake
make
Ова ќе остави извршен фајл во part1 директориумот (забелешка, во Windows може да користите nmake наместо make. Исто така, извршниот фајл ќе биде сместен во part1/debug или part1/release). qmake е Qt алатка за градење., која зема конфигурациски фајл. qmake го генерира ова за нас ако се користи -project аргументот. За даден конфигурациски фајл (суфикс .pro), qmake произведува make фајл кој ќе го искомпајлира програмот за вас. Ќе разгледаме покасно како сами да напишеме .pro фајлови.
h3. Научете повеќе
Графички контроли и геометрија на прозорот- "Window and Dialog Widgets":http://doc.qt.nokia.com/4.7/application-windows.htm Настани и справување со настани - "The Event System":http://doc.qt.nokia.com/4.7/eventsandfilters.html
h2. Додавање на копче за излез
Во реална апликација, нормално ви треб повеќе од една графичка контрола. Ние сега ќе воведеме "QPushButton":http://doc.qt.nokia.com/4.7/qpushbutton.html под текст едиторот. Со копчето ќе излезете од апликацијата кога ќе се притисне (т.е. кога ќе се кликне со глувчето).
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":http://doc.qt.nokia.com/4.7/qtgui.html кој ги содржи сите Qt GUI класи.
Линијата 10 го користи Qt механизмот на сигнали и слотови за да направи апликацијата да излезе кога Quit копчето ќе се притисне. Слот е функција која може да се повика со користење на нејзиното име (како буквален стринг). Сигналот е функција која кога е повикана ќе повика слотови регистрарани со него; тоа го нарекуваме поврзување или конектирање слот со сигналот и да емитираме сигнал.
"quit()":http://doc.qt.nokia.com/4.7/qcoreapplication.html#quit е слот од "QApplication":http://doc.qt.nokia.com/4.7/qapplication.html кој ја напушта апликацијата. "clicked()":http://doc.qt.nokia.com/4.7/qabstractbutton.html#clicked е сигнал кој "QPushButton":http://doc.qt.nokia.com/4.7/qpushbutton.html го емитира кога е притиснат. Статичката функција "QObject::connect()":http://doc.qt.nokia.com/4.7/qobject.html#connect се грижи за поврзување на слот со сигналот. SIGNAL () и SLOT() се две макроа кои ги земаат функциските потписи на сигналот и слотот за поврзување. Ние исто така треба да ги ставиме поинтерите на објектите кои треба да го праќаат и примат сигналот.
Линијата 12 креира "QVBoxLayout":http://doc.qt.nokia.com/4.7/qvboxlayout.html. Како што спомнавме, графичките контроли може да содржат други графички контроли. Можно е да се постават границите (локацијата и големината) на децата графички контроли директно, но обично е полесно да се користи layout (распоред). Распоредот управува со границите на децата графички контроли. "QVBoxLayout":http://doc.qt.nokia.com/4.7/qvboxlayout.html, на пример, ги става децата во вертикален ред.
Линијата 13 и 14 додава текст едитор и копче во распоредот. Во линијата 17, го поставуваме распоредот на графичката контрола.
Научете повеќе:
Сигнали и слотови - "Signals & Slots":http://doc.qt.nokia.com/4.7/signalsandslots.html Распореди - "Layout Management":http://doc.qt.nokia.com/4.7/layout.html, "Widgets and Layouts":http://doc.qt.nokia.com/4.7/widgets-and-layouts.html, "Layout Examples":http://doc.qt.nokia.com/4.7/examples-layouts.html Графички контроли кој доаѓаат со Qt - "Qt Widget Gallery":http://doc.qt.nokia.com/4.7/gallery.html, "Widget Examples":http://doc.qt.nokia.com/4.7/examples-widgets.html
Наследување на QWidget
Кога корисникот сака да излезе од апликацијата, можеби ќе сакате да се појави скок-прозорец (дијалог) што прашува дали тој/таа навистина сака да излезе. Во овој пример, го наследуваме "QWidget":http://doc.qt.nokia.com/4.7/qwidget.html, и додаваме слот на кој ќе го конектираме Quit копчето.
Да го погледнеме кодот:
class Notepad : public QWidget
{
Q_OBJECT
public:
Notepad();
private slots:
void quit();
private:
QTextEdit *textEdit;
QPushButton *quitButton;
};
Q_OBJECT макрото мора да биде прво во дефиницијата на класата, и ја декларира нашата класа како "QObject":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 додава неколку способности за нормалната 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()":http://doc.qt.nokia.com/4.7/qobject.html#tr околу видливите стрингови. Оваа функцијата е потребна кога сакате да ја користите вашата апликација на повеќе од еден јазик. Нема да навлегуваме во детали, но можете да го следите Qt Linguist линкот на „научи повеќе“ табелата.
h3. Научи повеќе
tr() и интернационализација - "Qt Linguist Manual":http://doc.qt.nokia.com/4.7/linguist-manual.html, "Writing Source Code for Translation":http://doc.qt.nokia.com/4.7/i18n-source-translation.html, "Hello tr() Example":http://doc.qt.nokia.com/4.7/linguist-hellotr.html, "Internationalization with Qt":http://doc.qt.nokia.com/4.7/internationalization.html QObject-и и Qt објектен модел (ова е есенцијално за да го разберете Qt) - "Object Model":http://doc.qt.nokia.com/4.7/object.html qmake и Qt системот на градба - "qmake Manual":http://doc.qt.nokia.com/4.7/qmake-manual.html
h3. Креирање на .pro фајл
За овој пример, ние ќе пишуваме свој .pro фајл, наместо да ја користиме qmake -project опцијата.
HEADERS = notepad.h
SOURCES = notepad.cpp main.cpp
Ова ќе го изгради примерот.
qmake
make
h2. Користење на QMainWindow
Многу апликации имаат корист од користење на "QMainWindow":http://doc.qt.nokia.com/4.7/qmainwindow.html кој користи сопствен распоред на кој можете да додадете, лента со мени, закотвени графички контроли, алатник и статусна линија. "QMainWindow":http://doc.qt.nokia.com/4.7/qmainwindow.html има централна област која може да содржи било како графичка контрола. Во нашиот случај, текст едиторот ќе го сместиме таму.
Да ја погледнеме новата 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":http://doc.qt.nokia.com/4.7/qaction.html (акции), кој може да биде додадено на неколку графички контроли, и да биде поврзан на слот. На пример, двете "QMenu":http://doc.qt.nokia.com/4.7/qmenu.html и "QToolBar":http://doc.qt.nokia.com/4.7/qtoolbar.html можат да креираат елементи во менито и копчиња од алатникот од исти "акции":http://doc.qt.nokia.com/4.7/qaction.html . Ќе видиме како тоа функционира наскоро.
Како и претходно го користиме Notepad конструкторот за да го наместиме GUI-то.
Notepad::Notepad()
{
saveAction = new QAction(tr("&Open"), this);
saveAction = new QAction(tr("&Save"), this);
exitAction = new QAction(tr("E&amp;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"));
}
"Акциите":http://doc.qt.nokia.com/4.7/qaction.html се создадени со текст треба да се појават графичките контроли на кои ги додаваме (во нашиот случај, елементи од менито). Ако сакаме да ги додадеме на алатникот, можеме да ставиме и икони на тие акции.
Кога елемент од менето е кликнат, елементот ќе ја активира акцијата, и соодветниот слот ќе биде повикан.
h3. Научете повеќе:
Главни прозорци и нивните класи - "Application Main Window":http://doc.qt.nokia.com/4.7/mainwindow.html, "Main Window Examples":http://doc.qt.nokia.com/4.7/examples-mainwindow.html MDI апликации - "QMdiArea":http://doc.qt.nokia.com/4.7/qmdiarea.html, "MDI Example":http://doc.qt.nokia.com/4.7/mainwindows-mdi.html
h2. Снимање и вчитување
Во овој пример, ќе ја имплементираме функционалноста на 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":http://doc.qt.nokia.com/4.7/qfiledialog.html, што е дијалог од кој корисникот може да избере фајл. Горната слика го покажува дијалогот во Kubuntu. Статичката функција "getOpenFileName()":http://doc.qt.nokia.com/4.7/qfiledialog.html#getOpenFileName прикажува модален дијалог, и не се враќа се дур корисникот не одбере фајл. Се враќа со патеката на фајлот на селектираниот фајл, или празен стринг ако корисникот го откаже дијалогот.
Ако го имаме името на фајлот, ни ќе се обидеме да го отвориме фајлот со "open()":http://doc.qt.nokia.com/4.7/qiodevice.html#open, кој враќа true ако фајлот може да се отвори. Нема да навлегуваме во справување со грешки, но можете да го следите линкот во „научете повеќе“ секцијата. Ако фајлот не може да се отвори, ние ќе користиме "QMessageBox":http://doc.qt.nokia.com/4.7/qmessagebox.html да прикажем дијалот со порака за грешка (види "QMessageBox":http://doc.qt.nokia.com/4.7/qmessagebox.html за повеќе информации).
Всушност читањето на податоци е тривијално со користење на "readAll()":http://doc.qt.nokia.com/4.7/qiodevice.html#readAll, која ги враќа сите податоци на фајлот во "QByteArray":http://doc.qt.nokia.com/4.7/qbytearray.html. Методот "constData()":http://doc.qt.nokia.com/4.7/qbytearray.html#constData ги враќа сите податоци во низа од const char, за кој "QString":http://doc.qt.nokia.com/4.7/qstring.html има конструктор. Содржината тогаш може да биде прикажана во текст едиторот. Потоа го повикуваме методот "close()":http://doc.qt.nokia.com/4.7/qiodevice.html#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":http://doc.qt.nokia.com/4.7/qtextstream.html (текстуален тек) класата, која ја го содржи "QFile":http://doc.qt.nokia.com/4.7/qfile.html објектот. Текстуалниот тек може директно да запишува QString во фајлот; "QFile":http://doc.qt.nokia.com/4.7/qfile.html прифаќа само сурови податоци (char) со користење на "write()":http://doc.qt.nokia.com/4.7/qiodevice.html#write во "QIODevice":http://doc.qt.nokia.com/4.7/qiodevice.html.