连接信号将对象返回到没有参数的插槽

时间:2014-12-11 13:30:58

标签: c++ qt

我每行都有QTablewidgetQDateEdit小部件。我想知道用户编辑了哪个小部件。我在QComboBox小部件的类似情况下所做的工作:

qint32 row = 0;
mapper = new QSignalMapper(this); //QFrame
for (Object const& o : o_list) {
    tableWidget->setRowCount(row + 1);
    QDateEdit * date = new QDateEdit(o.date); //QDate
    date->setProperty(r, row); //const * char('r')
    connect(date, &QDateEdit::dateChanged, mapper, &QSignalMapper::map);
    mapper->setMapping(date, row);
    tableWidget->setCellWidget(row, 0, date);
    i++;
}
connect(mapper, SIGNAL(mapped(int)), this, SLOT(myon_dateEdit_dateChanged(int)));

唯一的问题是我无法将QDateEdit::dateChanged(QDate)QSignalMapper::map()连接起来,因为它不需要任何参数(我对QComboBox没有这样的问题,因为有无争议的信号)。我不需要QDate参数,因为虽然我知道小部件的位置 - 我可以稍后查看日期。对此有什么快速解决方案吗?

修改:我QFrame::eventFilter上安装了QDateEdit因为如果编辑QTableWidget我需要更改QDateEdit的行选择,所以我想我可以改用......但是QEvent::ModifiedChange并没有为此工作,我也不知道该使用什么......

1 个答案:

答案 0 :(得分:0)

我记得有一段时间用signalMapper做了一些事情,但最后我更喜欢这个:

connect( date, SIGNAL( dateChanged( int ) ), this, SLOT( handleDateChange( int ) ) );

void myObject::handleDateChanged( int ) {
    QDateEdit* changedEdit = static_cast<QDateEdit*>( sender() );
    // changedEdit is the one that changed 
}

您需要跟踪哪个QDateEdit是哪个。由于其他原因,我通常会将我的小部件保存在某种容器中,因此上述操作会使代码复杂度降低很多。