Qt - 2 类中的信号和插槽

Posted

技术标签:

【中文标题】Qt - 2 类中的信号和插槽【英文标题】:Qt - signals and slots in 2 classes 【发布时间】:2016-11-06 11:05:44 【问题描述】:

我正在“玩”Qt 中的信号和插槽。 我做了2个类(MainWindow,DatabaseManager)

数据库管理器.h

class DatabaseManager : public QObject

    Q_OBJECT
    QSqlDatabase database;
public:
    DatabaseManager();
signals:
    void TextSignal(const QString);
;

数据库管理器.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";
    

主窗口.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;
;

主窗口.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 中显示。

【问题讨论】:

【参考方案1】:

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

私人: ui::主窗口 *ui; 数据库管理器数据库;

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

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

【讨论】:

【参考方案2】:

“Cherkesgiller Tural”恰如其分。因此,要解决您的问题,请将 DatabaseManager 更改为指针:

DatabaseManager* db;

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

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

【讨论】:

以上是关于Qt - 2 类中的信号和插槽的主要内容,如果未能解决你的问题,请参考以下文章

Qt4 插槽和信号:Qt4 无法找到信号

Qt将信号连接到插槽

QT将不同类的信号和插槽连接到主窗口类?

Qt4中的信号和插槽 - 不工作

如何将信号和插槽与 qt 中的另一个对象连接 - 已解决

使用带有新信号槽语法的 Qt 插件系统在接口类中声明信号