2016-03-20 11 views
0

Ich habe ein GUI-Projekt in Qt Creator, das als Einkaufsliste fungiert. Ich verwende ein QLineEdit, um Elemente zu einem QTableWidget hinzuzufügen. Der Benutzer gibt etwas ein und drückt den QPushButton. Der Slot fügt dann dem QTableWidget eine neue Zeile mit der Eingabe in der ersten Spalte und einer neuen QPushButton in der zweiten Spalte hinzu. Ich möchte dann, dass der Benutzer in der Lage ist, den Knopf zu drücken und die Zeile löschen zu lassen, aber ich weiß nicht, wie ich auf diesen Slot oder Absender zugreifen soll (ich bin mir nicht sicher, was das ist.) Hier ist der Code soweit . itemList ist mein QTableWidget, itemInput ist der QLineEdit.Zugriff auf den click() - Slot einer Schaltfläche, die während der Laufzeit generiert wird - Qt Creator

void MainWindow::on_btnAddItem_clicked() 
{ 
    ui->itemList->insertRow(ui->itemList->rowCount()); 
    ui->itemList->setItem((ui->itemList->rowCount())-1,0,new QTableWidgetItem(ui->itemInput->text())); 
    QPushButton *clear = new QPushButton("Clear",this); 
    ui->itemList->setIndexWidget(ui->itemList->model()->index(ui->itemList->rowCount()-1, 1), clear); 
    ui->itemInput->clear(); 
} 

Hier ist, wenn das Programm zunächst ausgeführt wird. Sobald sie auf die Schaltfläche klicken, wird es on_btnAddItem_clicked()

initial run

Dann sieht es so aus, und ich möchte die Löschtaste die Zeile machen entfernen es ein Teil ist.

table entry

Brauche ich einen neuen Slot erstellen müssen? Irgendeine Hilfe?

+0

*** Muss ich einen neuen Steckplatz erstellen? *** Ja, wenn Sie keinen haben. Ich sehe, dass Sie den neuen Button erstellen, aber nicht sein 'clicked()' Signal an einen Slot in MainWindow anschließen. Verwenden Sie auch nicht die Benennungskonvention 'on_' für den neuen Slot, den Sie erstellen, da dies keine automatische Verbindung ist. – drescherjm

+0

@drescherjm, versucht er/sie, das 'clicked()' Signal an einen bestimmten Slot des 'QTableWidget' (oder seines Modells oder Delegates?) Mit einem entsprechenden 'QTableWidgetItem' als Eingabeparameter zu verbinden Es ist möglich, den Inhalt dieses 'QTableWidgetItem' zu bearbeiten/zu löschen. Das Signal clicked() 'kann nur' bool' als Parameter übergeben, also wie würden sie auf die zu löschende Zeile zugreifen. Klingt es richtig? – vicrucann

+0

Nein, nein, das angeklickte() Signal, das ich bereits habe, fügt die Benutzereingabe der Tabelle zusammen mit einem neuen PushButton in derselben Zeile hinzu. Ich möchte dann, dass der Benutzer den Knopf drücken und die Zeile löschen kann. Auf diese Weise können sie Einträge aus der Tabelle löschen. Aber ich kann die Zeilen und Schaltflächen nicht im Voraus erstellen, weil ich nicht weiß, wie viele Einträge ein Benutzer eingeben wird. Daher bin ich mir nicht sicher, wie ich etwas tun soll, wenn es nicht existiert, bis das Programm ausgeführt wird. – Tom

Antwort

0

Sie müssen Ihre eigene Schaltflächenklasse erstellen und QPushButton erben. Etwas wie folgt aus:

class MyButton : public QPushButton { 
    public: 
    MyButton(); 
    QTableWidgetItem *titem; 
} 

Und hier Mainwindow:

void MainWindow::on_btnAddItem_clicked() 
{ 
    ui->itemList->insertRow(ui->itemList->rowCount()); 
    ui->itemList->setItem((ui->itemList->rowCount())-1,0,new QTableWidgetItem(ui->itemInput->text())); 
    MyButton *clear = new MyButton("Clear",this); 
    clear->titem = ui->itemList->item(ui->itemList->rowCount()-1, 0); 
    connect(clear, SIGNAL(clicked()), SLOT(on_btnClear_Clicked())); 
    ui->itemList->setIndexWidget(ui->itemList->model()->index(ui->itemList->rowCount()-1, 1), clear); 
    ui->itemInput->clear(); 
} 

void MainWindow::on_btnClear_Clicked() 
{ 
    MyButton *btn = (MyButton*)QObject::sender(); 
    ui->itemList->removeRow(btn->titem->row()); 
} 

Bitte beachten Sie, dass es nur Schritt zu tun.

+0

Es wäre besser, 'qobject_cast (QObject :: sender())' stattdessen zu verwenden. – owacoder