2009-09-07 6 views
0

Je suis nouveau en qt et C++, et j'ai un problème avec les threads. Par exemple, si j'ai un gui avec deux QPushButton et un QTextEdit, est-il possible de définir des valeurs à QTextEdit à partir d'un thread (différent du thread principal gui) sans geler le gui?Gui de manipulation avec différents threads

// These are the values that I want to set from the thread 
for(i=0;i<100;i++){ 
    qtextedit.setText(i); 
} 
+0

Quelle est la version qt utilisez-vous? –

Répondre

3

Il est possible: soit d'utiliser un signal/fente avec une connexion en file d'attente, ou des événements de poste pour le fil d'interface utilisateur graphique.

Votre exemple est assez rapide pour ne pas bloquer l'interface graphique.

2

Vous ne devriez pas utiliser votre exemple directement dans un autre thread. Cependant, il n'est pas trop difficile de travailler les choses dans une bonne forme en utilisant des signaux et des slots.

class UpThread : public QThread 
{ 
    Q_OBJECT 
    ... 
public slots: 
    void countUp() 
    { 
     for (int i = 0; i < 100; ++i) 
     { 
      emit (newText(QString::number(i))); 
      sleep(1); 
     } 
    } 

signals: 
    void newText(QString text); 
} 

class DownThread : public QThread 
{ 
    Q_OBJECT 
    ... 
public slots: 
    void countDown() 
    { 
     for (int i = 100; i > 0; --i) 
     { 
      emit (newText(QString::number(i))); 
      sleep(1); 
     } 
    } 

signals: 
    void newText(QString text); 
} 

int main(int argc, char **argv) 
{ 
    QApplication app(argc, argv); 
    MainWindow window; 
    UpThread up; 
    DownThread down; 
    QObject::connect(window.buttonUp, SIGNAL(clicked()), &up, SLOT(countUp())); 
    QObject::connect(&up, SIGNAL(newText(QString)), &window.textEntry, SLOT(setText(QString))); 
    QObject::connect(window.buttonDown, SIGNAL(clicked()), &down, SLOT(countDown())); 
    QObject::connect(&down, SIGNAL(newText(QString)), &window.textEntry, SLOT(setText(QString))); 

    window.show(); 
    up.run(); 
    down.run(); 

    return (app.exec()); 
} 

Note: Je n'ai pas compilé ou testé ce point. Haut et bas ne se soucient pas si l'autre est en cours d'exécution, donc si vous cliquez sur les deux boutons, votre entrée de texte peut sauter partout. J'ai évidemment omis beaucoup de choses. J'ai également ajouté un sleep(1) à chaque boucle pour montrer qu'ils ne devraient pas bloquer l'interface utilisateur principale.

Questions connexes