Getting Started on the Commandline/mk

From Qt Wiki
< Getting Started on the Commandline
Revision as of 12:20, 17 April 2015 by AutoSpider (talk | contribs) (Remove non-functioning "toc" command)
Jump to navigation Jump to search
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.

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