Getting Started on the Commandline/mk: Difference between revisions

From Qt Wiki
Jump to navigation Jump to search
(Convert ExpressionEngine links)
(Convert ExpressionEngine section headers)
Line 45: Line 45:
Ова ќе остави извршен фајл во 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/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/eventsandfilters.html The Event System]


h2. Додавање на копче за излез
== Додавање на копче за излез ==
 
Во реална апликација, нормално ви треб повеќе од една графичка контрола. Ние сега ќе воведеме [http://doc.qt.nokia.com/4.7/qpushbutton.html QPushButton] под текст едиторот. Со копчето ќе излезете од апликацијата кога ќе се притисне (т.е. кога ќе се кликне со глувчето).
Во реална апликација, нормално ви треб повеќе од една графичка контрола. Ние сега ќе воведеме [http://doc.qt.nokia.com/4.7/qpushbutton.html QPushButton] под текст едиторот. Со копчето ќе излезете од апликацијата кога ќе се притисне (т.е. кога ќе се кликне со глувчето).


Line 152: Line 150:
Ние сега ја користиме функцијата [http://doc.qt.nokia.com/4.7/qobject.html#tr tr()] околу видливите стрингови. Оваа функцијата е потребна кога сакате да ја користите вашата апликација на повеќе од еден јазик. Нема да навлегуваме во детали, но можете да го следите Qt Linguist линкот на „научи повеќе“ табелата.
Ние сега ја користиме функцијата [http://doc.qt.nokia.com/4.7/qobject.html#tr tr()] околу видливите стрингови. Оваа функцијата е потребна кога сакате да ја користите вашата апликација на повеќе од еден јазик. Нема да навлегуваме во детали, но можете да го следите Qt Linguist линкот на „научи повеќе“ табелата.


h3. Научи повеќе
=== Научи повеќе ===
 
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]
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]
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]
qmake и Qt системот на градба - [http://doc.qt.nokia.com/4.7/qmake-manual.html qmake Manual]


h3. Креирање на .pro фајл
=== Креирање на .pro фајл ===
 
За овој пример, ние ќе пишуваме свој .pro фајл, наместо да ја користиме qmake -project опцијата.
За овој пример, ние ќе пишуваме свој .pro фајл, наместо да ја користиме qmake -project опцијата.


Line 174: Line 170:
</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] има централна област која може да содржи било како графичка контрола. Во нашиот случај, текст едиторот ќе го сместиме таму.
Многу апликации имаат корист од користење на [http://doc.qt.nokia.com/4.7/qmainwindow.html QMainWindow] кој користи сопствен распоред на кој можете да додадете, лента со мени, закотвени графички контроли, алатник и статусна линија. [http://doc.qt.nokia.com/4.7/qmainwindow.html QMainWindow] има централна област која може да содржи било како графичка контрола. Во нашиот случај, текст едиторот ќе го сместиме таму.


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


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]
Главни прозорци и нивните класи - [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 апликации - [http://doc.qt.nokia.com/4.7/qmdiarea.html QMdiArea], [http://doc.qt.nokia.com/4.7/mainwindows-mdi.html MDI Example]


h2. Снимање и вчитување
== Снимање и вчитување ==
 
Во овој пример, ќе ја имплементираме функционалноста на open() и save() слотовите што ги додадовме во претходниот пример.
Во овој пример, ќе ја имплементираме функционалноста на open() и save() слотовите што ги додадовме во претходниот пример.



Revision as of 15:54, 5 March 2015

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.

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

Започнување програмирање во 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(&amp;quitButton, SIGNAL (clicked()), qApp, SLOT (quit()));

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

QWidget window;
 window.setLayout(&amp;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("&amp;Open"), this);
 saveAction = new QAction(tr("&amp;Save"), this);
 exitAction = new QAction(tr("E&amp;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("&amp;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(&amp;file);
 stream << textEdit->toPlainText();
 stream.flush();
 file.close();
 }
}

Кога ја запишуваме содржината на текст едиторот во фајл, ние ја користиме QTextStream (текстуален тек) класата, која ја го содржи QFile објектот. Текстуалниот тек може директно да запишува QString во фајлот; QFile прифаќа само сурови податоци (char) со користење на write() во QIODevice.

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