Nokia veröffentlicht Qt 4.5 und Qt Creator 1.0 - Qt Extended werden pro Sack

6. März 2009 · Posted in Qt · View Comments

Die Nachricht ist alt, aber noch warm ist. Am letzten Tag Dienstag 3. März, Nokia den Start des mit Spannung erwarteten Version 4.5 von Qt angekündigt, hat Qt einen Zweck in der erweiterten und noch veröffentlicht die erste Version von Qt Creator.

Lesen Sie mehr

Installation und Integration von Eclipse, CDT, Qt, Subversion, Perl, Web Tools Vim und nur mit der Maus

21. Februar 2009 · Posted in C / C + + , Tipps , Eee , Perl , Qt , Subversion , VIM , Web · Kommentare anzeigen

Vor langer Zeit in einem Beitrag nicht zu weit von hier, wir zeigen, wie man Eclipse mit Plug-ins für Qt-Entwicklung und die Integration mit Subversion zu installieren. Aber die Zeit vergeht, ist die Version zu ändern und alles andere, und dieses Mal werden wir zeigen, wie man dies nur mit Mausklicks und ein Eee Pc zu tun.

Lesen Sie mehr

Eclipse + Qt + svn

9. Mai 2008 · Posted in C / C + + , Qt , Subversion · View Comments

Mehr persönliche als log wie ein Tutorial, fühlte ich das Bedürfnis, ein Ort der einfachen Zugriff, die Konfiguration Schritte der Finsternis für meinen eigenen Gebrauch, oder die Installation von Eclipse und Plugins, die ich normalerweise benutze (svn und qt) verlassen .

Die Befehle, die Verzeichnisse außerhalb Ihres Hauses betreffen, müssen Superuser-Berechtigung.

Wenn Sie die Sonnenfinsternis beginnt Pakete in Ihrer Distribution installieren möchten, können Sie direkt springen zum # 2 fort.

# Schritt 0: Install Java

Für die Sonnenfinsternis zu arbeiten, müssen Sie die Java Runtime Environment (JRE) installiert * und * konfiguriert.

Die JRE kann direkt von der Sun-Website heruntergeladen werden http://java.sun.com/javase/downloads/index.jsp . Eine vollständige Anleitung zur Installation und Konfiguration finden Sie unter http://java.sun.com/javase/6/webnotes/install/index.html im Falle von Java 6.

Schritt # 1: Donwload und Eclipse

: Die Sonnenfinsternis kann leicht aus der Download-Bereich auf seiner offiziellen Website heruntergeladen werden http://www.eclipse.org/downloads . Nach dem Download einfach entpacken und beenden mit. In meinem Fall habe ich verwendet:

  -xvzf eclipse-cpp-europa-winter-linux-gtk.tar.gz -C / usr / local user @ host $ tar-xvzf eclipse-cpp-europa-winter-linux-gtk.tar.gz-C / usr / local 

Wenn alles geklappt hat aus der Finsternis wird die ausführbare Datei in / usr / local / eclipse / eclipse sein, so erstellen Sie einfach einen Link / Verknüpfung / whatever in Ihrem Lieblings-Grafik-Umgebung.

Schritt # 2: Downloaden und installieren Sie das Plugin-Integration mit QT


Qt Eclipse Integration
Qt Eclipse-Konfiguration

Das Plugin, dass ich zur Zeit benutze ist von Trolltech eigenen zur Verfügung gestellt. Dort können Sie Ihr Projekt Dateien aus einem kleinen Grafik-Editor verwalten und selbst wenn Sie es vorziehen, haben direkten Zugriff auf die Datei. Pro.

Das kann heruntergeladen werden unter http://trolltech.com/developer/downloads/qt/eclipse-integration-download und vollständige Installationsanleitung, die sind zu finden unter http://trolltech.com/developer/downloads/qt / qteclipse-installmanual , ist sehr kompliziert:

  -xvzf qt-eclipse-integration-linux.x86-gcc3.3-1.4.0.tar.gz -C / usr / local user @ host $ tar-xvzf qt-eclipse-integration-linux.x86-gcc3.3-1.4.0.tar.gz-C / usr / local 

Wenn alles gut funktioniert, sind die Plugin-Dateien in das Verzeichnis / usr / local / eclipse / plugins kopiert.

Hinweis: Für diejenigen, die für die Installation der Finsternis durch die Installation der Distribution, die Aufmerksamkeit entschieden! Innerhalb der komprimierten Datei, wird das Verzeichnis eclipse / plugins /, und seine Zähne Plugin-Dateien, die auf dem Plugin-Verzeichnis Ihrer Eclipse-Installation kopiert werden soll, in der Regel / usr / lib / eclipse / plugins.

Nach der Installation starten eclipse mit dem Befehl:

  usr / local / eclipse / eclipse -clean user @ host $ / usr / local / eclipse / eclipse-clean 

Nun, um Fenster> Einstellungen> und setzen Sie die Qt-Version und der "Weg", nach der Installation von Qt

Um bequemer sein, wenn Sie die Sonnenfinsternis berufen direkt von der Kommandozeile aus, fügen Sie in das Verzeichnis des ausführbaren in $ PATH-Umgebungsvariable in eine der Startup-Skripten (. Bash_profile)

  = $PATH : / usr / local / eclipse export PATH = $ PATH: / usr / local / eclipse 

Schritt # 3: Subversion

In Eclipse gehen> Software Updates-Hilfe> Suchen und Installieren. Marke die Option Suche nach neuen Features zu installieren und klicken Sie auf Weiter. Fügen Sie nun die Remote-Standorte:

Buckminster

http://download.eclipse.org/tools/buckminster/updates

Subclipse

http://subclipse.tigris.org/update_1.2.x

Markieren Sie die entsprechende Checkbox, und klicken Sie auf Fertig stellen. Nach einer kurzen Beratung mit dem Internet, so überprüfen Sie die Plugin und Abhängigkeiten und läuft zu umarmen.

Ab QT, Part III - qmake und Pro.

7. Mai 2008 · Posted in C / C + + , Qt · View Comments

In diesem dritten Beitrag werden wir über das Dienstprogramm QT und qmake *. pro Projekt-Dateien zu sprechen. Lassen Sie uns zu verstehen, die qmake und wie die verschiedenen Arten von Projekten zu konfigurieren.

Die qmake

Die qmake ist ein Dienstprogramm, mit dem Qt-Framework kommt. Seine Funktion ist es, eine Projekt-Datei (*. pro) zu analysieren und erzeugen ein Makefile bereits mit den Regeln der moc , uic und QT eingebetteten Optionen. Ohne sie würde zum Beispiel explizit nennen moc, um die Dateien zu erstellen * moc_ und gehen explizit auf die Compiler-und Linker-Optionen, um die korrekte QT unsere Projekte einzubeziehen.

Offizielle Dokumentation zu qmake-Projektdateien und gefunden werden kann hier .

Files *. pro Projekt

So erstellen Sie ein einfaches Projekt-Datei von der Kommandozeile aus, geben Sie das Projekt-Verzeichnis und tippe:

 user @ host $ qmake-project 

Done so haben Sie eine Datei mit dem gleichen Namen wie das aktuelle Verzeichnis, gefolgt von der Erweiterung. Pro. Wenn bereits Dateien in diesem Verzeichnis von qmake erkannt, als Quellcode-Dateien (. H,. Cpp), Formen (. Ui), etc., werden sie automatisch zum Projekt hinzugefügt.

Erstellt die Datei. Pro, um qmake ohne Argumente ausführen, wird versuchen, eine Datei zu analysieren. Pro mit dem gleichen Namen wie das aktuelle Verzeichnis. Sie können sogar angeben, ein alternatives Projekt-Datei als Argument für qmake. Wenn alles gut funktioniert, ist ein Makefile erstellt, und mit einem einfach zu machen, können wir das Projekt erstellen.

Die Projektdateien sind normale Text-Dateien mit Makros und Richtlinien, die von qmake interpretiert werden, um die Makefile erstellen wird. Die vollständige Liste der Optionen finden Sie in der Dokumentation zu entnehmen Online . Die häufigsten sind:

TEMPLATE: Geben Sie die Art des Projekts. Verwenden Sie "App" für Easy-Care-Programm ausführbare Dateien oder "lib", um Bibliotheken zu erstellen.

CONFIG: Fügen Sie mehrere Optionen, um das Projekt. Unter ihnen zu "debuggen" add Debugging-Informationen ", staticlib 'zusammen mit der Vorlage" lib ", dass abiblioteca statische erstellt wird (. In einem linux).

TARGET: Der Name und Speicherort des Ziels, dh die Anwendung oder Bibliothek.

MOC_DIR: Verzeichnis, in dem die Dateien Absolventen werden moc_ *. Nützliche nicht auf den Quellcode-Verzeichnis verschmutzen.

OBJECTS_DIR: Ergänzend zu den vorherigen Option gibt das Verzeichnis wo die Dateien auf Objekt-Code generiert (*. o).

IncludePath: externe Verzeichnisse, in denen Header sind in das Projekt verwendet werden, z. B. Kopf aus externen Bibliotheken.

DEPENDPATH: externe Quellcode-Verzeichnisse, die das Projekt verwendet werden.

Header: Das Projekt Header-Dateien (*. h).

FORMS: Interface-Dateien mit dem QtDesigner (*. ui) generiert.

Quellen: Die Dateien der Quellcode der Durchführung des Projekts (*. cpp).

LIBS: Externe Bibliotheken im Rahmen des Projekts verwendet. -L gibt den Pfad zu der Bibliothek, sagt e-l den Namen der Bibliothek.

QT: QT-Module hinzugefügt / gelöscht werden aus dem Projekt. Wenn Vergangenheit "QT = '(Gleichheitszeichen leer QT), ist QT kein Modul in das Projekt verwendet.

SUBDIRS: in Verbindung mit der Vorlage "Unterverzeichnisse" Gebrauchte gibt die Unterverzeichnisse ons qmake sollten für andere Projekt-Dateien zu suchen.

Mit diesem in der Hand schaffen wir einfache Designs SOME.

Eine einfache Anwendung:

  # Die erste Zeile erzeugt ein Zeichen des Kommentars
 # Der Name dieser Datei ist "app.pro"
 TEMPLATE = app # Unsere Vorlage ist eine Anwendung namens
 TARGET = bin / # myapp.bin myapp.bin innerhalb der Richt. / Bin
 MOC_DIR = tmp / moc # Verzeichnis für MOCs, optional
 OBJECTS_DIR = tmp / obj # für Objekt-Code-Verzeichnis, optional
 HEADERS + = MyClass.h # Header class MyClass
 SOURCES + = main.cpp # verwenden, um Dateien in Ordnern
                 MyClass.cpp # mehrere Zeilen. 

Eine einfache Bibliothek:

  # Der Name dieser Datei ist "lib.pro"
 TEMPLATE = lib # Unser Template-Bibliothek ist ein
 # CONFIG + = dll Dynamik, genannt
 TARGET = lib / mylib # mylib innerhalb der Richt. / Lib
 MOC_DIR = tmp / moc # Verzeichnis für MOCs, optional
 OBJECTS_DIR = tmp / obj # für Objekt-Code-Verzeichnis, optional
 HEADERS + = MyClass.h # Header class MyClass
 SOURCES + = MyClass.cpp # Implementation der Klasse MyClass 

Eine Anwendung, die eine externe Bibliothek verwendet:

 # Der Name dieser Datei ist "mixed.pro 'TEMPLATE = app # Unsere Vorlage ist eine Anwendung namens TARGET = bin / # myapp.lkd myapp.lkd innerhalb der Richt. / Bin MOC_DIR = tmp / moc # Verzeichnis für MOCs, optional OBJECTS_DIR = tmp / obj # Verzeichnis für Objekt-Code, optional IncludePath + =.  # Dir wo sind die Überschriften der externen lib SOURCES + = main.cpp #-Implementierung der Anwendung. 

Verschachtelte Verzeichnisse:

Für die Nutzung von verschachtelten Verzeichnissen, brauchen wir eine Projekt-Datei in das aktuelle Verzeichnis, und ein weiteres in das Unterverzeichnis.

In dem aktuellen Verzeichnis, verwenden Sie die Optionen:

  TEMPLATE = subdirs
 SUBDIRS = [Liste der Unterverzeichnisse in Folge zusammengestellt werden] 

Wenn Sie nur den Namen des Verzeichnisses eingeben, muss es sich um eine Projekt-Datei mit Ihrem Namen enthalten. Es ist jedoch möglich, eine größere berichten direkt an die Liste der Unterverzeichnisse, einem Verzeichnis, das durch eine Projekt-Datei mit Quaker Namen.

Der komplette Quellcode der Beispiele in diesem Lernprogramm behandelten gefunden werden kann hier .

Abschließend

Die qmake ist ein einfaches und sehr leistungsfähiges Werkzeug, das erleichtert das Leben eines Menschen bis hin zu komplexen Projekt-Tree zu verwalten hat, auch wenn das Projekt nicht verwendet QT (nur am Ende der '= QT "hinzufügen). Hinzu kommt die Tatsache, dass die Projekt-Dateien eine Syntax sehr einfach und intuitiv etwas haben. Wenn Sie feinere Anpassungen benötigen, Dokumentation Online gibt Ihnen ein Dutzend Möglichkeiten für Spaß.

Mit oder ohne QT QT qmake ist immer eine gute Option für die Verwaltung der Bau-Baum.

Ab QT, Teil II - Signale, Slots und Timer

1. Februar 2008 · Posted in C / C + + , Qt · View Comments

In diesem Beitrag habe ich folgte mit dem Spiel um kleine Tutorials für Anfänger auf dem QT zu machen. Dieses Mal werde ich zeigen, wie Sie Ihre eigenen Signale und Slots und wie man einen Timer Griff zu schaffen.

Der Quellcode kann auf dieser zu finden Link .

Das Beispiel-Programm ist ein Timer, der die Klasse verwendet wird QTime , einer der wichtigsten Klassen von QT, und zeigen Ihnen Stil LCD-Display mit einem Taschenrechner in die Klasse QLCDNumber .

QT und Timer

Die grundlegende Unterstützung Timer in der QT ist ab QObject Klasse, die Methoden bietet QObject:: startTime () und QObject:: KillTimer () . Die erste Methode gibt eine eindeutige ID und der zweite Timer endet der Timer durch diese ID.

Damit dies funktioniert, muss jedoch der Teil des Codes, dass dieser Mechanismus nutzt in einem "event loop" werden. Sobald der Timer wird gestartet, es von Zeit zu Zeit (Timeout) stellt einen Antrag Dispater QTimerEvent , die den normalen Ablauf des Programms stört, bis das Ereignis verarbeitet wird.

Die maximale Timeout nicht definiert ist, ist es möglich, Timer mit Timeout von Jahren zu schaffen, kann jedoch die minimale Zeit von System zu System variieren. In Windows Vista die Mindest-Timer ist 10 ms, während in Linux 2.6.x dieser ist konfigurierbar (Standard ist 4 ms). Die QT werden versuchen, alle Ereignisse zu liefern, wie gewünscht, aber wenn das System nicht im Stich lässt es fallen die "überschüssige".

Timer kann auch in Threads verwendet werden, aber Sie müssen den Zustand des Seins innerhalb eines Ereignis-Schleife zu respektieren. Themen verdienen einen eigenen Artikel, wie immer ...

Die Klasse QTime implementiert Timer höheren Niveau, so dass einige Funktionen. Eine davon ist die QTime: Singleshot () , die ein Ereignis ausgelöst wird, sobald.

Lesen Sie die ausführliche Dokumentation und repetitive, langweilig, aber glauben Sie mir, Sie werden eine Menge von QDorDeCabeca retten ...

Mehr über Signale und Slots

Signale und Slots sind für die Kommunikation zwischen Objekten, eines der Herzstücke des QT verwendet. In diesem System nicht implementiert Rückrufe zum Behandeln von Ereignissen, verwenden wir das Konzept der Verbindung Signale an Slots, so dass die Programmierung noch intuitiver.

Signale und Slots sind Klassenmethoden, die durch die behandelt werden Meta-Object Compiler (moc) vor dem Quellcode zu kompilieren. Sie haben spezielle Aussagen, die nicht Teil der Standard-C + +, so fazum moc Parsen des Quellcodes und erzeugt übersetzbar.

Durch das Ausführen der moc-Befehl auf jede Klasse, die Signale und Slots implementiert, eine bestimmte Menge an Source-Code generiert wird. Mit der Nutzung des Programms qmake , moc dem Aufruf des Programms ist bis zum Makefile, so dass es für den Programmierer transparent.

Für eine Klasse Signale und Slots umsetzen kann, muss er Zugriff auf die Meta-Object System . So sollte es von der Klasse erben QObject und ihre Unterklassen, und müssen das Makro haben Q_OBJECT in ihrem Bereich Datenschutz. "Slots [| | geschützt private public]" Completed die Vorbereitungen sind Zeichen in einem Abschnitt "Signale" in den Abschnitten und Slots deklariert.

Ein Slot nach deklariert, dann wird wie jeder andere gängige Methode definiert ist, kann explizit wie jede andere genannt werden. Bereits die Zeichen sind ein wenig zarter und sind immer nur deklariert und definiert durch den Programmierer. Der Grund? Die Botschaft am Ende des Versuchs zu bauen:

 tmp / moc_mydisplay.o: In function `MyDisplay: signalPlay () ':
 ~ / Stoppuhr / tmp / moc_mydisplay.cpp: 89: multiple Definition von `MyDisplay: signalPlay () '
 tmp / mydisplay.o: ~ / Stoppuhr / mydisplay.cpp: 169: zuerst hier definiert
 collect2: ld returned 1 exit status
 machen: ** [Stoppuhr] Error 1

Innerhalb der Datei generiert moc_mydisplay.cpp den folgenden Code:

  / / Signal 0
 signalPlay ( ) void MyDisplay: signalPlay ()
 {
     activate ( this , & staticMetaObject , 0 , 0 ) ; QMetaObject: aktivieren (this, & staticMetaObject, 0, 0);
 } 

Ja, erzeugt moc-Signale mit der Definition der sogenannten Meta-Methoden der QT. Daher definieren den Körper eines Signals in QT ist illegal und wird einen Compiler-Fehler durch einen Reset-Methode zu generieren. Lassen Sie moc kümmert Umsetzung des Signals für Sie.

Verbinden

Es ist nicht gut gerade eingerichtet Signale und Slots. Sie müssen festlegen, wie sie interagieren. Die Art und Weise, dies zu tun ist, indem Sie sie durch die connect ()-Methode in jedem Erben QObject . Diese moc umsetzen wird das Signal so, dass ein Anruf, es führt zu einem Aufruf (e)-Slot (s) angeschlossen (s) mit den gleichen Parametern.

Je nach Verbindung kann ein Signal auch wieder den gleichen Wert wie der letzte Slot rief sie zurück. Beachten Sie, dass dies nicht sehr sicher für Signale an mehrere Slots, also garantiert nichts die Reihenfolge benannt.

Ein gegebenes Signal kann auf ein zweites Signal direkt angeschlossen werden. A emittieren () auf das erste Signal wird dann gleichbedeutend mit einem emittieren () in das zweite Signal, da nach dem Schritt der Erstellung Moksha, der Anruf Ergebnisse in den ersten Aufruf zur zweiten, Ergebnisse, die in dem Aufruf angeschlossen an eine andere Methode und so weiter .

Möglichkeiten, in Verbindung

Es gibt grundsätzlich drei Möglichkeiten, Signale und Slots verbinden und wenn nicht ordnungsgemäß verwendet kann eine Quelle von Fehlern furchtbar schwer zu entdecken. Diese Formen der Verbindung sind zusätzliche Parameter an die connect ()-Methode übergeben. Es sind dies:

Direct Connect : Der Steckplatz wird sofort aufgerufen, das Signal in den Thread, wo das Signal ausgegeben wurde erteilt. Dies wirkt wie eine direkte Aufruf der Steckplatz.

Queued Anschluss : Das Signal wird gesendet, und der Anruf an den Schlitz geht auf eine interne Liste der QT, und das Signal wird sofort beendet, unabhängig von den Schlitz genannt worden ist oder nicht. Die Ereignis-Schleife wird dann die Verarbeitung dieser Liste und erst später den Schlitz auf der Thread, wo sich das Objekt befindet Slot aufgerufen.

Auto-Connect : Dies ist der standardmäßig verwendet, wenn Sie nicht angeben, die Art der Verbindung. Es ist einer der "Seeds of Evil" , stellt sie zwei unterschiedliche Verhaltensweisen: Wenn das Signal-und Slot befindet sich auf dem selben Thread, arbeitet als eine direkte Verbindung, aber ansonsten funktioniert wie in der Warteschlange Verbindung.

Blocking Verbindungen in Warteschlange : Huh? wurden nicht nur drei? Nun, dies ist einer der Vorteile dieser Artikel zu lesen: spart Dokumentation inkonsistent! Diese Verbindung ist ähnlich wie in der Warteschlange Verbindung, außer dass das Signal, dass der Thread blockiert ist, bis das Signal ordnungsgemäß ausgeführt werden. Beachten Sie, dass sollte nur sehr vorsichtig verwendet werden, und die Signale und Slots in verschiedenen Threads. Missbrauch kann auch dazu führen, Deadlocks. Sie werden wissen, wenn Sie so etwas sehen:

 user @ host:. ~ / Stoppuhr $ / Stoppuhr
 Qt: Dead Lock erkannt, während die Aktivierung des BlockingQueuedConnection: Sender ist
 QPushButton (0x807e2d8) Empfänger ist MyDisplay (0x8076ac0)

Um Fragen über das, was ist gemeint mit "thread, wo ein Objekt liegt" beziehen sich auf die QT arespeito Threads.

Immer mit großer Sorgfalt mit den Signalen, Slots, Threads und Timer. Diese sind die Hauptmerkmale des QT, aber der Missbrauch kann zu Fehlern extrem schwer zu orten führen. Alle die Dokumentation darüber.

Down to the source

Unser Beispiel ist der zwei Klassen und MyDisplay Stoppuhr und eine gemeinsame Datei Haupt zusammen. Die Haupt-und erstellt nur eine QApplication Objekt Stoppuhr. Die Klasse kümmert sich MyDisplay visuellen Teil des Programms, bestehend aus einem Dialog mit den Tasten und ein LCD-Display-Stil. Die Stoppuhr-Klasse wird ein Widget zur Anzeige und implementieren Sie den Timer. Beachten Sie, dass diese Architektur nicht die elegent, interessanter, aus der Klasse StopWatch MyDisplay erben. Aber das würde den Spaß verderben praktisch eliminiert die Notwendigkeit, Signale und Slots verwenden.

Die Verwendung von Signalen und Slots wird deutlicher, wenn wir Objekte mit der Außenwelt kommunizieren wollen. Im Allgemeinen haben die Klassen nicht wissen, was draußen. Passing Zeiger auf externe Objekte in ihnen, es tut weh die Verkapselung und macht den Code weniger generisch. In unserem Beispiel ist umso interessanter, Signale und Slots verwenden myDisplay, um das Objekt (die interne Stoppuhr) Bericht Ereignisse vom / zum Objekt Stoppuhr (externe MyDisplay), für die es, ohne sich in der Allgemeinheit oder Verkapselung verloren.

Mit Hilfe der Qt-Designer (in einem anderen Artikel werde ich davon sprechen), habe ich die Dialoge, Schaltflächen und LCD. Nach vereinfacht den Code für unsere Zwecke anpassen. Wie myDisplay erbt von QDialog, und dies indirekt erbt von QObject, um Signale und Slots fügen Sie einfach die Q_OBJECT Makro in den privaten Bereich der Klassendeklaration verwenden. Danach fügte ich unter anderem Hilfs-Methoden:

  öffentlichen Steckplätze:
     long ) ; slotDisplayValue void (lang);

 private Slots:
     slotPlay void ();
     slotStop void ();

 Signale:
     signalPlay void ();
     signalPause void ();
     signalStop void ();
     signalReset void (); 

Die Zeichen nach außen Ereignisse im Zusammenhang mit Mausklicks zu kommunizieren. Schon die private Slots wird einen Pre-Processing-Verfahren, während das Publikum auch von der externen Zeitgeberticks berechtigt. So ist die Klasse sendet Informationen nach außen und empfängt Informationen von außen, ohne zu wissen, was auf der anderen Seite. Good old Schnittstelle Vertrag.

  öffentlichen Steckplätze:
     slotPlay void ();
     slotPause void ();
     slotStop void ();
     slotReset void ();

 private Slots:
     slotTick void ();

 Signale:
     long ) ; signalTicks void (lang); 

Analog und umgekehrt der Stoppuhr-Klasse implementiert die Slots, die die Signale MyDisplay Klasse zu erhalten, und erklärt, das Signal, das Informationen sendet der Öffentlichkeit dem Steckplatz heraus.

Es implementiert auch eine QTime, dass alle 10 Millisekunden Feuer wird (so, dass unsere Freunde können lerdinhos Vista folgen!), Inkrementieren eines Zählers. Dieser Zähler wird zurück auf die Display-Formate und zeigt gesendet.

Der Timer gestoppt werden kann, angehalten und neu gestartet jederzeit durch Anklicken des entsprechenden Buttons.

Die Finalmentes

Das Beispiel selbst ist nicht viel Code, aber es illustriert die grundlegende Verwendung von Timern und den Bau von benutzerdefinierten Signale und Slots. Ein ganz besonderes Augenmerk sollte jedoch auf Details, die die Nutzung dieser Ressourcen beinhalten gegeben werden, können sie tödliche Fallen werden.

Wichtige Links

Signale und Slots
QTime
Themen im QT
Online-Dokumentation der QT

Ab QT, Teil I

26. Januar 2008 · Posted in C / C + + , Qt · View Comments

Auf Anfrage habe ich mich entschlossen zu machen, welche kurzen Artikel zu bekommen, um auf die QT-Venture.

In apana 20 Zeilen, mit dem Raum (ja, es ist Platz für Ihre Freundin, nie verlassen) und die zusätzlichen Header, können wir einen "Hallo Welt"-Diagramm, das bereits verwendet die wesentlichen Merkmale des Rahmens.

Da ich keine Möglichkeit, auf anderen Plattformen testen haben, gehe ich davon aus, dass die Plattform alle * nix verwendet wird, und dass die QT-Entwickler-Bibliotheken sind bereits installiert, ebenso wie die Standard-Build-Tools. Wenn QT nicht installiert ist, ist es Zeit, einen Blick auf diese zu nehmen verlinken .

Der vollständige Quellcode Beispiel heruntergeladen werden kann hier , aber wenn man das von Hand machen möchten, erstellen Sie ein Verzeichnis irgendwo in qthello und innerhalb einer Datei namens main.cpp mit folgendem Inhalt:

  01 # gehören <qapplication>
 02 # gehören <qwidget>
 03 # gehören <qpushButton>
 04
 main ( int argc , char ** argv ) 05 int main (int argc, char ** argv)
 {06
 app ( argc , argv ) ; 07 QApplication app (argc, argv);
 window ; 08 QWidget-Fenster;
 button ( "Hello World!" , & window ) ; 09 Taste QPushButton ("Hallo Welt!", & Window);
 10
 ( 300 , 200 ) ; 11-Fenster Resize (300, 200).;
 ( 100 , 85 , 100 , 30 ) ; . 12 Taste setGeometry (100, 85, 100, 30);
 13
 :: connect ( & button , SIGNAL ( clicked ( ) ) , 14 QObject:: connect (& button, SIGNAL (clicked ()),
                          SLOT ( quit ( ) ) ) ; & App, SLOT (quit ()));
 15
 ( ) ; 16 Fenster Show ().;
 app. exec ( ) ; . 17 Rückkehr ca. Exec ();
 19}
 20 

Nun durch ein Terminal, das Verzeichnis und geben qmake-project.

Wenn alles richtig installiert ist, wird eine Datei namens qthello.pro gewesen sein muss erstellt haben. Wenn es keine qthello.pro in das Verzeichnis, dann überprüfen Sie den vorherigen Schritt.

Bei allen in einem Terminal-Typ qmake besiedelt & & make. Dies wird am Beispiel kompilieren und es hat geklappt, war eine ausführbare Datei namens qthello erstellt.

Starten Sie es mit. / Qthello und ein Fenster mit einem Button erscheinen soll.

Ok, lass uns jetzt der lustige Teil: den Quellcode.

Die ersten drei Zeilen enthalten nur Kopfzeilen in Bezug auf die Klassen, die wir QT verwenden.

Zeile 7 deklariert einen QT-Anwendung und leitet es an den Parametern von der Shell-Programm erhalten. Die QApplication Klasse verwaltet die Hauptströmung des Programms und seine Einstellungen. Es enthält die wichtigsten Ereignis-Schleife, in dem alle Ereignisse sowohl aus der Schnittstelle und anderen Quellen verarbeitet und versandt werden. Es verwaltet auch die Startup-und Shutdown des Programms unter anderem.

Zeile 8 deklariert ein Widget, das unsere Grafik-Element sein wird.

Zeile 9 deklariert eine Schaltfläche mit dem Text "Hallo Welt!" Und macht es zu einem "Sohn" unsere Widget. Damit wird die Taste erscheint in der Haupt-Widget.

Linien 11.12 konfigurieren Sie die Komponenten von Form und Positionierung.

Zeile 14 zeigt eines der wichtigsten Merkmale des Rahmens, der Signal-Slot-System.

Signale und Slots verwendet werden, um die Kommunikation zwischen Objekten durchzuführen. Durch dieses System kann ein Objekt Feuer (Senden) ein Ereignis (Signal), die eingefangen und kann durch eine (oder mehrere) Objekt (e) verarbeitet werden. Signale und Slots sind spezielle Methoden der Klasse. Grundsätzlich ist die Emission eines Signals in einem Aufruf der Schlitz, durch den übersetzten moc (Meta-Object-Compiler) , der die Vorverarbeitung der Source-Code vor der Kompilierung. Für jede Klasse, die Signale und Slots implementiert, erzeugt es eine Datei namens moc_nomedaclasse.cpp, die dann zusammen mit dem Rest der Code kompiliert wird. Das ist alles transparent gemacht und die Programmierer in der Regel nicht über diese Details kümmern. In der Praxis bedeutet, senden signigica ein Signal, dass der Schlitz mit ihm über einen Anruf verbunden wird irgendwie verbinden mit dem gleichen Parameter übergeben, um das Signal. Weitere Informationen finden Sie in Online-Dokumentation überprüft werden.

In unserem Beispiel, verbinden Sie die Links das Signal clicked ()-Objekt-Taste, mit der Slot quit () des Application-Objekts. Dies bedeutet, dass Sie auf die Schaltfläche, wird ein Signal ausgelöst wird und anschließend durch das Application-Objekt erfasst und dann der Prozess endet.

In Zeile 16 rufen die Show ()-Methode des Widgets, so dass es sichtbar wird.

In Zeile 17 haben wir endlich Steuerprogramm für die QT. Die exec ()-Methode wird die Hauptschleife und all ihre Mechanismen zu starten, und nur zurückkehren, wenn die Anwendung fertig ist, in unserem Fall, wenn app.quit () durch das System Signal-Slot genannt wird.

Dieses einfache "Hallo Welt" klingt vielleicht albern, aber es ist genug, um einige der wichtigsten Features von QT zu demonstrieren, wie die Hauptschleife, die Erstellung von graphischen Objekten und die Verwendung von Signalen und Slots.

In der nächsten Post werde ich Ihnen zeigen, unsere eigenen Signale und Slots und die Verwendung von Timern zu schaffen.

Referenzen:
QApplication
QWidget
QPushButton
Signale und Slots

Bau eines einfachen Interface Manager für Multi-Fenster mit QT

24. Januar 2008 · Posted in C / C + + , Qt · View Comments

Bei mehreren Gelegenheiten landete ich mit zur Wartung Systemschnittstellen mit vielen Bildschirmen zu geben, ob Grafik oder Text-Modus. Oft hat sich die Anzahl der Bildschirme mit dem System ohne vorherige Planung, die immer auf ein Gewirr von obskuren Anrufen # ifndefs, Switches und andere Monster führte gewachsen.

Das erste Mal, dass ich über ein Problem kam wie das war, als ich damit beschäftigt war die erste Version eines Spiels wie der verstorbene Elifoot auf einer Messe in CEFETES. Zu der Zeit stieß ich auf eine Reihe von Funktionen, wo sie nannten einander und nur zurückgegeben, wenn es das Ziel war. Ergebnis: Es gibt den Stapel! (Keine Sorge, in dieser neuen Version wurde korrigiert!)

Im Fall der Schnittstelle mit mehreren Fenstern, und in Systemen, in denen Planung erfolgt on-the-fly, ist üblich, Fenster, andere Fenster aufrufen vor dem Schließen der Fenster und so weiter und hinterließ eine Spur der Verwüstung und des Terrors haben. Glauben Sie mir, Sie nicht wollen, jemals über die Aufrechterhaltung einer ausgeflippt.

Staub zu Staub ...

In meinem Fall, löst das Problem durch die Schaffung einer Schnittstelle Manager. Ein Objekt, das die zentrale Erstellung und Zerstörung von Interface-Objekte steuert. Jedes Objekt, um ihre Aufgaben, Signale an den Manager zu beenden und er kümmert sich mit dem Saubermachen. So, wenn ein Objekt geboren wird, stirbt und nimmt seine Aufgaben, ohne dabei die Kontrolle über das Programm freuen, er kommt immer wieder an den Manager.

Beachten Sie, dass ich nicht sagen, dass der Manager das Objekt zu zerstören, aber es wird die Reinigung zu tun. Jedes Objekt hat zu bauen, um zu sagen, der Manager jedes Mal, wenn er fertig war, entweder mit Erfolg oder Misserfolg werden. Oft ist der Gegenstand selbst ist in der Lage zu "töten" und das allein ist sehr nützlich, wobei ein Teil der Arbeit-Manager, aber nicht kontrollieren.

Vor dem Start

Ich behaupte nicht, dass diese einfache post alle Funktionen von Qt oder alle Aspekte des Management-Schnittstellen umfasst. Ich werde nur darüber, wie ich ein Problem gelöst, das habe ich zu sprechen. Dieser Beitrag ist auch eine Hommage an einen Freund Paulo-Rio de Janeiro, die zu schälen einer Ananas so hatte!

Hands-on

Ich bin zum größten Teil, ein Bottom-up-Entwickler, aber ein Top-down-Analyst. Dies mag verwirrend erscheinen, aber es gibt keinen Grund zur Panik, oder fast ...

Objekte müssen, um Nachrichten auszutauschen. Dazu wird das System Signal-Slot-QT eine große Hilfe sein. Die Objekte werden Signale aussenden (emittieren (Signal)) und der Manager wird auf sie hören (Slots ()).

Erstaunlicherweise hat der Erbauer der Manager von nun an als die UIM nicht eine einzige Zeile Code. Es ist einfach initialisiert den Zeiger auf 0, nur für Paranoia (oder nicht) ...

Die UIM implementiert Slots für die Erstellung von Objekten und die Reinigung des Chaos. Beim Anlegen eines Objektes, verbindet die UIM dieses Objekt, um dessen Schlitz Reinigung. Wenn das Objekt stirbt, aktiviert er die Reinigung UIM-Slot. Die Schlitze werden zur Schaffung der Objektdiagramm Hauptmenüs in diesem Beispiel ein Fenster verbunden werden.

Os outros objetos são janelas menores, dialogs, sendo um para configuração do aplicativo, e dois pra falar de si mesmo (about), afinal, marketing é importante…

Todos os objetos gráficos eu cliquei e arrastei no Qt Designer e depois ajustei pra ficar do meu jeito. Nada de ficar alinhando pixel na mão, afinal não é uma obra de arte, é só uma prova de conceito.

Os Objetos Gráficos

A tela de configuração é um diálogo comum com um combo-box onde está uma lista de parâmetros a serem passados para o widget principal. Os detalhes que eu acrescentei ao código gerado pelo Qt Designer foram um destrutor, e um par sinal-slot para enviar os dados selecionados de volta para o gerenciador. Eu não me preocupei em guardar o estado da configuração atual. Isso é papo pra outro post.

Die abouts waren im Grunde den gleichen Code, plus Destruktoren.

Das Hauptfenster enthält ein Menü, die anderen Fenster und ein Widget voller verrückter Quadrate, die blinken Anrufe. Der Platz ist die Menge der Informationen, die das Fenster Konfiguration ändern wird.

The Magic QT

Alle grafischen Objekte sind auch QWidgets, weil ihre Klassen aus QWidget-Klasse erben, und ich verwende in jedem Konstruktor-Methode aus der folgenden vererbt:

  this-> setAttribute (Qt:: WA_DeleteOnClose, true); 

Laut der Online-Dokumentation , erzählt diese Qt, dass es die eigene WebSite zu löschen, wenn er geschlossen ist. Ansonsten ist es nur versteckt.

"... Wenn Sie ein Widget das Ereignis close akzeptiert, ist es versteckt ..."

"... Wenn Sie das Widget gelöscht, wenn sie geschlossen ist sein wollen, erstellen Sie es mit dem Qt:: WA_DeleteOnClose Flagge. Dies ist sehr nützlich für unabhängige Fenster der obersten Ebene in einer Multi-Fenster-Anwendung ... "

Die Routinen, die Objekte Ende zu machen, Versagen, wie Sie auf Abbrechen klicken oder zu schließen, werden direkt an ihre eigenen Slots close () verbunden. Dies löst eine Reihe von Veranstaltungen, gipfelnd in der Zerstörung des Objekts.

Die Routinen, die das Objekt sind erfolgreich war, und klicken Sie auf OK und die Daten, wurden angewiesen, die UIM zurück, so kann es ihnen Route. Nach Erhalt der Daten, die UIM-Slot ruft direkt das Objekt close ().

Wenn ein Objekt zerstört wird, schickt er seinen letzten Atemzug, sagen wir, ein Zeichen, dass zerstört wird (ist). Wörtlich sagt er: "ICH WAR !!!".

Von "außen" das Objekt, wird die UIM hören, verbinden dieses Signal an die routinemäßige Reinigung und Tadami! bereit.

Im Beispiel habe ich, kommt die Menge der Quadrate auf dem Bildschirm MyConf eines Objekts, durch die UIM und ist mit dem MyApplication weitergeleitet. Dies wiederum leitet sie an den internen Widget verrückt.

Um noch mehr interessante, während ein kleineres Fenster geöffnet wird, stoppt das Widget zu blinken und gibt, wenn die Luke geschlossen ist. Es klingt dumm, aber das war nur um zu zeigen, dass die UIM volle Kontrolle über das Geschehen in jedes Fenster haben, während sie im Fokus war oder nicht.

Abschluss

Das Qt-Framework ist riesig und bietet eine große Auswahl bietet. Eines ist in der Lage zu steuern, wie Objekte zerstört werden. Mit dieser zusammen mit ein wenig Planung und kombiniert mit dem Signal-Slot-System bauen kann eine sehr komplexe Oberfläche, ohne ihn in eine Tarrasque Zeit zu warten.

Quelle:

http://doc.trolltech.com

PS: Der komplette Quelltext Beispiel ist unter der GPL und kann durch diese heruntergeladen werden Link . Eines Tages legte ich Kommentare dazu ...

BUGFIX

Der unglückliche Insekt versteckt sich in der Abwesenheit von Initialisierungseigenschaften im Konstruktor der Klasse MySquares. Das Tier, obwohl klein war giftig, da es ein "Segmentation Fault" verursacht. Beim Starten des Programms, wenn ich irgendwo in der Nähe und im Begriff waren, zeigte sie eine Abfolge von Ereignissen, die sich aus der Annahme, dass der Bildschirm richtig konfiguriert wurde, stammten. Der korrigierte Code ist in den obigen Link, und denken Sie daran:

"Immer initialisieren Sie Ihre Variablen"