场景:点击父窗口按钮1,弹出子窗口。点击子窗口查询按钮,隐藏子窗口并把查询结果显示在父窗口上。
参考文献Qt实例–主窗口和子窗口互发信号
简化需求为:子窗口点击按钮,向父窗口发送消息,并显示在子窗口上:
子窗口 DatasetQueryConditionWgt.h
要定义两个函数:
- 点击按钮,发送信号的槽函数SlotQueryBtnClicked(),注意带上slots
- 发送信息的函数 SignalQueryConditionBtnClicked(QVariantMap m_queryCondition),注意带上signals关键字
signals:
void SignalQueryConditionBtnClicked(QVariantMap m_queryCondition);
protected slots:
void SlotQueryBtnClicked();
子窗口 DatasetQueryConditionWgt.cpp
connect(ui.queryBtn, SIGNAL(clicked()), this, SLOT(SlotQueryBtnClicked()));//在子窗口的构造函数中写connect函数
...
void DatasetQueryConditionWgt::SlotQueryBtnClicked()
{
...//其他操作
emit SignalQueryConditionBtnClicked( m_queryCondition);
}
父窗口 DataSetQueryWidget.h
申明槽函数,接受子窗口发送的信号
protected slots:
void DatasetQueryConditionWgtReceiveSignals(QVariantMap queryCondition);
父窗口 DataSetQueryWidget.cpp
connect(m_pWindow, &DatasetQueryConditionWgt::SignalQueryConditionBtnClicked, this, &DataSetQueryWidget::DatasetQueryConditionWgtReceiveSignals);
//参数分别是:子窗口实例化的对象指针,子窗口的信号函数,父窗口的对象指针,父窗口的槽函数
//一般在子窗口实例化,也就是new完之后 写connect
void DataSetQueryWidget::DatasetQueryConditionWgtReceiveSignals(QVariantMap queryCondition)
{
m_pWindow->hide();
queryCondition ···
}
坑一:
一开始我在父窗口的构造函数中写 connect,点击按钮没反应,因为构造函数运行时,子窗口还没有实例化,connect不起作用
new完之后再写就好了!!!
if(!m_pWindow)
m_pWindow = new DatasetQueryConditionWgt(this);
connect(m_pWindow, &DatasetQueryConditionWgt::SignalQueryConditionBtnClicked, this, &DataSetQueryWidget::DatasetQueryConditionWgtReceiveSignals);
坑二:
本来不打算用这个方法的,本来是打算直接在父窗口写子窗口的槽函数,但是在写connect时,发现 子窗口.ui 无法使用。这个是子窗口私有化的对象,所以connect无法奏效。
同事给了一种解决方案:在子窗口中设置getui函数获取ui,应该也可以,但是我没试。当然这个发送消息的方式也时同时告诉我的