Beginnend in QT, Teil II - Signale, Slots und Timer

1. Februar 2008 · Geschrieben in C / C + + , Qt

In diesem Beitrag werde ich folgte mit dem Spiel auf kleine Tutorials für Anfänger auf der QT machen. Dieses Mal werde ich Ihnen zeigen, wie unsere eigene Signale und Slots und wie man einen Timer zu manipulieren schaffen.

Der Quellcode kann auf diese festgestellten Link .

Die Probe-Programm ist ein Timer, der die Klasse verwenden QTime , einer der wichtigsten Klassen von QT, und Klasse-Display die Uhrzeit mit Hilfe eines Taschenrechners das LCD-Display mit Stil QLCDNumber .

QT und Timer

Die grundlegende Unterstützung für die QT-Timer ist ab QObject Klasse, die Methoden der QObject:: startTime () und QObject:: KillTimer () . Die erste Methode gibt eine eindeutige ID und das zweite Timer stoppt der Timer durch diese ID.

Damit dies funktioniert, muss allerdings das Code-Snippet, dass dieser Mechanismus verwendet, um innerhalb eines "event loop" werden. Sobald der Timer beginnt es von Zeit zu Zeit (Timeout) stellt einen Antrag Dispater QTimerEvent , welches Programm unterbricht den normalen Ablauf des bis zum Event verarbeitet wird.

Die maximale Timeout nicht eingeschränkt wird, und kann Timer mit einem Timeout von Jahren zu schaffen, jedoch kann die minimale Zeit von System zu System variieren. In Windows Vista ist das Minimum-Timer 10 ms, während die Linux 2.6.x Dies ist konfigurierbar (Standard: 4 ms). Die QT werden versuchen, alle Ereignisse zu liefern, wie verlangt, aber wenn das System es nicht zulässt, wird es die "entledigen".

Zeitgeber kann auch in Threads verwendet werden, aber Sie müssen der Anforderung, der innerhalb eines Ereignis-Schleife zu erfüllen. 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 () , welches Ereignis löst eine einmal.

Lesen Sie die ausführliche Dokumentation und repetitiv ist langweilig, aber vertrauen Sie mir, Sie sparen eine Menge QDorDeCabeca ...

Mehr über Signale und Slots

Signale und Slots sind für die Kommunikation zwischen Objekten verwendet, einer der Grundpfeiler des QT. In dieses System implementieren, anstatt Rückrufe an Ereignisse behandeln, verwendet 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) , bevor der Quellcode kompiliert werden. Sie haben spezielle Aussagen, die nicht Teil der Standard-C + +, so dass die moc Fazuma Parsen und generiert den Quellcode übersetzbar.

Durch Ausführen des Befehls moc auf jede Klasse, die Signals und Slots, eine bestimmte Menge an Quellcode implementiert wird generiert. Mit dem Programm qmake , moc der Aufforderung, das Programm wird getragen von den Makefile, so dass es für den Programmierer transparent.

Für eine Klasse kann Slots Signale und umzusetzen, braucht es Zugriff auf die Meta-Object System . So sollte es erben die Klasse QObject oder ihrer Unterklassen und brauchen das Makro Q_OBJECT in ihrer Erklärung privaten Bereich. Fertige Präparate, signalisiert einen Abschnitt deklariert werden in "Signale" in Abschnitte und Slots "[Öffentlichkeit | geschützt | private] Slots".

Ein Schlitz nach deklariert, wird dann wie jedes andere gängige Methode, die ausdrücklich als jede andere aufgerufen werden kann definiert. Bereits die Zeichen sind ein wenig zarter, und sind immer nur erklärt und definiert durch den Programmierer. Der Grund? Diese Meldung am Ende des Versuchs zu bauen:

 tmp / moc_mydisplay.o: In Funktion »MyDisplay: signalPlay ()":
 ~ / Stoppuhr / tmp / moc_mydisplay.cpp: 89: Definition von "multiple MyDisplay: signalPlay () '
 tmp / mydisplay.o: ~ / Stoppuhr / mydisplay.cpp: 169: erste hier definierten
 collect2: ld returned 1 exit status
 machen: ** [Stoppuhr] Fehler 1

Innerhalb der Datei wird Code generiert moc_mydisplay.cpp die folgenden:

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

Ja, generiert die moc-Signale mit der Definition der Meta-Aufrufe an Methoden der QT. Daher definieren den Körper eines Zeichens ist illegal in QT und es wird ein Kompilierungsfehler für Reset-Methode zu generieren. Lassen Sie den moc kümmert sich um die Umsetzung des Signals für Sie.

Verbinden

Es ist nicht gut einfach zu definieren Signalen und Slots. Wir müssen festlegen, wie sie interagieren. Die Art und Weise dies zu tun ist, indem Sie sie über die connect ()-Methode in jedem Erben QObject . Dadurch wird das Signal moc umzusetzen, so dass ein Aufruf an Sie resultiert in einem Aufruf (e)-Slot (s) angeschlossen (s) mit den gleichen Parametern.

Je nach Zusammenhang kann ein Signal auch wieder den gleichen Wert wie der letzte Slot namens zurück. Beachten Sie, dass dies nicht sehr sicher für Signale gleichzeitig Verbindungen zu mehreren Slots, daher keine Garantie für die Reihenfolge der Anruf.

Ein gegebenes Signal kann auf ein zweites Signal direkt angeschlossen werden. Ein emittieren () auf das erste Signal ist dann äquivalent zu emittieren () in das zweite Signal, da nach dem Schritt der Schaffung MOCs, der Aufruf an die ersten Ergebnisse in der zweiten Aufforderung, die Ergebnisse in der Aufforderung, eine andere Methode verbunden und so .

Möglichkeiten für die Verbindung

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

Direkte Verbindung : Dieser Slot wird unmittelbar das Signal ausgestellt wurde, erteilt worden in dem Thread, wo das Signal. Dies fungiert als eine direkte Aufforderung an die Slot.

Queued Verbindung : Das Signal wird an den Slot und der Aufruf geht an eine interne Liste von QT, und das Signal sofort zurück, unabhängig von den Schlitz genannt worden ist oder nicht. Die Ereignis-Schleife wird dann die Verarbeitung der Liste, und erst später Slot wird für den Thread, wo das Objekt Steckplatz geltend gemacht werden.

Auto Connect : Dies ist die Standard-Typ verwendet werden, wenn Sie nicht angeben, die Art der Verbindung. Es ist eines der "Seeds of Evil" , weil es zwei verschiedene Threads präsentiert Verhalten: Wenn das Signal-und Slot befindet sich auf dem gleichen, arbeitet als direkte Verbindung, aber ansonsten funktioniert wie in der Warteschlange Verbindung.

Queued Sperren des Anschlusses : Hey!? wurden nicht nur drei? Nun, das ist ein Vorteil, um diesen Artikel zu lesen: Sie sparen Dokumentation widerspruchsvoll! Diese Verbindung ist ähnlich wie die Warteschlange Verbindung, außer dass der Signal-Thread, bis das Signal blockiert zu werden ordnungsgemäß ausgeführt. Beachten Sie, dass sollten nur sehr vorsichtig verwendet werden, und die Signale und Slots in verschiedenen Threads. Missbrauch kann auch zu Blockaden. Du wirst wissen, wann Sie etwas sehen wie folgt aus:

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

Zur Lösung der Zweifel über das, was der Satz bedeutet "Thread, wo ein Objekt ist" finden Sie in der Dokumentation von QT In Bezug auf die Fäden.

Ist große Vorsicht mit Signalen, Slots, Timer und Threads. Dies sind die wichtigsten Funktionen von Qt, aber seine Missbrauch kann zu Bugs extrem schwer zu orten führen. Alle in der Dokumentation darüber.

Down to the source

Unsere Stichprobe besteht aus den beiden Klassen und MyDisplay StopWatch-Datei und eine der wichtigsten politischen zusammensetzt. Die wichtigste und einzige schafft ein Objekt QApplication Stoppuhr. Die Klasse MyDisplay Griffen den 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 Umsetzung des Timers. Beachten Sie, dass diese Architektur ist nicht die meisten elegent und interessanter zu machen, die Klasse erben von MyDisplay Stoppuhr. Aber das würde verderben das Spiel nahezu eliminiert die Notwendigkeit, die Signale und Slots verwenden.

Die Verwendung von Signalen und Slots wird klarer, wenn wir Objekte mit der Außenwelt kommunizieren wollen. Im allgemeinen Klassen nicht wissen, was aus ihnen heraus. Passing Zeiger auf externe Objekte in ihnen, es tut weh und macht das Paket der Code weniger allgemein. In unserem Beispiel, dem weitere interessante Anwendung Signale und Slots für das Objekt MyDisplay (innerhalb der Stoppuhr) auf Ereignisse in und aus der Stoppuhr-Objekt (externer MyDisplay) kommunizieren, ohne dass in dieser Allgemeinheit oder die Kapselung verloren gehen.

Mit Hilfe der Qt-Designer (in einem anderen Artikel habe ich darüber sprechen will), habe ich den Dialog, Tasten und LCD. Nach dem vereinfachten Code, um unsere Zwecke anzupassen. Wie MyDisplay erbt von QDialog und dies indirekt erbt von QObject, Signale und Slots verwenden, um genug war um das Makro Q_OBJECT im privaten Teil der Klasse Erklärung hinzuzufügen. Danach sagte ich unter anderem ergänzende Methoden:

  public slots:
     long ) ; void slotDisplayValue (lang);

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

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

Die Signale nach außen Ereignisse im Zusammenhang mit Mausklicks zu kommunizieren. Bereits die private Slots wird einen Pre-Processing-Verfahren, während die Öffentlichkeit wird der Wert des Timer-Ticks von außen kommenden empfangen. Somit ist die Klasse sendet Informationen nach außen und empfängt Informationen von außen, ohne zu wissen, was auf der anderen Seite. Gute alte Schnittstelle durch Vertrag.

  public slots:
     slotPlay void ();
     slotPause void ();
     slotStop void ();
     slotReset void ();

 private Slots:
     slotTick void ();

 Signale:
     long ) ; void signalTicks (lang); 

Analog und umgekehrt die Stoppuhr-Klasse implementiert die Slots, die die Signale empfangen MyDisplay Klasse, und erklärt, dass das Signal sendet Informationen an die Öffentlichkeit ihrem Steckplatz.

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

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

Die Finalmentes

Der Fall hat sich eine Menge Code, aber es zeigt die grundlegende Verwendung von Timern und den Bau von benutzerdefinierten Signale und Slots. Ein besonderes Augenmerk sollte jedoch auf Details, die die Verwendung dieser Mittel verabreicht werden, da sie tödlichen Fallen werden kann.

Wichtige Links

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

Kommentare

  • Lucas
    Ja, ich bin für Grafik-Lösungen im Zusammenhang mit mathematischen Funktionen suchen, wie Sinus und Cosinus zum Beispiel.

    Ich habe Probleme mit QWT denke, das Problem ist aber nicht sicher, Setup, wollte wissen, welche Version Sie der QT-und QWT verwenden?

    Wenn Sie bereits etwas getan werden mag, dass ich versucht habe zu tun und kann mir die Hand ich dankbar sein wird.

    Vielen Dank für Ihre Aufmerksamkeit

    Gruß
  • Hallo Lukas,

    Ich weiß nicht recht verstehe Ihre Frage.

    Suchen Sie nach Grafik-Lösungen im Zusammenhang mit mathematischen Funktionen? Ist QWT Ihnen helfen?

    Alles, was dazwischen zählte mehr detailliert, was Sie brauchen.

    Hugs
  • Lucas
    Seine sehr guten Erklärungen, die sehr ausführlich auch!
    Haben Sie schon einmal geschehen ist, jede Grafik-Programm, um ein Beispiel für mathematische Funktionen zu teilen?
    Weil ich nicht bekommen!
    Vielen Dank für die Aufmerksamkeit
  • Rodrigo
    Dude, du Biest, ich liebe deine Tutorials, Umarmungen und vielen Dank!
  • Blaber

    Ich danke dem Publikum und hoffen auf weitere Hilfe.

    Mein Dank und eine Umarmung.

  • Walison
    Sehr guter Text, bin ich bereits besucht den Blog regelmäßig nur, um mehr über Qt4 und natürlich bin ich die Erforschung und die Dokumentation lesen, wissen.

    Att
Blog-Kommentare powered by Disqus