LINUX.ORG.RU

Как определить номер строки в QTableWidget по элементу в строке таблицы cellwidget ?

 ,


0

1

В QTableWidget помещены в строки QCheckBox, которые динамически созданы, добавляются в лайоут, а лайоут в виджет, который через setcellwidget добавляется в ячейку таблицы. Нужно при клике на QCheckBox определить номер строки таблицы. Как это сделать без перебора по всей таблице поиска указателя QCheckBox ?

QCheckBox * check = (QCheckBox*)sender();

    int row = ui->tableMaterials->indexAt(check->pos()).row();

    int column = ui->tableMaterials->indexAt(check->pos()).column();

    qDebug() << "check" << check << "row" << row << "column" << column;

Такой вариант не работает, по всем строкам выдает 0,0 строку и столбец.

Наверное, придётся создать QHash<QCheckBox *, int> и в нём самому отслеживать.

xaizek ★★★★★ ()

Плюсую отдельное хранение карты соответствий. Но если уж совсем лень, можно записать номер ряда в какое-нибудь ненужное свойство чекбокса. Скажем, в whatsThis:

checkBox->setWhatsThis(QString("%1;%2").arg(row).arg(col);

Beewek ()

Как вариант, у каждого виджета (наследника QWidget) есть поле UserData. Ты можешь туда этот номер записать при создании формы, и тогда когда будет событие, ты просто извлечешь это user data с номером. Я так обычно делаю, т.е. сам виджет «носит с собой» полезную информацию

https://doc.qt.io/qt-5/qobject.html#setProperty

I-Love-Microsoft ★★★★★ ()
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)
Ответ на: комментарий от I-Love-Microsoft

Пользователь может удалить строку, нужно будет обновлять все номера. Подскажите как через parent добраться до QTableWidgetItem из QComboBox.

user2132 ()
Ответ на: комментарий от user2132

Понял, почему то думалось что речь про CB лишь в заголовках, а тут в каждой строке. К сожалению, помочь не могу, мне придется тогда писать тестовую программу для этого, исследовать, с ходу не подскажу…

I-Love-Microsoft ★★★★★ ()

Для такого тебе нужен не check.pos(), а check.parentWidget().pos(). Ну или что-то на эту тему - смотря что во что вложено.

Elyas ★★★★★ ()
Ответ на: комментарий от Elyas

У меня есть 2 варианта, просто combobox в ячейке и combobox вместе c checkbox в лайоуте, лайоут в виджет, а виджет уже в ячейку. Делаю так со вторым вариантом:

QComboBox *box = new QComboBox;
QCheckBox * check = new QCheckBox("");
QHBoxLayout *l = new QHBoxLayout();
l->addWidget(check);
l->addWidget(box);
QWidget *w = new QWidget();
w->setLayout(l);
ui->table->setCellWidget(row,0,w);

Для этого случая пробую так:

QWidget * w = (QWidget*)combobox->parent();

int row = ui->table->indexAt(w->pos()).row();

Но вроде не работает.

user2132 ()

Не вариант сделать нормально с моделью и QStyledItemDelegate? Там везде, где надо, сразу будут индексы.

roof ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.