Qt wiki will be updated on October 12th 2023 starting at 11:30 AM (EEST) and the maintenance will last around 2-3 hours. During the maintenance the site will be unavailable.

Getting Started on the Commandline/nl: Difference between revisions

From Qt Wiki
Jump to navigation Jump to search
No edit summary
 
No edit summary
Line 1: Line 1:
|Onderwerp|Hier| |tr() and internationalization|"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":http://doc.qt.nokia.com/4.7/linguist-hellotr.html() Example, "Internationalization with Qt":http://doc.qt.nokia.com/4.7/internationalization.html| |QObjects and the Qt Object model (This is essential to understand Qt)|"Object Model":http://doc.qt.nokia.com/4.7/object.html| |qmake and the Qt build system|"qmake Manual":http://doc.qt.nokia.com/4.7/qmake-manual.html|  |Onderwerp|Hier| |Main windows and main window classes|"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 applications|"QMdiArea":http://doc.qt.nokia.com/4.7/qmdiarea.html, "MDI Example":http://doc.qt.nokia.com/4.7/mainwindows-mdi.html|  |Onderwerp|Hier| |Files and I/O devices|"QFile":http://doc.qt.nokia.com/4.7/qfile.html, "QIODevice":http://doc.qt.nokia.com/4.7/qiodevice.html|
[toc align_right="yes" depth="3"]


=Beginnen met programmeren in Qt=
= Beginnen met programmeren in Qt =


Welkom in de wereld van Qt — de cross-platform <span class="caps">GUI</span> toolkit. In deze “getting started guide” zullen we u basis Qt kennis bijbrengen door een simpele kladblok applicatie te maken. Na het lezen van deze oefening, zult u klaar zijn om in onze overzichten en <span class="caps">API</span> documentatie te duiken, en alle informatie te vinden die u nodig heeft voor de applicatie die u ontwikkelt.
Welkom in de wereld van Qt — de cross-platform GUI toolkit. In deze &quot;getting started guide&amp;quot; zullen we u basis Qt kennis bijbrengen door een simpele kladblok applicatie te maken. Na het lezen van deze oefening, zult u klaar zijn om in onze overzichten en API documentatie te duiken, en alle informatie te vinden die u nodig heeft voor de applicatie die u ontwikkelt.


==Hallo Kladblok==
== Hallo Kladblok ==


In dit eerste voorbeeld zullen we een eenvoudig venster op de desktop maken met daarin een text edit. Dit representeert het simpelste Qt programma met een <span class="caps">GUI</span>.
In dit eerste voorbeeld zullen we een eenvoudig venster op de desktop maken met daarin een text edit. Dit representeert het simpelste Qt programma met een GUI.


[[Image:gs1.png]]
p=. [[Image:http://doc.qt.nokia.com/4.7/images/gs1.png|http://doc.qt.nokia.com/4.7/images/gs1.png]]


Hier is de code:<br />
Hier is de code:<br /><code>#include &lt;QApplication&amp;gt;<br />#include &lt;QTextEdit&amp;gt;


Laten we dit stuk code regel voor regel doornemen. In de eerste twee regels includen we de header files voor [http://doc.qt.nokia.com/4.7/qapplication.html QApplication] ''[doc.qt.nokia.com]'' en [http://doc.qt.nokia.com/4.7/qtextedit.html QTextEdit] ''[doc.qt.nokia.com]'', die de twee classes zijn die we voor dit voorbeeld nodig hebben. Alle Qt classes hebben een header met zelfde naam.
int main(int argv, char **args)<br />{<br /> QApplication app(argv, args);


Regel 6 creëert een [http://doc.qt.nokia.com/4.7/qapplication.html QApplication] ''[doc.qt.nokia.com]'' object. Dit object beheert alle resources die nodig zijn voor een Qt applicatie met een <span class="caps">GUI</span>. Het heeft argv en args nodig omdat Qt applicaties enkele command line argumenten accepteren.
QTextEdit textEdit;<br /> textEdit.show();


Regel 8 creert een [http://doc.qt.nokia.com/4.7/qtextedit.html QTextEdit] ''[doc.qt.nokia.com]'' object. Een text edit is een visueel element in de <span class="caps">GUI</span>. In Qt noemen we dit soort elementen widgets. Voorbeelden van andere widgets zijn scroll bars, labels en radio knoppen. Een widget can ook een container zijn voor andere widgets, een dialog of een main applicatie bijvoorbeeld.
return app.exec&amp;amp;#40;&amp;#41;;<br />}</code>


Regel 9 toont de text edit op het scherm in zijn eigen window frame. Omdat widgets ook als containers functioneren (bijvoorbeeld een [http://doc.qt.nokia.com/4.7/qmainwindow.html QMainWindow] ''[doc.qt.nokia.com]'', die toolbars, menus, een status bar, en een aantal andere widgets bezit), is het mogelijk om een enkele widget te tonen in zijn eigen window. Widgets zijn niet standaard zichtbaar. De functie [http://doc.qt.nokia.com/4.7/qwidget.html#show show()] ''[doc.qt.nokia.com]'' zorgt dat ze zichtbaar worden.
Laten we dit stuk code regel voor regel doornemen. In de eerste twee regels includen we de header files voor &quot;QApplication&amp;quot;:http://doc.qt.nokia.com/4.7/qapplication.html en &quot;QTextEdit&amp;quot;:http://doc.qt.nokia.com/4.7/qtextedit.html, die de twee classes zijn die we voor dit voorbeeld nodig hebben. Alle Qt classes hebben een header met zelfde naam.


Regel 11 zorgt ervoor dat de [http://doc.qt.nokia.com/4.7/qapplication.html QApplication] ''[doc.qt.nokia.com]'' zijn event loop ingaat. Wanneer een Qt applicatie draait worden events gegenereerd en verzonden naar de widgets van de applicatie. Voorbeelden van events zijn muisklikken en toetsaanslagen. Wanneer je text typt in de text edit widget, ontvangt het toetsaanslagevents en reageert dan door de text te tekenen.
Regel 6 creëert een &quot;QApplication&amp;quot;:http://doc.qt.nokia.com/4.7/qapplication.html object. Dit object beheert alle resources die nodig zijn voor een Qt applicatie met een GUI. Het heeft argv en args nodig omdat Qt applicaties enkele command line argumenten accepteren.
 
Regel 8 creert een &quot;QTextEdit&amp;quot;:http://doc.qt.nokia.com/4.7/qtextedit.html object. Een text edit is een visueel element in de GUI. In Qt noemen we dit soort elementen widgets. Voorbeelden van andere widgets zijn scroll bars, labels en radio knoppen. Een widget can ook een container zijn voor andere widgets, een dialog of een main applicatie bijvoorbeeld.
 
Regel 9 toont de text edit op het scherm in zijn eigen window frame. Omdat widgets ook als containers functioneren (bijvoorbeeld een &quot;QMainWindow&amp;quot;:http://doc.qt.nokia.com/4.7/qmainwindow.html, die toolbars, menus, een status bar, en een aantal andere widgets bezit), is het mogelijk om een enkele widget te tonen in zijn eigen window. Widgets zijn niet standaard zichtbaar. De functie &quot;show()&quot;:http://doc.qt.nokia.com/4.7/qwidget.html#show zorgt dat ze zichtbaar worden.
 
Regel 11 zorgt ervoor dat de &quot;QApplication&amp;quot;:http://doc.qt.nokia.com/4.7/qapplication.html zijn event loop ingaat. Wanneer een Qt applicatie draait worden events gegenereerd en verzonden naar de widgets van de applicatie. Voorbeelden van events zijn muisklikken en toetsaanslagen. Wanneer je text typt in de text edit widget, ontvangt het toetsaanslagevents en reageert dan door de text te tekenen.


Om de applicatie te draaien open je een command prompt en voert de directory in waarin het .cpp bestand van het programma staat. De volgende opdrachten bouwen dan je programma.
Om de applicatie te draaien open je een command prompt en voert de directory in waarin het .cpp bestand van het programma staat. De volgende opdrachten bouwen dan je programma.


Dit laat een executable achter in de part1 map (onthoud dat op Windows je mogelijk gebruik moet maken van nmake in plaats van make. Daarnaast word de executable in de map part1/debug of part1/release geplaatst). qmake is Qt’s build applicatie dat een configuratie bestand accepteert. qmake genereert dit voor ons wanneer het argument -project word meegegeven. Aan de hand van het configuratie bestand (eindigend met .pro) produceert qmake een Makefile dat je programma voor je zal bouwen. We zullen later kijken naar hoe we zelf een .pro kunnen schrijven.
<code>qmake -project<br />qmake<br />make</code>
 
Dit laat een executable achter in de part1 map (onthoud dat op Windows je mogelijk gebruik moet maken van nmake in plaats van make. Daarnaast word de executable in de map part1/debug of part1/release geplaatst). qmake is Qt's build applicatie dat een configuratie bestand accepteert. qmake genereert dit voor ons wanneer het argument -project word meegegeven. Aan de hand van het configuratie bestand (eindigend met .pro) produceert qmake een Makefile dat je programma voor je zal bouwen. We zullen later kijken naar hoe we zelf een .pro kunnen schrijven.


===Extra informatie===
=== Extra informatie ===


{| class="infotable line"
{|
| '''Onderwerp'''
|'''Onderwerp'''
| '''Hier'''
|'''Hier'''
|-
|-
| Widgets and Window Geometry
|Widgets and Window Geometry
|
|&quot;Window and Dialog Widgets&amp;quot;:http://doc.qt.nokia.com/4.7/application-windows.html
[http://doc.qt.nokia.com/4.7/application-windows.html Window and Dialog Widgets] ''[doc.qt.nokia.com]''
|-
|-
| Events and event handling
|Events and event handling
|
|&quot;The Event System&amp;quot;:http://doc.qt.nokia.com/4.7/eventsandfilters.html
[http://doc.qt.nokia.com/4.7/eventsandfilters.html The Event System] ''[doc.qt.nokia.com]''
|}
|}


==Afsluitknop toevoegen==
== Afsluitknop toevoegen ==


In een echte applicatie heb je normaal gesproken meer dan een widget nodig. We zullen nu de een [http://doc.qt.nokia.com/4.7/qpushbutton.html QPushButton] ''[doc.qt.nokia.com]'' introduceren onder de text edit. De knop zal de kladblok applicatie afsluiten wanneer er op wordt geklikt.
In een echte applicatie heb je normaal gesproken meer dan een widget nodig. We zullen nu de een &quot;QPushButton&amp;quot;:http://doc.qt.nokia.com/4.7/qpushbutton.html introduceren onder de text edit. De knop zal de kladblok applicatie afsluiten wanneer er op wordt geklikt.


[[Image:gs2.png]]
p=. [[Image:http://doc.qt.nokia.com/4.7/images/gs2.png|http://doc.qt.nokia.com/4.7/images/gs2.png]]


Laten we naar de code kijken.
Laten we naar de code kijken.


Regel 1 includet [http://doc.qt.nokia.com/4.7/qtgui.html QtGui] ''[doc.qt.nokia.com]'', welke alle <span class="caps">GUI</span> classes van Qt bevat.
<code>#include &lt;QtGui&amp;gt;
 
int main(int argv, char **args)<br />{<br /> QApplication app(argv, args);
 
QTextEdit textEdit;<br /> QPushButton quitButton(&quot;Quit&amp;quot;);
 
QObject::connect(&amp;quitButton, SIGNAL (clicked()), qApp, SLOT (quit()));
 
QVBoxLayout layout;<br /> layout.addWidget(&amp;textEdit);<br /> layout.addWidget(&amp;quitButton);
 
QWidget window;<br /> window.setLayout(&amp;layout);
 
window.show();
 
return app.exec&amp;amp;#40;&amp;#41;;<br />}</code>
 
Regel 1 includet &quot;QtGui&amp;quot;:http://doc.qt.nokia.com/4.7/qtgui.html, welke alle GUI classes van Qt bevat.


Regel 10 gebruikt de Signals en Slots mechanismen van Qt om te zorgen dat de applicatie afsluit wanneer op de '''Quit knop''' geklikt wordt. Een slot is een functie die als een programma draait, aangeroepen kan worden via zijn naam (als een string). Een signal is een functie die wanneer hij uitgevoerd wordt de slots zal aanroepen die erbij geregistreerd zijn; dat noemen we het slot verbinden met het signal en het signal uitzenden.
Regel 10 gebruikt de Signals en Slots mechanismen van Qt om te zorgen dat de applicatie afsluit wanneer op de '''Quit knop''' geklikt wordt. Een slot is een functie die als een programma draait, aangeroepen kan worden via zijn naam (als een string). Een signal is een functie die wanneer hij uitgevoerd wordt de slots zal aanroepen die erbij geregistreerd zijn; dat noemen we het slot verbinden met het signal en het signal uitzenden.


[http://doc.qt.nokia.com/4.7/qcoreapplication.html#quit quit()] ''[doc.qt.nokia.com]'' is een slot van [http://doc.qt.nokia.com/4.7/qapplication.html QApplication] ''[doc.qt.nokia.com]'' dat de applicatie afsluit. [http://doc.qt.nokia.com/4.7/qabstractbutton.html#clicked clicked()] ''[doc.qt.nokia.com]'' is een signal dat [http://doc.qt.nokia.com/4.7/qpushbutton.html QPushButton] ''[doc.qt.nokia.com]'' uitzendt als erop geklikt wordt. De statische functie [http://doc.qt.nokia.com/4.7/qobject.html#connect QObject::connect()] ''[doc.qt.nokia.com]'' zorgt voor het verbinden van het slot met het signal. <span class="caps">SIGNAL</span> en <span class="caps">SLOT</span> zijn twee macros die de zogenaamde function signatures van het signal en het slot die verbonden dienen te worden als parameter nemen. We moeten ook pointers geven aan de objecten die het signal moeten zenden en ontvangen.
&quot;quit()&quot;:http://doc.qt.nokia.com/4.7/qcoreapplication.html#quit is een slot van &quot;QApplication&amp;quot;:http://doc.qt.nokia.com/4.7/qapplication.html dat de applicatie afsluit. &quot;clicked()&quot;:http://doc.qt.nokia.com/4.7/qabstractbutton.html#clicked is een signal dat &quot;QPushButton&amp;quot;:http://doc.qt.nokia.com/4.7/qpushbutton.html uitzendt als erop geklikt wordt. De statische functie &quot;QObject::connect()&quot;:http://doc.qt.nokia.com/4.7/qobject.html#connect zorgt voor het verbinden van het slot met het signal. SIGNAL () en SLOT() zijn twee macros die de zogenaamde function signatures van het signal en het slot die verbonden dienen te worden als parameter nemen. We moeten ook pointers geven aan de objecten die het signal moeten zenden en ontvangen.


Regel 12 maakt een [http://doc.qt.nokia.com/4.7/qvboxlayout.html QVBoxLayout] ''[doc.qt.nokia.com]''. Zoals eerder besproken kunnen widgets ook een container zijn voor andere widgets. Het is mogelijk om de grenzen (afmeting en positie) van child widgets direct in te stellen, maar het is meestal gemakkelijker om een layout te gebruiken. Een layout beheert de grenzen van de widgets die in een andere widget geplaatst zijn, de zogenaamde kinderen van die container widget. QVBoxLayout, bijvoorbeeld, plaatst de kinderen in een verticale rij onder elkaar.
Regel 12 maakt een &quot;QVBoxLayout&amp;quot;:http://doc.qt.nokia.com/4.7/qvboxlayout.html. Zoals eerder besproken kunnen widgets ook een container zijn voor andere widgets. Het is mogelijk om de grenzen (afmeting en positie) van child widgets direct in te stellen, maar het is meestal gemakkelijker om een layout te gebruiken. Een layout beheert de grenzen van de widgets die in een andere widget geplaatst zijn, de zogenaamde kinderen van die container widget. QVBoxLayout, bijvoorbeeld, plaatst de kinderen in een verticale rij onder elkaar.


Regel 13 en 14 voegen het tekst bewerkings vak en de knop toe aan de layout. Met regel 17 plaatsen we de layout in een widget.
Regel 13 en 14 voegen het tekst bewerkings vak en de knop toe aan de layout. Met regel 17 plaatsen we de layout in een widget.


===Extra informatie===
=== Extra informatie ===


{| class="infotable line"
{|
| '''Onderwerp'''
|'''Onderwerp'''
| '''Hier'''
|'''Hier'''
|-
|-
| Signals and slots
|Signals and slots
|
|&quot;Signals &amp; Slots&amp;quot;:http://doc.qt.nokia.com/4.7/signalsandslots.html
[http://doc.qt.nokia.com/4.7/signalsandslots.html Signals &amp; Slots] ''[doc.qt.nokia.com]''
|-
|-
| Layouts
|Layouts
|
|&quot;Layout Management&amp;quot;:http://doc.qt.nokia.com/4.7/layout.html, &quot;Widgets and Layouts&amp;quot;:http://doc.qt.nokia.com/4.7/widgets-and-layouts.html, &quot;Layout Examples&amp;quot;:http://doc.qt.nokia.com/4.7/examples-layouts.html
[http://doc.qt.nokia.com/4.7/layout.html Layout Management] ''[doc.qt.nokia.com]'', [http://doc.qt.nokia.com/4.7/widgets-and-layouts.html Widgets and Layouts] ''[doc.qt.nokia.com]'', [http://doc.qt.nokia.com/4.7/examples-layouts.html Layout Examples] ''[doc.qt.nokia.com]''
|-
|-
| The widgets that come with Qt
|The widgets that come with Qt
|
|&quot;Qt Widget Gallery&amp;quot;:http://doc.qt.nokia.com/4.7/gallery.html, &quot;Widget Examples&amp;quot;:http://doc.qt.nokia.com/4.7/examples-widgets.html
[http://doc.qt.nokia.com/4.7/gallery.html Qt Widget Gallery] ''[doc.qt.nokia.com]'', [http://doc.qt.nokia.com/4.7/examples-widgets.html Widget Examples] ''[doc.qt.nokia.com]''
|}
|}


==Subklasse van QWidget==
== Subklasse van QWidget ==


Het kan zijn dat als de gebruiker de applicatie afsluit je een dialoogscherm wil tonen met de vraag of hij/zij de applicatie echt wil afsluiten. In dit voorbeeld leiden we een klasse af van QWidget, en we voegen een slot toe dat we met de Quit knop verbinden.
Het kan zijn dat als de gebruiker de applicatie afsluit je een dialoogscherm wil tonen met de vraag of hij/zij de applicatie echt wil afsluiten. In dit voorbeeld leiden we een klasse af van QWidget, en we voegen een slot toe dat we met de Quit knop verbinden.


[[Image:gs3.png]]
p=. [[Image:http://doc.qt.nokia.com/4.7/images/gs3.png|http://doc.qt.nokia.com/4.7/images/gs3.png]]


Laten we naar de code kijken:
Laten we naar de code kijken:


De [http://doc.qt.nokia.com/4.7/qobject.html#Q_OBJECT Q_OBJECT] ''[doc.qt.nokia.com]'' macro moet als eerste in de class definitie, het definieert onze class als een [http://doc.qt.nokia.com/4.7/qobject.html QObject] ''[doc.qt.nokia.com]'' (Dit betekent dat je ook [http://doc.qt.nokia.com/4.7/qobject.html QObject] ''[doc.qt.nokia.com]'' moet overerven). Een [http://doc.qt.nokia.com/4.7/qobject.html QObject] ''[doc.qt.nokia.com]'' voegt meerdere extra opties toe aan een normale C++ class. Met name, de class naam en slot namen kunnen tijdens het runnen worden opgevraagd, daarnaast is het mogelijk om de parameters van een slot op te vragen en deze aan te roepen.
<code>class Notepad : public QWidget<br />{<br /> Q_OBJECT


Regel 13 definieert het slot quit(). Dit wordt makkelijk gemaakt door de slots macro. Het quit() slot kan nu worden verbonden met signals die dezelfde function signature hebben (ieder signal dat geen parameters heeft).
public:<br /> Notepad();


In plaats van het opzetten van de <span class="caps">GUI</span> en het verbinden van het slot in de main() functie, maken we nu gebruik van de constructor van Notepad.
private slots:<br /> void quit();


Zoals je als zag in de class definitie, gebruiken we pointers voor onze [http://doc.qt.nokia.com/4.7/qobject.html QObjects] ''[doc.qt.nokia.com]'' (textEdit en quitButton). Als een regel, moet je [http://doc.qt.nokia.com/4.7/qobject.html QObjects] ''[doc.qt.nokia.com]'' altijd op de heap alloceren en er nooit een kopie van maken.
private:<br /> QTextEdit *textEdit;<br /> QPushButton *quitButton;<br />};</code>


We maken nu gebruik van de functie [http://doc.qt.nokia.com/4.7/qobject.html#tr tr()] ''[doc.qt.nokia.com]'' rond onze zichtbare strings. Deze functie is nodig als je de applicatie in meer dan een taal wil aanbieden (bijvoorbeeld: Engels en Chinees). Hierover zullen we hier niet in meer detail op ingaan, maar je kan de Qt Linguist link van de extra informatie tabel volgen.
De &quot;Q_OBJECT&amp;quot;:http://doc.qt.nokia.com/4.7/qobject.html#Q_OBJECT macro moet als eerste in de class definitie, het definieert onze class als een &quot;QObject&amp;quot;:http://doc.qt.nokia.com/4.7/qobject.html (Dit betekent dat je ook &quot;QObject&amp;quot;:http://doc.qt.nokia.com/4.7/qobject.html moet overerven). Een &quot;QObject&amp;quot;:http://doc.qt.nokia.com/4.7/qobject.html voegt meerdere extra opties toe aan een normale C++ class. Met name, de class naam en slot namen kunnen tijdens het runnen worden opgevraagd, daarnaast is het mogelijk om de parameters van een slot op te vragen en deze aan te roepen.


===Extra informatie {| class="infotable line" | Onderwerp | Hier |- | tr() and internationalization | [http://doc.qt.nokia.com/4.7/linguist-manual.html Qt Linguist Manual] ''[doc.qt.nokia.com]'', [http://doc.qt.nokia.com/4.7/i18n-source-translation.html Writing Source Code for Translation] ''[doc.qt.nokia.com]'', [http://doc.qt.nokia.com/4.7/linguist-hellotr.html Hello tr] ''[doc.qt.nokia.com]''() Example, [http://doc.qt.nokia.com/4.7/internationalization.html Internationalization with Qt] ''[doc.qt.nokia.com]'' |- | QObjects and the Qt Object model (This is essential to understand Qt) | [http://doc.qt.nokia.com/4.7/object.html Object Model] ''[doc.qt.nokia.com]'' |- | qmake and the Qt build system | [http://doc.qt.nokia.com/4.7/qmake-manual.html qmake Manual] ''[doc.qt.nokia.com]'' |}===
Regel 13 definieert het slot quit(). Dit wordt makkelijk gemaakt door de slots macro. Het quit() slot kan nu worden verbonden met signals die dezelfde function signature hebben (ieder signal dat geen parameters heeft).
 
===Aanmaken van een .pro bestand===
 
Voor dit voorbeeld maken we ons eigen .pro bestand, in plaats van gebruik te maken van de optie -project van qmake.
 
De volgende opdrachten bouwen dan het voorbeeld.
 
==Gebruik maken van QMainWindow==
 
Veel applicaties zullen ########## van het gebruik van een [http://doc.qt.nokia.com/4.7/qmainwindow.html QMainWindow] ''[doc.qt.nokia.com]'', welke zijn eigen layout heeft waaraan je bijvoorbeeld een menu balk, dock widgets, tool balken, en een status balk kan toevoegen. [http://doc.qt.nokia.com/4.7/qmainwindow.html QMainWindow] ''[doc.qt.nokia.com]'' heeft een centrum gebied dat gebruikt kan worden voor ieder type widget. In ons geval zullen we daar ons text edit plaatsen.
 
[[Image:gs4.png]]
 
Laten we kijken naar de class definitie van Notepad.
 
We includen nog 2 slots die documenten kunnen openen en opslaan. Deze zullen in de volgende sectie implementeren.
 
In een main window moet hetzelfde slot vaak door meerdere widgets worden aangeroepen. Voorbeelden hiervan zijn menu items en knoppen op een tool bar. Om dit makkelijker te maken heeft Qt [http://doc.qt.nokia.com/4.7/qaction.html QAction] ''[doc.qt.nokia.com]'', welke aan meerdere widgets meegegeven kan worden en verbonden kan worden aan een slot. Zowel een [http://doc.qt.nokia.com/4.7/qmenu.html QMenu] ''[doc.qt.nokia.com]'' als een [http://doc.qt.nokia.com/4.7/qtoolbar.html QToolBar] ''[doc.qt.nokia.com]'' kunnen bijvoorbeeld menu items en tool buttons maken van dezelfde [http://doc.qt.nokia.com/4.7/qaction.html QActions] ''[doc.qt.nokia.com]''. We zullen zo zien hoe dit werkt.
 
Net als de vorige keer, gebruiken we de constructor van Notepad voor het aanmaken van de <span class="caps">GUI</span>.
 
[http://doc.qt.nokia.com/4.7/qaction.html QActions] ''[doc.qt.nokia.com]'' worden aangemaakt met de text die zichtbaar moet zijn op de widgets waar we ze aan toevoegen (in ons geval, menu items). Als we ze ook aan een tool bar wilden toevoegen, zouden we een [http://doc.qt.nokia.com/4.7/qicon.html icon] ''[doc.qt.nokia.com]'' kunnen meegeven aan de actions.
 
Wanneer er op een menu item word geklikt, zal dit de action triggeren, en het bijbehorende slot zal worden aangeroepen.
 
===Extra informatie {| class="infotable line" | Onderwerp | Hier |- | Main windows and main window classes | [http://doc.qt.nokia.com/4.7/mainwindow.html Application Main Window] ''[doc.qt.nokia.com]'', [http://doc.qt.nokia.com/4.7/examples-mainwindow.html Main Window Examples] ''[doc.qt.nokia.com]'' |- | <span class="caps">MDI</span> applications | [http://doc.qt.nokia.com/4.7/qmdiarea.html QMdiArea] ''[doc.qt.nokia.com]'', [http://doc.qt.nokia.com/4.7/mainwindows-mdi.html <span class="caps">MDI</span> Example] ''[doc.qt.nokia.com]'' |}===
 
==Opslaan en laden==
 
In dit voorbeeld zullen we de functionaliteit van de open() en save() slots, die we in het vorige voorbeeld hebben toegevoegd, implementeren.
 
[[Image:gs5.png]]


We zullen beginnen met het open() slot:
In plaats van het opzetten van de GUI en het verbinden van het slot in de main() functie, maken we nu gebruik van de constructor van Notepad.


De eerst stap is om aan de gebruiker de naam van het bestand dat geopend moet worden te vragen. Qt heeft een [http://doc.qt.nokia.com/4.7/qfiledialog.html QFileDialog] ''[doc.qt.nokia.com]'', welke een dialog is waarin de gebruiker een bestand kan selecteren. Het plaatje hierboven toont dit dialog in Kubuntu. De static [http://doc.qt.nokia.com/4.7/qfiledialog.html#getOpenFileName getOpenFileName()] ''[doc.qt.nokia.com]'' functie toont een modal file dialog, en keert niet terug totdat de gebruiker een file heeft geselecteerd. Het geeft de bestands locatie van het bestand dat is geselecteerd terug, of een lege string wanneer de gebruiker op cancel heeft gedrukt.
<code>Notepad::Notepad()<br />{<br /> textEdit = new QTextEdit;<br /> quitButton = new QPushButton(tr(&quot;Quit&amp;quot;));


Als we eenmaal een bestands naam hebben, proberen we dit bestand te openen met [http://doc.qt.nokia.com/4.7/qiodevice.html#open open()] ''[doc.qt.nokia.com]'', welke true terug geeft als het bestand geopend kon worden. We zullen niet ingaan op de error afhandeling, maar je kan daarvoor de links in het extra informatie deel volgen. Als het bestand niet kon worden geopend, gebruiken we [http://doc.qt.nokia.com/4.7/qmessagebox.html QMessageBox] ''[doc.qt.nokia.com]'' om een dialog te tonen met daarin het error bericht (bekijk de [http://doc.qt.nokia.com/4.7/qmessagebox.html QMessageBox] ''[doc.qt.nokia.com]'' class beschrijving voor meer informatie).
connect(quitButton, SIGNAL (clicked()), this, SLOT (quit()));


Het lezen van data is eigenlijk heel triviaal door middel van de [http://doc.qt.nokia.com/4.7/qiodevice.html#readAll readAll()] ''[doc.qt.nokia.com]'' functie, welke alle data in het bestand teruggeeft als een [http://doc.qt.nokia.com/4.7/qbytearray.html QByteArray] ''[doc.qt.nokia.com]''. De [http://doc.qt.nokia.com/4.7/qbytearray.html#constData constData()] ''[doc.qt.nokia.com]'' geeft alle data terug als een array van const char*, waar QString een constructor voor heeft. De inhoud kan dan worden getoond in de text edit. We sluiten dan het bestand af met [http://doc.qt.nokia.com/4.7/qiodevice.html#close close()] ''[doc.qt.nokia.com]'' om de file descriptor terug te geven aan het besturings systeem.
QVBoxLayout '''layout = new QVBoxLayout;<br /> layout-&gt;addWidget(textEdit);<br /> layout-&gt;addWidget(quitButton);
<br /> setLayout(layout);
<br /> setWindowTitle(tr(&quot;Notepad&amp;quot;));<br />}</code>
<br />Zoals je als zag in de class definitie, gebruiken we pointers voor onze &quot;QObjects&amp;quot;:http://doc.qt.nokia.com/4.7/qobject.html (textEdit en quitButton). Als een regel, moet je &quot;QObjects&amp;quot;:http://doc.qt.nokia.com/4.7/qobject.html altijd op de heap alloceren en er nooit een kopie van maken.
<br />We maken nu gebruik van de functie &quot;tr()&quot;:http://doc.qt.nokia.com/4.7/qobject.html#tr rond onze zichtbare strings. Deze functie is nodig als je de applicatie in meer dan een taal wil aanbieden (bijvoorbeeld: Engels en Chinees). Hierover zullen we hier niet in meer detail op ingaan, maar je kan de Qt Linguist link van de extra informatie tabel volgen.
<br />h3. Extra informatie<br />|Onderwerp|Hier|<br />|tr() and internationalization|&quot;Qt Linguist Manual&amp;quot;:http://doc.qt.nokia.com/4.7/linguist-manual.html, &quot;Writing Source Code for Translation&amp;quot;:http://doc.qt.nokia.com/4.7/i18n-source-translation.html, &quot;Hello tr&amp;quot;:http://doc.qt.nokia.com/4.7/linguist-hellotr.html() Example, &quot;Internationalization with Qt&amp;quot;:http://doc.qt.nokia.com/4.7/internationalization.html|<br />|QObjects and the Qt Object model (This is essential to understand Qt)|&quot;Object Model&amp;quot;:http://doc.qt.nokia.com/4.7/object.html|<br />|qmake and the Qt build system|&quot;qmake Manual&amp;quot;:http://doc.qt.nokia.com/4.7/qmake-manual.html|
<br />h3. Aanmaken van een .pro bestand
<br />Voor dit voorbeeld maken we ons eigen .pro bestand, in plaats van gebruik te maken van de optie <s>project van qmake.
<br /><code>HEADERS = notepad.h<br />SOURCES = notepad.cpp  main.cpp</code>
<br />De volgende opdrachten bouwen dan het voorbeeld.
<br /><code>qmake<br />make</code>
<br />h2. Gebruik maken van QMainWindow
<br />Veel applicaties zullen profiteren van het gebruik van een &quot;QMainWindow&amp;quot;:http://doc.qt.nokia.com/4.7/qmainwindow.html, welke zijn eigen layout heeft waaraan je bijvoorbeeld een menu balk, dock widgets, tool balken, en een status balk kan toevoegen. &quot;QMainWindow&amp;quot;:http://doc.qt.nokia.com/4.7/qmainwindow.html heeft een centrum gebied dat gebruikt kan worden voor ieder type widget. In ons geval zullen we daar ons text edit plaatsen.
<br />p=. [[Image:http://doc.qt.nokia.com/4.7/images/gs4.png|http://doc.qt.nokia.com/4.7/images/gs4.png]]
<br />Laten we kijken naar de class definitie van Notepad.
<br /><code>#include &lt;QtGui&amp;gt;
<br />class Notepad : public QMainWindow<br />{<br /> Q_OBJECT
<br />public:<br /> Notepad();
<br />private slots:<br /> void open();<br /> void save();<br /> void quit();
<br />private:<br /> QTextEdit *textEdit;
<br /> QAction *openAction;<br /> QAction *saveAction;<br /> QAction *exitAction;
<br /> QMenu '''fileMenu;<br />};</code>
<br />We includen nog 2 slots die documenten kunnen openen en opslaan. Deze zullen in de volgende sectie implementeren.
<br />In een main window moet hetzelfde slot vaak door meerdere widgets worden aangeroepen. Voorbeelden hiervan zijn menu items en knoppen op een tool bar. Om dit makkelijker te maken heeft Qt &quot;QAction&amp;quot;:http://doc.qt.nokia.com/4.7/qaction.html, welke aan meerdere widgets meegegeven kan worden en verbonden kan worden aan een slot. Zowel een &quot;QMenu&amp;quot;:http://doc.qt.nokia.com/4.7/qmenu.html als een &quot;QToolBar&amp;quot;:http://doc.qt.nokia.com/4.7/qtoolbar.html kunnen bijvoorbeeld menu items en tool buttons maken van dezelfde &quot;QActions&amp;quot;:http://doc.qt.nokia.com/4.7/qaction.html. We zullen zo zien hoe dit werkt.
<br />Net als de vorige keer, gebruiken we de constructor van Notepad voor het aanmaken van de GUI.
<br /><code>Notepad::Notepad()<br />{<br /> saveAction = new QAction(tr(&quot;&amp;Open&amp;quot;), this);<br /> saveAction = new QAction(tr(&quot;&amp;Save&amp;quot;), this);<br /> exitAction = new QAction(tr(&quot;E&amp;amp;xit&amp;quot;), this);
<br /> connect(openAction, SIGNAL (triggered()), this, SLOT (open()));<br /> connect(saveAction, SIGNAL (triggered()), this, SLOT (save()));<br /> connect(exitAction, SIGNAL (triggered()), qApp, SLOT (quit()));
<br /> fileMenu = menuBar()<s>&gt;addMenu(tr(&quot;&amp;File&amp;quot;));<br /> fileMenu</s>&gt;addAction(openAction);<br /> fileMenu-&gt;addAction(saveAction);<br /> fileMenu-&gt;addSeparator();<br /> fileMenu-&gt;addAction(exitAction);
<br /> textEdit = new QTextEdit;<br /> setCentralWidget(textEdit);
<br /> setWindowTitle(tr(&quot;Notepad&amp;quot;));<br />}</code>
<br />&quot;QActions&amp;quot;:http://doc.qt.nokia.com/4.7/qaction.html worden aangemaakt met de text die zichtbaar moet zijn op de widgets waar we ze aan toevoegen (in ons geval, menu items). Als we ze ook aan een tool bar wilden toevoegen, zouden we een &quot;icon&amp;quot;:http://doc.qt.nokia.com/4.7/qicon.html kunnen meegeven aan de actions.
<br />Wanneer er op een menu item word geklikt, zal dit de action triggeren, en het bijbehorende slot zal worden aangeroepen.
<br />h3. Extra informatie<br />|Onderwerp|Hier|<br />|Main windows and main window classes|&quot;Application Main Window&amp;quot;:http://doc.qt.nokia.com/4.7/mainwindow.html, &quot;Main Window Examples&amp;quot;:http://doc.qt.nokia.com/4.7/examples-mainwindow.html|<br />|MDI applications|&quot;QMdiArea&amp;quot;:http://doc.qt.nokia.com/4.7/qmdiarea.html, &quot;MDI Example&amp;quot;:http://doc.qt.nokia.com/4.7/mainwindows-mdi.html|
<br />h2. Opslaan en laden
<br />In dit voorbeeld zullen we de functionaliteit van de open() en save() slots, die we in het vorige voorbeeld hebben toegevoegd, implementeren.
<br />p=. [[Image:http://doc.qt.nokia.com/4.7/images/gs5.png|http://doc.qt.nokia.com/4.7/images/gs5.png]]
<br />We zullen beginnen met het open() slot:
<br /><code>QString fileName = QFileDialog::getOpenFileName(this, tr(&quot;Open File&amp;quot;), &quot;&quot;,<br /> tr(&quot;Text Files ('''.txt);;C++ Files ('''.cpp'''.h)&quot;));
<br />if (fileName != &quot;&quot;) {<br /> QFile file&amp;amp;#40;fileName&amp;amp;#41;;<br /> if (!file.open(QIODevice::ReadOnly)) {<br /> QMessageBox::critical(this, tr(&quot;Error&amp;quot;),<br /> tr(&quot;Could not open file&amp;quot;));<br /> return;<br /> }<br /> QString contents = file.readAll().constData();<br /> textEdit</s>&gt;setPlainText(contents);<br /> file.close();<br />}</code>
<br />De eerst stap is om aan de gebruiker de naam van het bestand dat geopend moet worden te vragen. Qt heeft een &quot;QFileDialog&amp;quot;:http://doc.qt.nokia.com/4.7/qfiledialog.html, welke een dialog is waarin de gebruiker een bestand kan selecteren. Het plaatje hierboven toont dit dialog in Kubuntu. De static &quot;getOpenFileName()&quot;:http://doc.qt.nokia.com/4.7/qfiledialog.html#getOpenFileName functie toont een modal file dialog, en keert niet terug totdat de gebruiker een file heeft geselecteerd. Het geeft de bestands locatie van het bestand dat is geselecteerd terug, of een lege string wanneer de gebruiker op cancel heeft gedrukt.
<br />Als we eenmaal een bestands naam hebben, proberen we dit bestand te openen met &quot;open()&quot;:http://doc.qt.nokia.com/4.7/qiodevice.html#open, welke true terug geeft als het bestand geopend kon worden. We zullen niet ingaan op de error afhandeling, maar je kan daarvoor de links in het extra informatie deel volgen. Als het bestand niet kon worden geopend, gebruiken we &quot;QMessageBox&amp;quot;:http://doc.qt.nokia.com/4.7/qmessagebox.html om een dialog te tonen met daarin het error bericht (bekijk de &quot;QMessageBox&amp;quot;:http://doc.qt.nokia.com/4.7/qmessagebox.html class beschrijving voor meer informatie).
<br />Het lezen van data is eigenlijk heel triviaal door middel van de &quot;readAll()&quot;:http://doc.qt.nokia.com/4.7/qiodevice.html#readAll functie, welke alle data in het bestand teruggeeft als een &quot;QByteArray&amp;quot;:http://doc.qt.nokia.com/4.7/qbytearray.html. De &quot;constData()&quot;:http://doc.qt.nokia.com/4.7/qbytearray.html#constData geeft alle data terug als een array van const char''', waar QString een constructor voor heeft. De inhoud kan dan worden getoond in de text edit. We sluiten dan het bestand af met &quot;close()&quot;:http://doc.qt.nokia.com/4.7/qiodevice.html#close om de file descriptor terug te geven aan het besturings systeem.


Laten we nu kijken naar de implementatie van het save() slot.
Laten we nu kijken naar de implementatie van het save() slot.


We schrijven de inhoud van de text edit naar het bestand naar welke word gewezen in het [http://doc.qt.nokia.com/4.7/qfile.html QFile] ''[doc.qt.nokia.com]'' object, hiervoor gebruiken we de [http://doc.qt.nokia.com/4.7/qtextstream.html QTextStram] ''[doc.qt.nokia.com]'' class. De text stream kan een [http://doc.qt.nokia.com/4.7/qstring.html QString] ''[doc.qt.nokia.com]'' direct naar het bestand schrijven; [http://doc.qt.nokia.com/4.7/qfile.html QFile] ''[doc.qt.nokia.com]'' accepteert alleen ruwe data (char*) met de [http://doc.qt.nokia.com/4.7/qiodevice.html#write write()] ''[doc.qt.nokia.com]'' functies van het [http://doc.qt.nokia.com/4.7/qiodevice.html <span class="caps">QIOD</span>evice] ''[doc.qt.nokia.com]''.
<code>QString fileName = QFileDialog::getSaveFileName(this, tr(&quot;Save File&amp;quot;), &quot;&quot;,<br /> tr(&quot;Text Files ('''.txt);;C++ Files ('''.cpp '''.h)&quot;));
<br />if (fileName != &quot;&quot;) {<br /> QFile file&amp;amp;#40;fileName&amp;amp;#41;;<br /> if (!file.open(QIODevice::WriteOnly)) {<br /> // error message<br /> } else {<br /> QTextStream stream(&amp;file);<br /> stream &lt;&lt; textEdit-&gt;toPlainText();<br /> stream.flush();<br /> file.close();<br /> }<br />}</code>
<br />We schrijven de inhoud van de text edit naar het bestand naar welke word gewezen in het &quot;QFile&amp;quot;:http://doc.qt.nokia.com/4.7/qfile.html object, hiervoor gebruiken we de &quot;QTextStram&amp;quot;:http://doc.qt.nokia.com/4.7/qtextstream.html class. De text stream kan een &quot;QString&amp;quot;:http://doc.qt.nokia.com/4.7/qstring.html direct naar het bestand schrijven; &quot;QFile&amp;quot;:http://doc.qt.nokia.com/4.7/qfile.html accepteert alleen ruwe data (char''') met de &quot;write()&quot;:http://doc.qt.nokia.com/4.7/qiodevice.html#write functies van het &quot;QIODevice&amp;quot;:http://doc.qt.nokia.com/4.7/qiodevice.html.


===Extra informatie {| class="infotable line" | Onderwerp | Hier |- | Files and I/O devices | [http://doc.qt.nokia.com/4.7/qfile.html QFile] ''[doc.qt.nokia.com]'', [http://doc.qt.nokia.com/4.7/qiodevice.html <span class="caps">QIOD</span>evice] ''[doc.qt.nokia.com]'' |}===
=== Extra informatie<br />|Onderwerp|Hier| ===

Revision as of 11:03, 24 February 2015

[toc align_right="yes&quot; depth="3&quot;]

Beginnen met programmeren in Qt

Welkom in de wereld van Qt — de cross-platform GUI toolkit. In deze "getting started guide&quot; zullen we u basis Qt kennis bijbrengen door een simpele kladblok applicatie te maken. Na het lezen van deze oefening, zult u klaar zijn om in onze overzichten en API documentatie te duiken, en alle informatie te vinden die u nodig heeft voor de applicatie die u ontwikkelt.

Hallo Kladblok

In dit eerste voorbeeld zullen we een eenvoudig venster op de desktop maken met daarin een text edit. Dit representeert het simpelste Qt programma met een GUI.

p=. http://doc.qt.nokia.com/4.7/images/gs1.png

Hier is de code:

#include &lt;QApplication&amp;gt;<br />#include &lt;QTextEdit&amp;gt;

int main(int argv, char **args)<br />{<br /> QApplication app(argv, args);

QTextEdit textEdit;<br /> textEdit.show();

return app.exec&amp;amp;#40;&amp;#41;;<br />}

Laten we dit stuk code regel voor regel doornemen. In de eerste twee regels includen we de header files voor "QApplication&quot;:http://doc.qt.nokia.com/4.7/qapplication.html en "QTextEdit&quot;:http://doc.qt.nokia.com/4.7/qtextedit.html, die de twee classes zijn die we voor dit voorbeeld nodig hebben. Alle Qt classes hebben een header met zelfde naam.

Regel 6 creëert een "QApplication&quot;:http://doc.qt.nokia.com/4.7/qapplication.html object. Dit object beheert alle resources die nodig zijn voor een Qt applicatie met een GUI. Het heeft argv en args nodig omdat Qt applicaties enkele command line argumenten accepteren.

Regel 8 creert een "QTextEdit&quot;:http://doc.qt.nokia.com/4.7/qtextedit.html object. Een text edit is een visueel element in de GUI. In Qt noemen we dit soort elementen widgets. Voorbeelden van andere widgets zijn scroll bars, labels en radio knoppen. Een widget can ook een container zijn voor andere widgets, een dialog of een main applicatie bijvoorbeeld.

Regel 9 toont de text edit op het scherm in zijn eigen window frame. Omdat widgets ook als containers functioneren (bijvoorbeeld een "QMainWindow&quot;:http://doc.qt.nokia.com/4.7/qmainwindow.html, die toolbars, menus, een status bar, en een aantal andere widgets bezit), is het mogelijk om een enkele widget te tonen in zijn eigen window. Widgets zijn niet standaard zichtbaar. De functie "show()":http://doc.qt.nokia.com/4.7/qwidget.html#show zorgt dat ze zichtbaar worden.

Regel 11 zorgt ervoor dat de "QApplication&quot;:http://doc.qt.nokia.com/4.7/qapplication.html zijn event loop ingaat. Wanneer een Qt applicatie draait worden events gegenereerd en verzonden naar de widgets van de applicatie. Voorbeelden van events zijn muisklikken en toetsaanslagen. Wanneer je text typt in de text edit widget, ontvangt het toetsaanslagevents en reageert dan door de text te tekenen.

Om de applicatie te draaien open je een command prompt en voert de directory in waarin het .cpp bestand van het programma staat. De volgende opdrachten bouwen dan je programma.

qmake -project<br />qmake<br />make

Dit laat een executable achter in de part1 map (onthoud dat op Windows je mogelijk gebruik moet maken van nmake in plaats van make. Daarnaast word de executable in de map part1/debug of part1/release geplaatst). qmake is Qt's build applicatie dat een configuratie bestand accepteert. qmake genereert dit voor ons wanneer het argument -project word meegegeven. Aan de hand van het configuratie bestand (eindigend met .pro) produceert qmake een Makefile dat je programma voor je zal bouwen. We zullen later kijken naar hoe we zelf een .pro kunnen schrijven.

Extra informatie

Onderwerp Hier
Widgets and Window Geometry "Window and Dialog Widgets&quot;:http://doc.qt.nokia.com/4.7/application-windows.html
Events and event handling "The Event System&quot;:http://doc.qt.nokia.com/4.7/eventsandfilters.html

Afsluitknop toevoegen

In een echte applicatie heb je normaal gesproken meer dan een widget nodig. We zullen nu de een "QPushButton&quot;:http://doc.qt.nokia.com/4.7/qpushbutton.html introduceren onder de text edit. De knop zal de kladblok applicatie afsluiten wanneer er op wordt geklikt.

p=. http://doc.qt.nokia.com/4.7/images/gs2.png

Laten we naar de code kijken.

#include &lt;QtGui&amp;gt;

int main(int argv, char **args)<br />{<br /> QApplication app(argv, args);

QTextEdit textEdit;<br /> QPushButton quitButton(&quot;Quit&amp;quot;);

QObject::connect(&amp;quitButton, SIGNAL (clicked()), qApp, SLOT (quit()));

QVBoxLayout layout;<br /> layout.addWidget(&amp;textEdit);<br /> layout.addWidget(&amp;quitButton);

QWidget window;<br /> window.setLayout(&amp;layout);

window.show();

return app.exec&amp;amp;#40;&amp;#41;;<br />}

Regel 1 includet "QtGui&quot;:http://doc.qt.nokia.com/4.7/qtgui.html, welke alle GUI classes van Qt bevat.

Regel 10 gebruikt de Signals en Slots mechanismen van Qt om te zorgen dat de applicatie afsluit wanneer op de Quit knop geklikt wordt. Een slot is een functie die als een programma draait, aangeroepen kan worden via zijn naam (als een string). Een signal is een functie die wanneer hij uitgevoerd wordt de slots zal aanroepen die erbij geregistreerd zijn; dat noemen we het slot verbinden met het signal en het signal uitzenden.

"quit()":http://doc.qt.nokia.com/4.7/qcoreapplication.html#quit is een slot van "QApplication&quot;:http://doc.qt.nokia.com/4.7/qapplication.html dat de applicatie afsluit. "clicked()":http://doc.qt.nokia.com/4.7/qabstractbutton.html#clicked is een signal dat "QPushButton&quot;:http://doc.qt.nokia.com/4.7/qpushbutton.html uitzendt als erop geklikt wordt. De statische functie "QObject::connect()":http://doc.qt.nokia.com/4.7/qobject.html#connect zorgt voor het verbinden van het slot met het signal. SIGNAL () en SLOT() zijn twee macros die de zogenaamde function signatures van het signal en het slot die verbonden dienen te worden als parameter nemen. We moeten ook pointers geven aan de objecten die het signal moeten zenden en ontvangen.

Regel 12 maakt een "QVBoxLayout&quot;:http://doc.qt.nokia.com/4.7/qvboxlayout.html. Zoals eerder besproken kunnen widgets ook een container zijn voor andere widgets. Het is mogelijk om de grenzen (afmeting en positie) van child widgets direct in te stellen, maar het is meestal gemakkelijker om een layout te gebruiken. Een layout beheert de grenzen van de widgets die in een andere widget geplaatst zijn, de zogenaamde kinderen van die container widget. QVBoxLayout, bijvoorbeeld, plaatst de kinderen in een verticale rij onder elkaar.

Regel 13 en 14 voegen het tekst bewerkings vak en de knop toe aan de layout. Met regel 17 plaatsen we de layout in een widget.

Extra informatie

Onderwerp Hier
Signals and slots "Signals & Slots&quot;:http://doc.qt.nokia.com/4.7/signalsandslots.html
Layouts "Layout Management&quot;:http://doc.qt.nokia.com/4.7/layout.html, "Widgets and Layouts&quot;:http://doc.qt.nokia.com/4.7/widgets-and-layouts.html, "Layout Examples&quot;:http://doc.qt.nokia.com/4.7/examples-layouts.html
The widgets that come with Qt "Qt Widget Gallery&quot;:http://doc.qt.nokia.com/4.7/gallery.html, "Widget Examples&quot;:http://doc.qt.nokia.com/4.7/examples-widgets.html

Subklasse van QWidget

Het kan zijn dat als de gebruiker de applicatie afsluit je een dialoogscherm wil tonen met de vraag of hij/zij de applicatie echt wil afsluiten. In dit voorbeeld leiden we een klasse af van QWidget, en we voegen een slot toe dat we met de Quit knop verbinden.

p=. http://doc.qt.nokia.com/4.7/images/gs3.png

Laten we naar de code kijken:

class Notepad : public QWidget<br />{<br /> Q_OBJECT

public:<br /> Notepad();

private slots:<br /> void quit();

private:<br /> QTextEdit *textEdit;<br /> QPushButton *quitButton;<br />};

De "Q_OBJECT&quot;:http://doc.qt.nokia.com/4.7/qobject.html#Q_OBJECT macro moet als eerste in de class definitie, het definieert onze class als een "QObject&quot;:http://doc.qt.nokia.com/4.7/qobject.html (Dit betekent dat je ook "QObject&quot;:http://doc.qt.nokia.com/4.7/qobject.html moet overerven). Een "QObject&quot;:http://doc.qt.nokia.com/4.7/qobject.html voegt meerdere extra opties toe aan een normale C++ class. Met name, de class naam en slot namen kunnen tijdens het runnen worden opgevraagd, daarnaast is het mogelijk om de parameters van een slot op te vragen en deze aan te roepen.

Regel 13 definieert het slot quit(). Dit wordt makkelijk gemaakt door de slots macro. Het quit() slot kan nu worden verbonden met signals die dezelfde function signature hebben (ieder signal dat geen parameters heeft).

In plaats van het opzetten van de GUI en het verbinden van het slot in de main() functie, maken we nu gebruik van de constructor van Notepad.

Notepad::Notepad()<br />{<br /> textEdit = new QTextEdit;<br /> quitButton = new QPushButton(tr(&quot;Quit&amp;quot;));

connect(quitButton, SIGNAL (clicked()), this, SLOT (quit()));

QVBoxLayout '''layout = new QVBoxLayout;<br /> layout-&gt;addWidget(textEdit);<br /> layout-&gt;addWidget(quitButton);
<br /> setLayout(layout);
<br /> setWindowTitle(tr(&quot;Notepad&amp;quot;));<br />}


Zoals je als zag in de class definitie, gebruiken we pointers voor onze "QObjects&quot;:http://doc.qt.nokia.com/4.7/qobject.html (textEdit en quitButton). Als een regel, moet je "QObjects&quot;:http://doc.qt.nokia.com/4.7/qobject.html altijd op de heap alloceren en er nooit een kopie van maken.
We maken nu gebruik van de functie "tr()":http://doc.qt.nokia.com/4.7/qobject.html#tr rond onze zichtbare strings. Deze functie is nodig als je de applicatie in meer dan een taal wil aanbieden (bijvoorbeeld: Engels en Chinees). Hierover zullen we hier niet in meer detail op ingaan, maar je kan de Qt Linguist link van de extra informatie tabel volgen.
h3. Extra informatie
|Onderwerp|Hier|
|tr() and internationalization|"Qt Linguist Manual&quot;:http://doc.qt.nokia.com/4.7/linguist-manual.html, "Writing Source Code for Translation&quot;:http://doc.qt.nokia.com/4.7/i18n-source-translation.html, "Hello tr&quot;:http://doc.qt.nokia.com/4.7/linguist-hellotr.html() Example, "Internationalization with Qt&quot;:http://doc.qt.nokia.com/4.7/internationalization.html%7C
|QObjects and the Qt Object model (This is essential to understand Qt)|"Object Model&quot;:http://doc.qt.nokia.com/4.7/object.html%7C
|qmake and the Qt build system|"qmake Manual&quot;:http://doc.qt.nokia.com/4.7/qmake-manual.html%7C
h3. Aanmaken van een .pro bestand
Voor dit voorbeeld maken we ons eigen .pro bestand, in plaats van gebruik te maken van de optie project van qmake.


HEADERS = notepad.h<br />SOURCES = notepad.cpp  main.cpp


De volgende opdrachten bouwen dan het voorbeeld.


qmake<br />make


h2. Gebruik maken van QMainWindow
Veel applicaties zullen profiteren van het gebruik van een "QMainWindow&quot;:http://doc.qt.nokia.com/4.7/qmainwindow.html, welke zijn eigen layout heeft waaraan je bijvoorbeeld een menu balk, dock widgets, tool balken, en een status balk kan toevoegen. "QMainWindow&quot;:http://doc.qt.nokia.com/4.7/qmainwindow.html heeft een centrum gebied dat gebruikt kan worden voor ieder type widget. In ons geval zullen we daar ons text edit plaatsen.
p=. http://doc.qt.nokia.com/4.7/images/gs4.png
Laten we kijken naar de class definitie van Notepad.


#include &lt;QtGui&amp;gt;
<br />class Notepad : public QMainWindow<br />{<br /> Q_OBJECT
<br />public:<br /> Notepad();
<br />private slots:<br /> void open();<br /> void save();<br /> void quit();
<br />private:<br /> QTextEdit *textEdit;
<br /> QAction *openAction;<br /> QAction *saveAction;<br /> QAction *exitAction;
<br /> QMenu '''fileMenu;<br />};


We includen nog 2 slots die documenten kunnen openen en opslaan. Deze zullen in de volgende sectie implementeren.
In een main window moet hetzelfde slot vaak door meerdere widgets worden aangeroepen. Voorbeelden hiervan zijn menu items en knoppen op een tool bar. Om dit makkelijker te maken heeft Qt "QAction&quot;:http://doc.qt.nokia.com/4.7/qaction.html, welke aan meerdere widgets meegegeven kan worden en verbonden kan worden aan een slot. Zowel een "QMenu&quot;:http://doc.qt.nokia.com/4.7/qmenu.html als een "QToolBar&quot;:http://doc.qt.nokia.com/4.7/qtoolbar.html kunnen bijvoorbeeld menu items en tool buttons maken van dezelfde "QActions&quot;:http://doc.qt.nokia.com/4.7/qaction.html. We zullen zo zien hoe dit werkt.
Net als de vorige keer, gebruiken we de constructor van Notepad voor het aanmaken van de GUI.


Notepad::Notepad()<br />{<br /> saveAction = new QAction(tr(&quot;&amp;Open&amp;quot;), this);<br /> saveAction = new QAction(tr(&quot;&amp;Save&amp;quot;), this);<br /> exitAction = new QAction(tr(&quot;E&amp;amp;xit&amp;quot;), this);
<br /> connect(openAction, SIGNAL (triggered()), this, SLOT (open()));<br /> connect(saveAction, SIGNAL (triggered()), this, SLOT (save()));<br /> connect(exitAction, SIGNAL (triggered()), qApp, SLOT (quit()));
<br /> fileMenu = menuBar()<s>&gt;addMenu(tr(&quot;&amp;File&amp;quot;));<br /> fileMenu</s>&gt;addAction(openAction);<br /> fileMenu-&gt;addAction(saveAction);<br /> fileMenu-&gt;addSeparator();<br /> fileMenu-&gt;addAction(exitAction);
<br /> textEdit = new QTextEdit;<br /> setCentralWidget(textEdit);
<br /> setWindowTitle(tr(&quot;Notepad&amp;quot;));<br />}


"QActions&quot;:http://doc.qt.nokia.com/4.7/qaction.html worden aangemaakt met de text die zichtbaar moet zijn op de widgets waar we ze aan toevoegen (in ons geval, menu items). Als we ze ook aan een tool bar wilden toevoegen, zouden we een "icon&quot;:http://doc.qt.nokia.com/4.7/qicon.html kunnen meegeven aan de actions.
Wanneer er op een menu item word geklikt, zal dit de action triggeren, en het bijbehorende slot zal worden aangeroepen.
h3. Extra informatie
|Onderwerp|Hier|
|Main windows and main window classes|"Application Main Window&quot;:http://doc.qt.nokia.com/4.7/mainwindow.html, "Main Window Examples&quot;:http://doc.qt.nokia.com/4.7/examples-mainwindow.html%7C
|MDI applications|"QMdiArea&quot;:http://doc.qt.nokia.com/4.7/qmdiarea.html, "MDI Example&quot;:http://doc.qt.nokia.com/4.7/mainwindows-mdi.html%7C
h2. Opslaan en laden
In dit voorbeeld zullen we de functionaliteit van de open() en save() slots, die we in het vorige voorbeeld hebben toegevoegd, implementeren.
p=. http://doc.qt.nokia.com/4.7/images/gs5.png
We zullen beginnen met het open() slot:


QString fileName = QFileDialog::getOpenFileName(this, tr(&quot;Open File&amp;quot;), &quot;&quot;,<br /> tr(&quot;Text Files ('''.txt);;C++ Files ('''.cpp'''.h)&quot;));
<br />if (fileName != &quot;&quot;) {<br /> QFile file&amp;amp;#40;fileName&amp;amp;#41;;<br /> if (!file.open(QIODevice::ReadOnly)) {<br /> QMessageBox::critical(this, tr(&quot;Error&amp;quot;),<br /> tr(&quot;Could not open file&amp;quot;));<br /> return;<br /> }<br /> QString contents = file.readAll().constData();<br /> textEdit</s>&gt;setPlainText(contents);<br /> file.close();<br />}


De eerst stap is om aan de gebruiker de naam van het bestand dat geopend moet worden te vragen. Qt heeft een "QFileDialog&quot;:http://doc.qt.nokia.com/4.7/qfiledialog.html, welke een dialog is waarin de gebruiker een bestand kan selecteren. Het plaatje hierboven toont dit dialog in Kubuntu. De static "getOpenFileName()":http://doc.qt.nokia.com/4.7/qfiledialog.html#getOpenFileName functie toont een modal file dialog, en keert niet terug totdat de gebruiker een file heeft geselecteerd. Het geeft de bestands locatie van het bestand dat is geselecteerd terug, of een lege string wanneer de gebruiker op cancel heeft gedrukt.
Als we eenmaal een bestands naam hebben, proberen we dit bestand te openen met "open()":http://doc.qt.nokia.com/4.7/qiodevice.html#open, welke true terug geeft als het bestand geopend kon worden. We zullen niet ingaan op de error afhandeling, maar je kan daarvoor de links in het extra informatie deel volgen. Als het bestand niet kon worden geopend, gebruiken we "QMessageBox&quot;:http://doc.qt.nokia.com/4.7/qmessagebox.html om een dialog te tonen met daarin het error bericht (bekijk de "QMessageBox&quot;:http://doc.qt.nokia.com/4.7/qmessagebox.html class beschrijving voor meer informatie).
Het lezen van data is eigenlijk heel triviaal door middel van de "readAll()":http://doc.qt.nokia.com/4.7/qiodevice.html#readAll functie, welke alle data in het bestand teruggeeft als een "QByteArray&quot;:http://doc.qt.nokia.com/4.7/qbytearray.html. De "constData()":http://doc.qt.nokia.com/4.7/qbytearray.html#constData geeft alle data terug als een array van const char, waar QString een constructor voor heeft. De inhoud kan dan worden getoond in de text edit. We sluiten dan het bestand af met "close()":http://doc.qt.nokia.com/4.7/qiodevice.html#close om de file descriptor terug te geven aan het besturings systeem.

Laten we nu kijken naar de implementatie van het save() slot.

QString fileName = QFileDialog::getSaveFileName(this, tr(&quot;Save File&amp;quot;), &quot;&quot;,<br /> tr(&quot;Text Files ('''.txt);;C++ Files ('''.cpp '''.h)&quot;));
<br />if (fileName != &quot;&quot;) {<br /> QFile file&amp;amp;#40;fileName&amp;amp;#41;;<br /> if (!file.open(QIODevice::WriteOnly)) {<br /> // error message<br /> } else {<br /> QTextStream stream(&amp;file);<br /> stream &lt;&lt; textEdit-&gt;toPlainText();<br /> stream.flush();<br /> file.close();<br /> }<br />}


We schrijven de inhoud van de text edit naar het bestand naar welke word gewezen in het "QFile&quot;:http://doc.qt.nokia.com/4.7/qfile.html object, hiervoor gebruiken we de "QTextStram&quot;:http://doc.qt.nokia.com/4.7/qtextstream.html class. De text stream kan een "QString&quot;:http://doc.qt.nokia.com/4.7/qstring.html direct naar het bestand schrijven; "QFile&quot;:http://doc.qt.nokia.com/4.7/qfile.html accepteert alleen ruwe data (char) met de "write()":http://doc.qt.nokia.com/4.7/qiodevice.html#write functies van het "QIODevice&quot;:http://doc.qt.nokia.com/4.7/qiodevice.html.

Extra informatie
|Onderwerp|Hier|