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



QTablewidget每行都有QDateEdit小部件。我想知道用户编辑了哪个小部件。我所做的在类似情况下使用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上,因为如果编辑了QDateEdit,我需要更改QTableWidget的行选择,所以我想我可以使用它......但是QEvent::ModifiedChange不起作用,我不知道该用什么...

我记得不久前用 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是哪个。 出于其他原因,我通常会将我的小部件保存在某种容器中,因此执行上述操作对我来说可以大大降低代码复杂性。

最新更新