Qt - 2类信号和槽

Qt - signals and slots in 2 classes

本文关键字:信号 2类 Qt      更新时间:2023-10-16

我在Qt中"玩"信号和插槽。我创建了2个类(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);
}

这是我的问题-我做错了什么?而调试文本"已连接"是打印在调试窗口,但它不显示在textEdit。

db对象之前调用的构造函数(甚至在mainWindow构造函数和setupUi之前)。

私人:Ui:主窗口*界面;DatabaseManager db;

QObject:连接(和db、信号(TextSignal (QString)),这个槽(WriteText (QString))

在连接之前和ui->textEdit创建之前发出信号。

"Cherkesgiller Tural"很贴切。因此,为了解决这个问题,将您的DatabaseManager更改为指针:

DatabaseManager* db;

并在setupUi之后实例化它,但在连接之前。

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