2016-05-08 5 views
1

Ich versuche, ein Programm in diesem Programm zu machen Ich möchte eine Taste drücken, die Text in einer anderen cpp-Datei verarbeitet und hängt mein QTextEdit an. Ich habe im Grunde genommen als Test nur meine Schaltfläche eingerichtet, um eine Funktion in der anderen Datei auszuführen und auch wenn das Programm startet. Wenn es gestartet wird, druckt es korrekt in den Text Edit sowie in meine Konsole, aber wenn ich meine Taste drücke, wird es nur auf die Konsole und nicht auf meinen TextEdit gedruckt. Für die Funktion, die den Text in meinem TextEdit anfügt und an die Konsole druckt, habe ich es zu einem öffentlichen Slot gemacht, damit ich von meiner anderen Datei darauf zugreifen kann.Zugriff auf die Qt UI von einer externen cpp-Datei

Das ist mein quiz.cpp

#include <iostream> 
#include "quiz.h" 
#include "ui_quiz.h" 
#include "test.h" 

Quiz::Quiz(QWidget *parent) : QMainWindow(parent), ui(new Ui::Quiz) { 
    ui->setupUi(this); 
    setText(); 
} 

Quiz::~Quiz() { 
    delete ui; 
} 

void Quiz::on_actionQuit_triggered() { 
    QCoreApplication::quit(); 
} 

void Quiz::on_pushButton_clicked() { 
    run(); 
} 

void Quiz::setText() { 
    ui->console->append("Hello"); 
    std::cout << "Hello world!" << std::endl; 
} 

Dieser sein Header ist:

#include "quiz.h" 
#include "test.h" 
#include "ui_quiz.h" 

void run() { 
    Quiz* quiz = new Quiz(); 
    quiz->setText(); 
} 

und sein Kopf:

#ifndef QUIZ_H 
#define QUIZ_H 

#include <QMainWindow> 

namespace Ui { 
class Quiz; 
} 

class Quiz : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit Quiz(QWidget *parent = 0); 
    ~Quiz(); 
public slots: 
    void setText(); 
private slots: 
    void on_actionQuit_triggered(); 

    void on_pushButton_clicked(); 
private: 
    Ui::Quiz *ui; 
}; 

#endif // QUIZ_H 

Das ist mein test.cpp ist

#ifndef TEST_H 
#define TEST_H 

#endif // TEST_H 

void run(); 

Was mache ich falsch? Warum kann ich nicht auf das UI zugreifen, aber der Rest der Funktion läuft?

+0

Sie eine neue Instanz von 'Quiz' in der' run' Funktion erstellen. Es ist nicht dieselbe Instanz, die Sie auf dem Bildschirm zeigen. Rufen Sie 'quiz-> show()' in 'run' auf, damit Sie eine Idee bekommen, was gerade passiert. – thuga

Antwort

0

Sie können UI nur vom Hauptthread zugreifen. können Sie Signal-Slot verwenden, um das zu tun. schreiben Sie Ihren Steckplatz in main. und geben Sie Ihr Signal von der zweiten Klasse ab. verbinden Signal-Slot in Konstruktor Haupt.

zweite Klasse H-Datei:

void updateUI(QString str); 

zweite Klasse CPP-Datei:

emit updateUI("some text"); 

Hauptklasse H-Datei:

void updateUI(QString str); 

Hauptklasse CPP-Datei (Implementierung):

void Main::updateUI(QString str) 
{ 
    // change ui here 
} 

Hauptklasse CPP-Datei (im Konstruktor):

connect(secondobj, &secondclass::updateUI, this, &mainclass::updateUI); 
+0

Ich benutze Slots ... muss es in main sein, nicht meine gui? – Hamish

+0

Ja, schreibe deinen Platz in der Hauptklasse. – aghilpro

+0

Wie sollen Sie Signale verwenden? Wo sollen sie verbunden sein? Das Wiki ist schrecklich – Hamish