Qt - 2类信号和插槽

时间:2016-11-06 11:05:44

标签: c++ qt signals-slots

我正在玩#34;在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);
}

这是我的问题 - 我做错了什么? 调试文本&#34;已连接&#34;在调试窗口中打印但它没有在textEdit中显示。

2 个答案:

答案 0 :(得分:1)

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

<强>私人:    Ui :: MainWindow * ui;    DatabaseManager db;

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

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

答案 1 :(得分:0)

&#34; Cherkesgiller Tural&#34;是现货。因此,要解决您的问题,请将DatabaseManager更改为指针:

DatabaseManager* db;

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

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