Meine Frage ist allgemein und bezieht sich auf die Verwendung der Klasse qeventloop in Qt. Ich habe zwei Hauptfragen dazu. Details. < /p>
Frage 2) < /strong> Hat es ein weiterer Zweck, außer als zu blockieren? Es scheint, dass ich nur auf Beispiele stoßen kann, in denen qeventloop < /em> zum Wartenzweck verwendet wird.
Kann es für andere Zwecke verwendet werden? Könnten wir uns vorstellen, die Verarbeitung spezifischer Ereignisse von der Hauptanwendungsschleife zu einem lokalen QeVentloop zu löschen? (Nicht sicher, ob diese Frage einen Sinn ergibt) < /p>
Entwicklung von Frage 1): < /strong> < /p>
Mein Verständnis, wie die QT -Main -Ereignisschleife im Grunde funktioniert. Die Anwendungs-Hauptereignisschleife ( qcoreApplication :: exec () ) greift aus der Warteschlange einen qevent "e" und sendet sie in die QObject "a". Wenn wir annehmen, dass das Objekt "A" das Ereignis "e" verwendet, wird die Ereignismethode dieses Objekts (es gibt andere Komfortmethoden und Ereignisfilter, aber wir nehmen an, dass die Ereignismethode in unserem Fall mit dem Ereignis befasst ist) genannt - eine Verarbeitung mit dem Objekt "A" passiert hier - und gibt True zurück. Dann beginnt die QT -Hauptereignisschleife, das nächste Ereignis in der Warteschlange zu verarbeiten, und so weiter. Das Ereignis nennt eine Methode des Objekts "a", bei der wir ein lokales qeventloop < /em> erstellen, dass wir nie aufhören. Meine Erwartung wäre, dass die gesamte Anwendung gestoppt und nicht mehr Ereignisse verarbeitet werden, bis der lokale qeventloop < /em> beendet wird, und die Ereignismethode "A" zurückgibt. qeventloop < /em> blockiert die Anwendungs-Hauptereignisschleife nicht ...
Könnte mir jemand mehr Einblicke geben, wie der lokale qeventloop < /em> funktioniert? ---- < /strong> < /p>
Es tut mir leid, wenn ich nicht klar bin, ist dies tatsächlich ziemlich schwer mit Wörtern zu erklären. Unten ist ein kleiner Code-Snippet, um meine Frage 1 < /strong> zu veranschaulichen.#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
< /code>
Mainwindow.cpp
#include "mainwindow.h"
#include
#include
#include
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent)
{
QPushButton* button1 = new QPushButton(this);
button1->setText("button 1");
button1->setCheckable(true);
QPushButton* button2 = new QPushButton(this);
button2->setText("button 2");
button2->move(0,50);
connect(button1,&QPushButton::toggled,button1,[button1](bool toggled){
button1->setText(toggled ? "CHECKED" : "NOT CHECKED");
});
connect(button2,&QPushButton::clicked,button2,[](){
QEventLoop loop;
qInfo()
Mit dem obigen Beispiel habe ich ein einfaches Fenster mit 2 Schaltflächen, "Taste 1" (wodurch der Status angezeigt wird: überprüft oder nicht überprüft) und "Taste 2" (was bei Klicken einen lokalen Qeventloop auslöst).
Wenn ich auf Taste 2 klicke, blockiert es "Loop.exec ()", d. H. Die zweite Debug -Nachricht wird nie ausgegeben. Dann würde ich erwarten, dass die Hauptanwendungsschleife ebenfalls blockiert wird. Ich denke jedoch nicht, dass ich immer noch auf "Taste 1" klicken kann, in der der Status angezeigt wird (überprüft oder nicht überprüft).>
Wie lokal Qeventloop funktioniert ⇐ C++
-
- Similar Topics
- Replies
- Views
- Last post