получить индекс строки отправителя сигнала, испускаемого из виджета ячейки в QTableWidget - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть QTableWidget с 3 столбцами.В первых двух столбцах хранится элемент 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()?

1 Ответ

3 голосов
/ 24 сентября 2019

Если вы используете 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);
}
...