Удаление строки QTableView

Я создал табличное представление так:

введите описание изображения здесь

У меня есть кнопка создания для создания новых строк, и, как вы можете видеть, я определил кнопку для каждой строки, чтобы удалить эту строку с помощью этого кода:

int i = 0;
QPushButton *viewButton;
QStandardItemModel *model;
void MainWindow::on_pushButton_clicked()
{
model->appendRow(new QStandardItem(QString("")));
viewButton = new QPushButton();
viewButton->setText("Delete " + QString::number(i));
ui->tableView->setIndexWidget(model->index(i , 7), viewButton);
connect(viewButton , SIGNAL(clicked()) , this , SLOT(button_clicked()));
i++;
}

и я создал слот для каждой кнопки, нажатой для удаления строки:

void MainWindow::button_clicked()
{
//   by this line I can get the sender of signal
QPushButton *pb = qobject_cast<QPushButton *>(QObject::sender());
}

как вы видите, я знаю, что кнопка ведьмы посылает сигнал, и теперь мне нужно удалить этот ряд.
вот мой вопрос:
Как я могу получить строку кнопки отправителя в табличном представлении, чтобы удалить эту строку?
Я искал везде, и я не понимал, как получить строку и столбец элемента.

3

Решение

На обходной путь, чтобы использовать QObject::setObjectName и установите некоторые имена для кнопок, которые вы добавляете:

viewButton.setObjectName(QString("%1").arg(i));

И в button_clicked Слот вы можете получить номер строки, используя имя объекта:

void MainWindow::button_clicked()
{
//   by this line I can get the sender of signal
QPushButton *pb = qobject_cast<QPushButton *>(QObject::sender());

int row = pb->objectName().toInt();
}

Обратите внимание, что вы должны обновить имена объектов после удаления строки.

Другой способ заключается в использовании QSignalMapper класс, который собирает набор сигналов без параметров и повторно генерирует их с целочисленными параметрами, параметрами строки или виджета, соответствующими объекту, который отправил сигнал. Таким образом, вы можете иметь один, как:

QSignalMapper * mapper = new QSignalMapper(this);
QObject::connect(mapper,SIGNAL(mapped(int)),this,SLOT(button_clicked(int)));

При добавлении кнопок в каждую строку табличного представления вы можете подключить clicked() сигнал кнопки к map() слот QSignalMapper и добавьте сопоставление, используя setMapping так что когда clicked() сигнализируется от кнопки, сигнал mapped(int) испускается:

viewButton = new QPushButton();
viewButton->setText("Delete " + QString::number(i));
ui->tableView->setIndexWidget(model->index(i , 7), viewButton);

QObject::connect(viewButton, SIGNAL(clicked()),mapper,SLOT(map()));
mapper->setMapping(but, i);

Таким образом, всякий раз, когда вы нажимаете кнопку подряд, mapped(int) сигнал картографа, содержащий номер строки и, следовательно, button_clicked вызывается с параметром, содержащим номер строки.

Также здесь вы должны обновить отображения в button_clicked слот, так как строка удаляется при нажатии на элемент.

1

Другие решения


По вопросам рекламы [email protected]