2016-11-06 1 views
0

Je "joue" avec les signaux et les slots en Qt. I fait 2 classes (mainWindow, DatabaseManager)Qt - signaux et slots dans 2 classes

databasemanager.h

class DatabaseManager : public QObject 
{ 
    Q_OBJECT 
    QSqlDatabase database; 
public: 
    DatabaseManager(); 
signals: 
    void TextSignal(const QString); 
}; 

databasemanager.cpp

DatabaseManager::DatabaseManager() 
{ 
    database = QSqlDatabase::addDatabase("QSQLITE"); 
    database.setDatabaseName("database.sqlite"); 

    if(!database.open()) 
     qDebug() << "Cannot open connection with database"; 
    else 
    { 
     emit TextSignal("Connected"); 
     qDebug() << "Connected"; 
    } 
} 

mainwindow.h

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 

private slots: 
    void WriteText(const QString text); 

private: 
    Ui::MainWindow *ui; 
    DatabaseManager db; 
}; 

mainwindow.cpp

MainWindow::MainWindow(QWidget *parent) : 
QMainWindow(parent), 
ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    QObject::connect(&db,SIGNAL(TextSignal(QString)),this,SLOT(WriteText(QString))); 
} 

void MainWindow::WriteText(const QString text) 
{ 
    ui->textEdit->append(text); 
} 

Et voici ma question - Qu'est-ce que je fais de mal? Pendant le débogage du texte "Connecté" est imprimé dans la fenêtre de débogage mais il n'est pas affiché dans textEdit.

Répondre

1

Constructeur d'objet db appelé avant (même avant le constructeur mainWindow et setupUi).

privé: Ui :: MainWindow * ui; DatabaseManager db;

QObject :: connect (& db, SIGNAL (TextSignal (QString)), ce, SLOT (WriteText (QString))

Le signal a été émis avant la connexion et avant la création de UI-> TextEdit.

0

« Cherkesgiller Tural » est sur place donc, pour remédier à votre problème, changer votre DatabaseManager à un pointeur.

DatabaseManager* db; 

Et instancier après setupUi, mais avant relier.

ui->setupUi(this); 
db = new DatabaseManager(); 
QObject::connect(db,SIGNAL(TextSignal(QString)),this,SLOT(WriteText(QString)));