简体   繁体   中英

Qt - signals and slots in 2 classes

I am "playing" with signals and slots in Qt. I made 2 classes (MainWindow,DatabaseManager)

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);
}

And here is my question - What am I doing wrong? While debugging text "Connected" is printed in Debug Window but it is not showed in textEdit.

db object's constructor called before (even before mainWindow constructor and setupUi).

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

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

Signal was emitted before connect and before creation of ui->textEdit.

"Cherkesgiller Tural" is spot on. So to remedy your problem, change your DatabaseManager to a pointer:

DatabaseManager* db;

And instantiate it after setupUi, but before your connect.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM