Getting Started on the Commandline/mk: Difference between revisions

From Qt Wiki
Jump to navigation Jump to search
(Add "cleanup" tag)
 
(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.}}


[toc align_right="yes" depth="2"]


= Започнување програмирање во Qt =
= Започнување програмирање во Qt =
Line 27: Line 26:
}</code>
}</code>


Ајде да одиме низ кодот линија по линија. Во првите две линии, ние ги вклучивме заглавјата за "QApplication":http://doc.qt.nokia.com/4.7/qapplication.html и "QTextEdit":http://doc.qt.nokia.com/4.7/qtextedit.html, две класи кои се потребни за овој пример. Сите Qt класи имаат заглавја именувани по нив.
Ајде да одиме низ кодот линија по линија. Во првите две линии, ние ги вклучивме заглавјата за [http://doc.qt.nokia.com/4.7/qapplication.html QApplication] и [http://doc.qt.nokia.com/4.7/qtextedit.html QTextEdit], две класи кои се потребни за овој пример. Сите Qt класи имаат заглавја именувани по нив.


Линијата 6 создава објект "QApplication":http://doc.qt.nokia.com/4.7/qapplication.html. Овој објект управува со ресурсите на апликацијата и мора да се стартува во било која Qt апликација во која има GUI. Потребни му се argv и argc бидејќи Qt прифаќа неколку аргументи од командна линија.
Линијата 6 создава објект [http://doc.qt.nokia.com/4.7/qapplication.html QApplication]. Овој објект управува со ресурсите на апликацијата и мора да се стартува во било која Qt апликација во која има GUI. Потребни му се argv и argc бидејќи Qt прифаќа неколку аргументи од командна линија.


Линијата 8 создава објект "QTextEdit":http://doc.qt.nokia.com/4.7/qtextedit.html. Текст едиторот е визуелен елемент во GUI. Во Qt, ние ги нарекуваме графички контроли. Примери за други графички контроли се лизгачи, етикети, и радио копчиња. Графичкиот контролер може да биде контејнер и за други графички контроли, дијалог или главниот прозорец, на пример.
Линијата 8 создава објект [http://doc.qt.nokia.com/4.7/qtextedit.html QTextEdit]. Текст едиторот е визуелен елемент во GUI. Во Qt, ние ги нарекуваме графички контроли. Примери за други графички контроли се лизгачи, етикети, и радио копчиња. Графичкиот контролер може да биде контејнер и за други графички контроли, дијалог или главниот прозорец, на пример.


Линијата 9 го покажува текст едиторот на екран во сопствената рамка на прозорецот. Бидејќи графичките контроли може да служат како контејнери (на пример "QMainWindow":http://doc.qt.nokia.com/4.7/qmainwindow.html, кој има алатник, менија, статусна лента и неколку други елементи), можно е да се покаже една графичка контрола во својот прозорец. Графичките контроли, стандардно, не се видливи, функцијата "show()":http://doc.qt.nokia.com/4.7/qwidget.html#show ги прави видливи.  
Линијата 9 го покажува текст едиторот на екран во сопствената рамка на прозорецот. Бидејќи графичките контроли може да служат како контејнери (на пример [http://doc.qt.nokia.com/4.7/qmainwindow.html QMainWindow], кој има алатник, менија, статусна лента и неколку други елементи), можно е да се покаже една графичка контрола во својот прозорец. Графичките контроли, стандардно, не се видливи, функцијата [http://doc.qt.nokia.com/4.7/qwidget.html#show show()] ги прави видливи.  


Линијата 11 прави "QApplication":http://doc.qt.nokia.com/4.7/qapplication.html да влезе во јамката на настани. Кога Qt апликацијата работи, настаните се генерираат и се испраќаат до графичките контроли на апликацијата. Пример за настани се кликови на глушецот и тастатурата. Кога ќе напишете текст во текст едиторот, добива настани за притиснати копчиња на тастатурата и реагира со цртање на текстот кој бил истипкан.
Линијата 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 фајлови.


h3. Научете повеќе
=== Научете повеќе ===
Графички контроли и геометрија на прозорот- [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]


Графички контроли и геометрија на прозорот- "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
Во реална апликација, нормално ви треб повеќе од една графичка контрола. Ние сега ќе воведеме [http://doc.qt.nokia.com/4.7/qpushbutton.html QPushButton] под текст едиторот. Со копчето ќе излезете од апликацијата кога ќе се притисне (т.е. кога ќе се кликне со глувчето).
 
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]]
[[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(&amp;quitButton, SIGNAL (clicked()), qApp, SLOT (quit()));
QObject::connect(&quitButton, SIGNAL (clicked()), qApp, SLOT (quit()));


QVBoxLayout layout;
QVBoxLayout layout;
  layout.addWidget(&amp;textEdit);
  layout.addWidget(&textEdit);
  layout.addWidget(&amp;quitButton);
  layout.addWidget(&quitButton);


QWidget window;
QWidget window;
  window.setLayout(&amp;layout);
  window.setLayout(&layout);


window.show();
window.show();
Line 83: Line 80:
</code>
</code>


Линијата 1 го вклучува "QtGui":http://doc.qt.nokia.com/4.7/qtgui.html кој ги содржи сите Qt GUI класи.
Линијата 1 го вклучува [http://doc.qt.nokia.com/4.7/qtgui.html QtGui] кој ги содржи сите 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() се две макроа кои ги земаат функциските потписи на сигналот и слотот за поврзување. Ние исто така треба да ги ставиме поинтерите на објектите кои треба да го праќаат и примат сигналот.
[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 креира "QVBoxLayout":http://doc.qt.nokia.com/4.7/qvboxlayout.html. Како што спомнавме, графичките контроли може да содржат други графички контроли. Можно е да се постават границите (локацијата и големината) на децата графички контроли директно, но обично е полесно да се користи layout (распоред). Распоредот управува со границите на децата графички контроли. "QVBoxLayout":http://doc.qt.nokia.com/4.7/qvboxlayout.html, на пример, ги става децата во вертикален ред.
Линијата 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:
=== Научете повеќе: ===
=== Научете повеќе: ===


Сигнали и слотови - "Signals &amp; Slots":http://doc.qt.nokia.com/4.7/signalsandslots.html
Сигнали и слотови - [http://doc.qt.nokia.com/4.7/signalsandslots.html Signals & Slots]
Распореди - "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
Распореди - [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 Widget Gallery":http://doc.qt.nokia.com/4.7/gallery.html, "Widget Examples":http://doc.qt.nokia.com/4.7/examples-widgets.html
Графички контроли кој доаѓаат со 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 ==


Кога корисникот сака да излезе од апликацијата, можеби ќе сакате да се појави скок-прозорец (дијалог) што прашува дали тој/таа навистина сака да излезе. Во овој пример, го наследуваме "QWidget":http://doc.qt.nokia.com/4.7/qwidget.html, и додаваме слот на кој ќе го конектираме Quit копчето.
Кога корисникот сака да излезе од апликацијата, можеби ќе сакате да се појави скок-прозорец (дијалог) што прашува дали тој/таа навистина сака да излезе. Во овој пример, го наследуваме [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 макрото мора да биде прво во дефиницијата на класата, и ја декларира нашата класа како "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. Исто така е можно е да се најдат типот на параметри на слотот и да се повика.
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 и никогаш да не ги копирате.


Ние сега ја користиме функцијата "tr()":http://doc.qt.nokia.com/4.7/qobject.html#tr околу видливите стрингови. Оваа функцијата е потребна кога сакате да ја користите вашата апликација на повеќе од еден јазик. Нема да навлегуваме во детали, но можете да го следите Qt Linguist линкот на „научи повеќе“ табелата.
Ние сега ја користиме функцијата [http://doc.qt.nokia.com/4.7/qobject.html#tr 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 фајл
=== Научи повеќе ===
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>


h2. Користење на QMainWindow
== Користење на QMainWindow ==
 
Многу апликации имаат корист од користење на [http://doc.qt.nokia.com/4.7/qmainwindow.html QMainWindow] кој користи сопствен распоред на кој можете да додадете, лента со мени, закотвени графички контроли, алатник и статусна линија. [http://doc.qt.nokia.com/4.7/qmainwindow.html 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]]
[[Image:http://doc.qt.nokia.com/4.7/images/gs4.png|Користење QMainWindow]]
Line 210: Line 204:
Ќе воведеме два нови слота кои можат да снимат и отворат документ. Ќе ги имплементираме во наредниот дел.
Ќе воведеме два нови слота кои можат да снимат и отворат документ. Ќе ги имплементираме во наредниот дел.


Често, во главниот прозорец, на ист слот треба да се повикаат неколку графички контроли. Примери се елементи од менијата и копчињата на алатникот. За да се направи ова полесно 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 . Ќе видиме како тоа функционира наскоро.
Често, во главниот прозорец, на ист слот треба да се повикаат неколку графички контроли. Примери се елементи од менијата и копчињата на алатникот. За да се направи ова полесно 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("&amp;Open"), this);
  saveAction = new QAction(tr("&Open"), this);
  saveAction = new QAction(tr("&amp;Save"), this);
  saveAction = new QAction(tr("&Save"), this);
  exitAction = new QAction(tr("E&amp;amp;xit"), this);
  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("&amp;File"));
  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/qaction.html Акциите] се создадени со текст треба да се појават графичките контроли на кои ги додаваме (во нашиот случај, елементи од менито). Ако сакаме да ги додадеме на алатникот, можеме да ставиме и икони на тие акции.


Кога елемент од менето е кликнат, елементот ќе ја активира акцијата, и соодветниот слот ќе биде повикан.
Кога елемент од менето е кликнат, елементот ќе ја активира акцијата, и соодветниот слот ќе биде повикан.


h3. Научете повеќе:
=== Научете повеќе: ===
 
Главни прозорци и нивните класи - [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]
Главни прозорци и нивните класи - "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 апликации - [http://doc.qt.nokia.com/4.7/qmdiarea.html QMdiArea], [http://doc.qt.nokia.com/4.7/mainwindows-mdi.html MDI Example]
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() и save() слотовите што ги додадовме во претходниот пример.


Line 272: Line 264:
</code>
</code>


Првиот чекор е да го прашаме корисникот за името на фајлот што треба да се вчита. Qt доаѓа со "QFileDialog":http://doc.qt.nokia.com/4.7/qfiledialog.html, што е дијалог од кој корисникот може да избере фајл. Горната слика го покажува дијалогот во Kubuntu. Статичката функција "getOpenFileName()":http://doc.qt.nokia.com/4.7/qfiledialog.html#getOpenFileName прикажува модален дијалог, и не се враќа се дур корисникот не одбере фајл. Се враќа со патеката на фајлот на селектираниот фајл, или празен стринг ако корисникот го откаже дијалогот.
Првиот чекор е да го прашаме корисникот за името на фајлот што треба да се вчита. Qt доаѓа со [http://doc.qt.nokia.com/4.7/qfiledialog.html QFileDialog], што е дијалог од кој корисникот може да избере фајл. Горната слика го покажува дијалогот во Kubuntu. Статичката функција [http://doc.qt.nokia.com/4.7/qfiledialog.html#getOpenFileName 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 за повеќе информации).
Ако го имаме името на фајлот, ни ќе се обидеме да го отвориме фајлот со [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] за повеќе информации).


Всушност читањето на податоци е тривијално со користење на "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 за да го вратиме фајл дескрипторот назад во оперативниот систем.
Всушност читањето на податоци е тривијално со користење на [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(&amp;file);
  QTextStream stream(&file);
  stream << textEdit->toPlainText();
  stream << textEdit->toPlainText();
  stream.flush();
  stream.flush();
Line 297: Line 289:
</code>
</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.
Кога ја запишуваме содржината на текст едиторот во фајл, ние ја користиме [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 програма која има графички интерфејс.

Hello Notepad

Еве го кодот:

#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 копчето.

Наследување на QWidget

Да го погледнеме кодот:

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 има централна област која може да содржи било како графичка контрола. Во нашиот случај, текст едиторот ќе го сместиме таму.

Користење 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() слотовите што ги додадовме во претходниот пример.

Вчитување фајл во Kubuntu

Ќе започнеме со 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.

Научете повеќе