QCoreApplication und Events

Alles rund um die Programmierung mit Qt
Antworten
petric
Beiträge: 23
Registriert: 2. September 2008 17:42

QCoreApplication und Events

Beitrag von petric »

Hallo,

ich versuche mich gerade an einer Console-Applikation. Erstellt unter QtCreator 1.1.0 mit Qt 4.5.0 unter Linux (ist aber unter Win mit QtCreator 2009.01 dasselbe Verhalten).

mein main sieht so aus (abgestrippt):

Code: Alles auswählen

int main (int argc, char *argv[])
{
  QCoreApplication a (argc, argv);

  Analyzer processor;

  a.exec ();
}
Analyzer.h

Code: Alles auswählen

class Analyzer : public QObject
{
  Q_OBJECT

  public:
    Analyzer (QObject * = 0);

  public slots:
     void start ();
};
Im Konstruktor von Analyzer steht dann

Code: Alles auswählen

Analyzer::Analyzer (QObject *parent)
: QObject (parent)
{
  QTimer::singleShot (100, this SLOT (start ()));
}
Das Ganze kompiliert einwandfrei. Beim Start aber kommt:
Object::connect: No such slot QObject::start () in analyzer.cpp:13
In der Zeile 13 ist dieser singleShot-Aufruf.

Irgendwas feht da noch - nur was ?
Muss ich in <app>.pro noch irgendwas eintragen:

Code: Alles auswählen

QT -= gui
TARGET = TestApp
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += main.cpp \
    analyzer.cpp
HEADERS += analyzer.h
Da das meine erste Consolepplikation mit Qt ist bin ich (noch) etwas am Schwimmen ...
petric
Beiträge: 23
Registriert: 2. September 2008 17:42

Beitrag von petric »

Weitere Tests ergaben, dass QtCreator nicht gemerkt hat, dass er qmake und make aufrufen muss (wegen Q_OBJECT im Headerfile). Daher war auch kein moc_* da.

Also ein QtCreator-Problem ...

Generell - was muss ich in der Klasse Analyzer als Methode definieren, damit es von QCoreApplication::exec () aufgerufen wird ?
Das mit QTimer::singleShot ist nur ein Würgaround.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Generell - was muss ich in der Klasse Analyzer als Methode definieren, damit es von QCoreApplication::exec () aufgerufen wird ?

Code: Alles auswählen

Analyzer processor;
processor.start(); // Waaahnsinn.. start() wird auch ohne Timer aufgerufen
a.exec (); 
War das jetzt zu bissig? :wink:

Im ernst, warum sollte denn die CoreApplication irgendwas aufrufen? Wie das Programm startet, hast ja du in der Hand...
petric
Beiträge: 23
Registriert: 2. September 2008 17:42

Beitrag von petric »

Waer schoen - aber in processor.start brauche ich die Event-Loop schon und die wird erst mit a.exec gestartet, oder ?
Das gibt einen schoenen deadlock, falls ich in processor.start auf einen solchen warten sollte.

Und a.exec wird erst beendet, wenn ich (in processor.*) QCoreApplication::quit aufrufe. Also kann ich a.exec icht vor processor.start aufrufen.

Oder habe ich da etwas uebersehen ?
Zuletzt geändert von petric am 12. Mai 2009 07:54, insgesamt 1-mal geändert.
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

Wofür brauchst du da die E-Loop?
Du kannst Sie doch auch in der .start aufrufen oder?


Um mmal auf die Doku zzu verweisen:
Detailed Description
The QEventLoop class provides a means of entering and leaving an event loop.
At any time, you can create a QEventLoop object and call exec() on it to start a local event loop. From within the event loop, calling exit() will force exec() to return.
See also QAbstractEventDispatcher.
petric
Beiträge: 23
Registriert: 2. September 2008 17:42

Beitrag von petric »

Hast recht. Diese Beschreibung von QCoreApplication::exec hat mich etwas verwirrt:
int QCoreApplication::exec () [static]
Enters the main event loop and waits until exit() is called. Returns the value that was set to exit() (which is 0 if exit() is called via quit()).
It is necessary to call this function to start event handling. The main event loop receives events from the window system and dispatches these to the application widgets.
Ich dachte das Teil wuerde Signal/Slots behandeln. Dem scheint ist aber nicht so zu sein.
Antworten