获取从 QTableWidget 中的单元格小部件发出的信号发送器的行索引
get row index of signal sender emitted from cell widget in QTableWidget
我有一个包含 3 列的 QTableWidget
。
前两列存储 QDateTimeEdit
项。
第三个存储一个 QSpinBox
,它应该列出该行中两个 QDateTimeEdit
值之间的持续时间。
如何连接 QDateTimeEdit
的信号以自动更新 QSpinBox
中的持续时间以防某个日期时间更改?
...
for (int i_row = 0; i_row < 100; ++i_row){
QTableWidget *t = ui->tableWidget;
QDateTimeEdit *start = new QDateTimeEdit();
QDateTimeEdit *end = new QDateTimeEdit();
t->setCellWidget(i_row,0,start);
t->setCellWidget(i_row,1,end);
QSpinBox *sp = new QSpinBox();
sp->setReadOnly(true);
t->setCellWidget(i_row,2,sp);
connect(start, SIGNAL(dateTimeChanged(const QDateTime &)), this, SLOT(adjustDuration()));
connect(end, SIGNAL(dateTimeChanged(const QDateTime &)), this, SLOT(adjustDuration()));
}
与插槽:
void mainWindow::adjustDuration()
{
QDateTimeEdit *s = qobject_cast<QDateTimeEdit *>(sender());
// How do I get row number of the sender within QTableWidget in order to be able to access proper 2nd QDateTimeEdit and QSpinBox?
// Simplified speaking: I would like to get the value i_row from the code before
}
我想可以通过使用 ->parent()
函数来实现吗?
假设您使用的是 Qt5
,那么您可以使用 lambda
。所以像(未经测试)...
for (int i_row = 0; i_row < 100; ++i_row){
QTableWidget *t = ui->tableWidget;
QDateTimeEdit *start = new QDateTimeEdit();
QDateTimeEdit *end = new QDateTimeEdit();
t->setCellWidget(i_row, 0, start);
t->setCellWidget(i_row, 1, end);
QSpinBox *sp = new QSpinBox();
sp->setReadOnly(true);
t->setCellWidget(i_row, 2, sp);
auto eval = [start, end, sp]()
{
/*
* Here you have 'start', 'end' and 'sp'. Use them
* in whatever way you see fit.
*/
};
connect(start, &QDateTimeEdit::dateTimeChanged, eval);
connect(end, &QDateTimeEdit::dateTimeChanged, eval);
}
我有一个包含 3 列的 QTableWidget
。
前两列存储 QDateTimeEdit
项。
第三个存储一个 QSpinBox
,它应该列出该行中两个 QDateTimeEdit
值之间的持续时间。
如何连接 QDateTimeEdit
的信号以自动更新 QSpinBox
中的持续时间以防某个日期时间更改?
...
for (int i_row = 0; i_row < 100; ++i_row){
QTableWidget *t = ui->tableWidget;
QDateTimeEdit *start = new QDateTimeEdit();
QDateTimeEdit *end = new QDateTimeEdit();
t->setCellWidget(i_row,0,start);
t->setCellWidget(i_row,1,end);
QSpinBox *sp = new QSpinBox();
sp->setReadOnly(true);
t->setCellWidget(i_row,2,sp);
connect(start, SIGNAL(dateTimeChanged(const QDateTime &)), this, SLOT(adjustDuration()));
connect(end, SIGNAL(dateTimeChanged(const QDateTime &)), this, SLOT(adjustDuration()));
}
与插槽:
void mainWindow::adjustDuration()
{
QDateTimeEdit *s = qobject_cast<QDateTimeEdit *>(sender());
// How do I get row number of the sender within QTableWidget in order to be able to access proper 2nd QDateTimeEdit and QSpinBox?
// Simplified speaking: I would like to get the value i_row from the code before
}
我想可以通过使用 ->parent()
函数来实现吗?
假设您使用的是 Qt5
,那么您可以使用 lambda
。所以像(未经测试)...
for (int i_row = 0; i_row < 100; ++i_row){
QTableWidget *t = ui->tableWidget;
QDateTimeEdit *start = new QDateTimeEdit();
QDateTimeEdit *end = new QDateTimeEdit();
t->setCellWidget(i_row, 0, start);
t->setCellWidget(i_row, 1, end);
QSpinBox *sp = new QSpinBox();
sp->setReadOnly(true);
t->setCellWidget(i_row, 2, sp);
auto eval = [start, end, sp]()
{
/*
* Here you have 'start', 'end' and 'sp'. Use them
* in whatever way you see fit.
*/
};
connect(start, &QDateTimeEdit::dateTimeChanged, eval);
connect(end, &QDateTimeEdit::dateTimeChanged, eval);
}