2016-05-14 16 views
0

Ich habe die folgenden Klassen:QTimer von einer anderen Klasse starten

class MainWindow : public QMainWindow 
{ 

public: 
void StartTimer() 
{ 
    timer = new QTimer(this); 
    timer.start(100); 

} 

private: 
QTimer *timer; 

}; 


class AnotherClass 
{ 

public: 
MainWindow *window; 
void runTimer() 
{ 
    window->StartTimer(); 
} 


}; 

der Fensterzeiger Unter der Annahme, richtig auf die Hauptfenster zeigt ist, wenn ich versuche, runTimer() zu nennen, erhalte ich diesen Fehler:

QObject: Cannot create children for a parent that is in a different thread. 
(Parent is MainWindow(0x7fff51ffe9f0), parent's thread is QThread(0x7fd1c8d001d0), current thread is QThread(0x7fd1c8f870c0) 
QObject::startTimer: Timers can only be used with threads started with QThread 

Meine Vermutung für diesen Fehler war, dass, da runTimer von einem anderen Thread aufgerufen wurde, es auch versuchte, in demselben Thread zu initialisieren? anstelle des Hauptfensters?

Wenn ich den Timer in der Standard-Konstruktor des Hauptfensters initialisieren erhalte ich

QObject::startTimer: Timers cannot be started from another thread 

Wie kann ich eine QTimer erzählen von einer anderen Klasse zu beginnen?

Antwort

1

Sie können Signale und Steckplätze verwenden.

class AnotherClass : public QObject 
{ 

    Q_OBJECT 

public: 

    MainWindow * window; 

    AnotherClass() : window(new MainWindow) 
    { 
     // Connect signal to slot (or just normal function, in this case) 
     connect(this, &AnotherClass::signalStartTimer, 
       window, &MainWindow::StartTimer, 
       // This ensures thread safety, usually the default behavior, but it doesn't hurt to be explicit 
       Qt::QueuedConnection); 

     runTimer(); 
    } 

    void runTimer() 
    { 
     emit signalStartTimer(); 
    } 

signals: 

    void signalStartTimer(); 

}; 
+1

hatte es zu ändern zu verbinden (diese, SIGNAL (signalStartTimer), Fenster, SCHLITZ (Starttimer), Qt :: QueuedConnection); aber ansonsten hat es geklappt – Alex