- 首先摘取QT帮助的说明
void QSignalMapper::setMapping(QObject *sender, QWidget *widget)
Adds a mapping so that when map() is signalled from the sender, the signal mapped(widget ) is emitted.
There may be at most one widget for each sender.
翻译:
添加映射,以便在从发送方发出map()信号时,发出信号映射(小部件)。
每个发送者最多只能使用一个小部件。
- 我自己的学习理解
我理解为这个方法,其实就是起到发送者和接收窗体绑定的功能.
因为我们使用自带的槽方法可能在某些情况下没有合适的默认参数,这个方法可以中转一下.我理解这个方法可以当需要传递的信号和槽来用.(当然应该是可以重载方法,初学还没涉及那么深入)
当然某老师只是说他可以实现同信号的不同槽方法,但是我想了一下这个貌似不用也能实现,初学可能还没完全理解和遇到.
- 重点:自己犯的错,花了好久时间o(╥﹏╥)o
简单来讲 上面的参数QWidget *widget 这个类型是要用QT自带的类型,我用了一个自己的类,怎么都找不到原因.
在这里插入代码片
void MainWindow::addChildWndActions()
{
// ChildWnd这个是我自己定义的类型,用来做子窗体功能
ChildWnd* activeWnd=getActivateWnd();
if(activeWnd==0) return;
ui->menu_W->clear();
ui->menu_W->addAction(ui->closeAction);
ui->menu_W->addAction(ui->closeAllAction);
ui->menu_W->addSeparator();
ui->menu_W->addAction(ui->titleAction);
ui->menu_W->addAction(ui->cascadeAction);
ui->menu_W->addSeparator();
ui->menu_W->addAction(ui->nextAction);
ui->menu_W->addAction(ui->previousAction);
ui->menu_W->addSeparator();
QList<QMdiSubWindow*> subWndList= ui->mdiArea->subWindowList();
for (int i=0;i<subWndList.size();i++)
{
ChildWnd* childWnd=MCC(subWndList.at(i));
QString item=QString("%1 %2").arg(i+1).arg(childWnd->getCurDocName());
QAction* curAction=ui->menu_W->addAction(item);
if(childWnd==activeWnd)
{
curAction->setCheckable(true);
curAction->setChecked(true);
}
connect(curAction,SIGNAL(triggered(bool)),m_signalMapper,SLOT(map()));
// subWndList.at(i)这个返回的是QMdiSubWindow*(看名字就知道是系统类)
// 但实际上我的ChildWnd 就是这个类转换而来的,如果用ChildWnd所对应的变量来代替的话
// 结果是不能达到你需要的效果
m_signalMapper->setMapping(curAction,subWndList.at(i));
}
}