2017-09-20 1 views
1

Ich möchte Zeile löschen, wo QPushButton geklickt wird, wie es möglich ist, dass ich denke, es sinnvoll ist, Slots zu verwenden, aber wie man es weiß nicht, wenn Sie haben irgendwelche Ideen, wie man eine Reihe des ausgewählten Knopfes erhält, teilen Sie bitte, danke.Wie zeigt man die Zeile, wo QPushButton in QTableWidget geklickt wird

Es ist mein Tisch

Es ist ein Code, wo ich Zeilen zu meinem QTableWidget hinzufügen

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    for(int i = 0; i<20;i++) 
     ui->tableWidget->insertRow(ui->tableWidget->rowCount()); 
    QVector<QString>vec; 
    vec<<"first"<<"sec"<<"third"<<"for"<<"fif"<<"first"<<"sec" 
     <<"third"<<"for"<<"fif"; 
    vec<<"first"<<"sec"<<"third"<<"for"<<"fif"<<"first"<<"sec" 
     <<"third"<<"for"<<"fif"; 
    for(int i = 0; i<ui->tableWidget->rowCount();i++) 
    { 
     for(int j = 0; j<ui->tableWidget->columnCount();j++) 
     { 
      if(j == 0) 
      { 
       QWidget* pWidget = new QWidget(); 
       QPushButton* btn_edit = new QPushButton(); 
       btn_edit->setText("Remove"); 
       QHBoxLayout* pLayout = new QHBoxLayout(pWidget); 
       pLayout->addWidget(btn_edit); 
       pLayout->setAlignment(Qt::AlignCenter); 
       pLayout->setContentsMargins(0, 0, 0, 0); 
       pWidget->setLayout(pLayout); 
       ui->tableWidget->setCellWidget(i, j, pWidget); 
       continue; 

      } 
      QTableWidgetItem*item = new QTableWidgetItem(vec[i]); 
      item->setFlags(item->flags()^Qt::ItemIsEditable); 
      ui->tableWidget->setItem(i, j, item); 
     } 
    } 
} 

Antwort

1

Diese Aufgabe gelöst werden kann, die removeRow() Methode verwendet, aber bevor wir müssen das bekommen Reihe. Zunächst einmal werden wir alle Tasten auf einen Schlitz in der Schleife verbinden, wie unten gezeigt:

* .h

private slots: 
    void onClicked(); 

* CPP

[...] 
QPushButton* btn_edit = new QPushButton(); 
btn_edit->setText("Remove"); 
connect(btn_edit, &QPushButton::clicked, this, &MainWindow::onClicked); 
[...] 

im Schlitz Wir können die Taste, die das Signal durch die sender()-Methode ausgibt, dann erhalten wir QWidget Eltern (mit dem Namen pWidget erstellt), das ist das Widget, das der 012 hinzugefügt wirdund seine Position ist relativ dazu, dann verwenden wir die Methode indexAt(), um die QModelIndex mit der Zelle verbunden, und dies hat die Informationen der Zeile durch die Methode row(). Alle der oben genannten sind in den folgenden Zeilen implementiert:

void MainWindow::onClicked() 
{ 
    QWidget *w = qobject_cast<QWidget *>(sender()->parent()); 
    if(w){ 
     int row = ui->tableWidget->indexAt(w->pos()).row(); 
     ui->tableWidget->removeRow(row); 
     ui->tableWidget->setCurrentCell(0, 0); 
    } 
} 

Hinweis: Die setCurrentCell() Methode seit der letzten Zelle verwendet wird, um den Fokus zu setzen, dass sie gelöscht hat.

Das vollständige Beispiel finden Sie in der folgenden link.

0

Wenn Sie QPushButton schaffen nur hinzufügen:

btn_delete = new QPushButton("Remove", ui->tableWidget); 
    btn_delete->setObjectName(QString("%1").arg(ui->tableWidget->rowCount())); 

    connect(btn_delete, SIGNAL(clicked()), this, SLOT(CellButtonDeleteClicked())); 

Und schaffen Funktion CellButtonDeleteClicked()

 void CellButtonDeleteClicked() 
    { 

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

     int row = pb->objectName().toInt(); 
     ui->tableWidget->removeRow(row); 
    } 
Verwandte Themen