2016-08-07 47 views
0

Ich habe folgende Situation:Qt - dynamisch erstellen, lesen aus und zerstören Widgets (QLineEdit)

Ich habe QSpinBox, wo der Benutzer meiner Anwendung auswählen können, wie viele Instanzen eines Elements er schaffen will. In einem nächsten Schritt muss er für jeden Gegenstand einen Namen vergeben. Ich wollte dieses Problem lösen, indem ich dynamisch eine Anzahl von QLabels und QLineEdits entsprechend der Nummer, die der Benutzer in der SpinBox ausgewählt hat, erstelle. Also, wenn die Zahl steigt, möchte ich neue LineEdits hinzufügen, wenn die Zahl fällt, möchte ich die jetzt veralteten LineEdits entfernen.

Nun, raten Sie mal - das ist viel schwieriger, als ich erwartet habe. Ich habe das Internet durchsucht, aber die Ergebnisse waren mehr als enttäuschend. Es scheint keinen einfachen Weg zu geben, diese Widgets dynamisch zu erstellen, zu verwalten (vielleicht in einer Liste?) Und zu zerstören. Kann mir jemand in die richtige Richtung zeigen, wie das geht?

Antwort

2

Nehmen Sie sich eine Weile und überprüfen Sie QListWidget, es tut, was Sie genau wollen, indem Sie QListWidgetItem verwenden.

Ein kleines Beispiel: Diese Funktion fügt ein neues Element zu einem QListWidget mit einem definierten QWidget als Ansicht und gibt den aktuellen Index:

QModelIndex MainWindow::addNewItem(QWidget* widget) { 
    QListWidgetItem* item = new QListWidgetItem; 
    ui->listWidget->addItem(item1); 
    ui->listWidget->setItemWidget(item, widget); 
    return ui->listWidget->indexFromItem(item); 
} 

Nun, wenn Ihre Benutzer X Artikel auswählt, sollten Sie erstellen iterieren X-Widgets und Sie könnten alle Widgets in einem QList sparen:

listWidget.clear(); 
for (int i=0; i<X; i++) { 
    QTextEdit* edit = new QTextEdit(); 
    const QModelIndex& index = addNetItem(edit); 
    qDebug() << "New element: " << index; 
    listWidget.append(edit); 
    // Handle edit text event 
    connect(edit, SIGNAL(textChanged()), this, SLOT(yourCustomHandler())); 
} 

Nun zeigen nur die Liste mit allen Eingabefeldern.