3

次のようなテーブル ビューを作成しました。

ここに画像の説明を入力

新しい行を作成する作成ボタンがあり、ご覧のとおり、各行のボタンを定義して、次のコードでその行を削除します。

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());
}

ご覧のとおり、魔女のボタンが信号を送信することはわかっているので、その行を削除する必要があります。これが私の質問です:テーブルビューで送信者ボタンの行を取得してその行を削除するにはどうすればよいですか? どこでも検索しましたが、アイテムの行と列を取得する方法がわかりませんでした。

4

1 に答える 1

2

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();
}

行が削除された後、オブジェクト名を更新する必要があることに注意してください。

もう 1 つの方法は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また、アイテムをクリックすると行が削除されるため、スロットのマッピングを更新する必要があります。

于 2015-02-21T11:28:27.790 に答える