其他分享
首页 > 其他分享> > qt 子窗口向父窗口发送信息

qt 子窗口向父窗口发送信息

作者:互联网

场景:点击父窗口按钮1,弹出子窗口。点击子窗口查询按钮,隐藏子窗口并把查询结果显示在父窗口上。
参考文献Qt实例–主窗口和子窗口互发信号

简化需求为:子窗口点击按钮,向父窗口发送消息,并显示在子窗口上:

子窗口 DatasetQueryConditionWgt.h
要定义两个函数:

  1. 点击按钮,发送信号的槽函数SlotQueryBtnClicked(),注意带上slots
  2. 发送信息的函数 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,应该也可以,但是我没试。当然这个发送消息的方式也时同时告诉我的

标签:窗口,queryCondition,函数,发送信息,connect,SignalQueryConditionBtnClicked,DatasetQueryCon
来源: https://blog.csdn.net/fuyouzhiyi/article/details/120885420