2016-07-12 14 views
0

ich eine QString auf eine thread.Using this Antwort übergeben wollen, ist Hier mein Code: in mainwindow.cpp:QT: Passing QString zu QThread

mmthread = new mythread; 
     mmthread->start(); 

     connect(this,SIGNAL(sendtothread(QString)),mmthread,SLOT(getfrom_main(QString)),Qt::QueuedConnection); 

     emit sendtothread(mystr); 

in mainwindow.h :

signals: 
    void sendtothread(QString); 

in mythread.cpp:

void mythread::getfrom_main(QString str) 
{ 
    //something 
} 

in mythread.h:

public slots: 
    void getfrom_main(QString); 

Aber es scheint getfrom_main gar nicht aufgerufen wird. Wo ist mein Fehler?

EDIT:

Ich habe 3 ähnliche Fäden wie folgt aus:

in mythread.cpp:

mythread :: mythread() 
{ 
    moveToThread(this); 
} 
void mythread::run(){ 
    //something1 
} 
void mythread::getfrom_main(QString comm) 
{ 
    comment = comm; 
    emit message(comment); 
} 

in mythread.h:

class mythread : public QThread 
{ 
    Q_OBJECT 
public: 
    explicit mythread(); 
    void run(); 
signals: 
    void message (QString); 
private: 
     QString comment; 
public slots: 
    void getfrom_main(QString); 
}; 

something1 wird immer in allen meinen Threads ausgeführt. but not about getfrom_main. Danke.

+0

Haben Sie in beiden Klassen das Q_OBJECT-Makro? Ohne dieses Makro funktionieren Signale und Steckplätze nicht. – mtb

+0

@ mtb Ja. beide Klassen! Ich habe ein Signal/Slot, um die Qstrings-Kommentare eines Threads durch eine QMessagebox im Hauptfenster anzuzeigen, und es funktioniert perfekt! –

+1

Bitte zeigen Sie eine SSCCE: http://sscce.org/ –

Antwort

1

Falsch:

mythread :: mythread() 
{ 
    moveToThread(this); // you don't need to do it 
} 

Wrong (Sie wirklich brauchen nicht QThread in Ihrem Code zu erben):

void mythread::run() 
{ 
    //something1 
    // after "something" you need to run an event loop: 
    exec(); 
} 

exec() wird eine Ereignisschleife laufen, die alle Ihre Signale und Slots verarbeiten .

+0

Vielen Dank:) ... Ich bin wirklich Anfänger in Qt-Programmierung und auch C++. Mein Expertenwissen ist nicht Programmieren und ich musste jetzt eine GUI für meinen Zweck erstellen. Du hast also Recht mit mir. Aber sieh dich an, mein Freund, entschuldige mich, aber ich hoffe, dass andere Jungs in 'stackoverflow.com' nicht so sind wie du! Sie könnten einfach sagen, dass 'exec() eine Ereignisschleife ausführt. Probieren Sie es einfach aus! ':) ... und es funktionierte für mich, ohne etwas anderes zu ändern !! Ich habe 'moveToThread (this);' nach einigen Problemen und ich brauche es :) .. also ändere bitte deine Antwort, dann kann ich das akzeptieren. –

+0

Ich bin kein Gedankenleser. Ich weiß, dass meine Antwort vollständig und gut genug ist (weil es dein Problem gelöst hat). Es wird falsch sein, es zu ändern, weil jemand anderes ähnliche Probleme haben könnte. Fühlen Sie sich frei, es inakzeptabel zu lassen. Ich interessiere mich nicht für die Bewertung/Reputation;) –

+1

wow! Du bist großartig! Ein wütender Super! :) –