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 类中的信号和插槽的主要内容,如果未能解决你的问题,请参考以下文章