Seite 1 von 1

Auf Knopfdruck QComboBox zu QTableWidget hinzufügen

Verfasst: 29. März 2011 12:01
von Luna1987
Hallo @ all.

Ich habe ein QTableWidget, das zwei Spalten hat. Die Zellen der ersten Spalte haben unterschiedliche Texte. Dies mache ich über "setItem". Die Zellen der zweiten Spalte sind jeweils ComboBoxen mit dem gleichen Inhalt. Dies mache ich mit "setCellWidget". Das füllen der QTableWidget ist somit kein Problem.
Sobald ich aber auf den Button "Add Row" klicke, soll eine neue Zeile mit Text (1.Spalte) und ComboBox (2. Spalte) hinzugefügt werden. Leider fügt er aber nur zwei leere Zellen ein (siehe Anhang) :-(
Muss ich das QTableWidget irgendwie aktualisieren? Mit update() gehts leider nicht :-(

Hier mal die wichtigsten Codefragmente (ein wenig abgeändert):

Erstellen der Tabelle mit Inhalt:

Code: Alles auswählen

...
for (int i = 0; i < listeMitWerten.count() ; i++)
{
      ui.tableWidget->setRowCount((i+1));
      // Zelle (Spalte 1) füllen mit einem Text
      QTableWidgetItem *pItem = new QTableWidgetItem(listeMitWerten.value(i));
      ui.tableWidget->setItem(i, 0, pItem);
			
      // ComboBox definieren
      QComboBox *comboBox = new QComboBox();
      // der ComboBox eine Liste zuordnen
      comboBox->addItems(actorListe);
      comboBox->setCurrentIndex(1);
      // Zelle (Spalte 2) füllen mit ComboBox
      ui.tableWidget_mapping->setCellWidget(row, 1, comboBox);
}
Nun wird auf den Button geklickt und folgender Code wird ausgeführt:

Code: Alles auswählen

      int countRow = ui.tableWidget->rowCount();
      ui.tableWidget->insertRow((countRow + 1));
      ui.tableWidget->setRowCount((countRow + 1));

      QTableWidgetItem *addItem = new QTableWidgetItem();
      ui.tableWidget->setItem((countRow + 1), 0, addItem);

      // Erzeugt zwar eine neue Zeile, ABER keine neue ComboBox  
      QComboBox *addComboBox = new QComboBox();
      addComboBox->addItems(actorListe);
      addComboBox->setCurrentIndex(1);
      ui.tableWidget->setCellWidget((countRow + 1), 1, addComboBox);
Danke :-)

Verfasst: 1. April 2011 12:53
von Luna1987
Hat den keiner eine Idee? :cry:

Verfasst: 2. April 2011 23:16
von forgoden
lieber den ganzen code posten, damit wir schnell testen können.

weiss nicht warum da einmal tableWidget_mapping und einmal tableWidget steht.

Verfasst: 3. April 2011 08:45
von padreigh
nur mal so beim drüberfliegen ohne selbst in die API zu schauen:

Code: Alles auswählen

      int countRow = ui.tableWidget->rowCount();
      ui.tableWidget->insertRow((countRow + 1));
      ui.tableWidget->setRowCount((countRow + 1));
Das solltest du dir mal anschauen, ich kann mir kaum vorstellen das man erst eine row einfügt und dann manuell den rowCount erhöhen muss - das sollte insertRow implizit machen - ist in dem Fall ne leeranweisung.

Dann hast du uns vermutlich unterschlagen das du deine Liste sortierst und selbst nicht genau genug den API Eintrag zu setItem gelesen - damit ist dein Verhalten erklärt und du hast nen MemLeak ;) falls ich falsch liegen, kA.

Verfasst: 3. April 2011 09:58
von Christian81
padreigh hat geschrieben: Das solltest du dir mal anschauen, ich kann mir kaum vorstellen das man erst eine row einfügt und dann manuell den rowCount erhöhen muss - das sollte insertRow implizit machen - ist in dem Fall ne leeranweisung.
Genau umgekehrt - man muss erst den RowCount erhöhen bevor man was einfügen kann. Siehe auch http://doc.trolltech.com/4.7/qtablewidget.html#details

Verfasst: 3. April 2011 10:07
von padreigh
Christian81 hat geschrieben:
padreigh hat geschrieben: Das solltest du dir mal anschauen, ich kann mir kaum vorstellen das man erst eine row einfügt und dann manuell den rowCount erhöhen muss - das sollte insertRow implizit machen - ist in dem Fall ne leeranweisung.
Genau umgekehrt - man muss erst den RowCount erhöhen bevor man was einfügen kann. Siehe auch http://doc.trolltech.com/4.7/qtablewidget.html#details
Wenn man ein gefülltes QTableWidget hat und will noch ne Row dranpappen, muss man erst den RowCounter erhöhen, dann einen Leere Row einfügen und dann die row mit setItem füllen? Halte ich für Quark, sorry. Ich denke du denkst das insertRow() was anderes tut als es tut.

Code: Alles auswählen

#include <QtGui/QApplication>
#include "wid.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Wid w;
    w.show();
    return a.exec();
}

Code: Alles auswählen

#ifndef WID_H
#define WID_H

#include <QWidget>

class QLabel;
class QTableWidget;

class Wid : public QWidget
{
Q_OBJECT
public:
    explicit Wid(QWidget *parent = 0);

private slots:
    void addNewRow();

private:
    QLabel * m_counter;
    QTableWidget * m_table;
};

#endif // WID_H

Code: Alles auswählen

#include "wid.h"
#include <QtGui>

Wid::Wid(QWidget *parent) :
    QWidget(parent)
{
    QVBoxLayout * vbl = new QVBoxLayout(this);

    m_table = new QTableWidget(3,2);
    for(int row=0; row<3; ++ row)
    {
        for (int col=0; col<2; ++ col)
        {
            QTableWidgetItem * item = new QTableWidgetItem(QString("(%1,%2)").arg(QString::number(row),QString::number(col)));
            m_table->setItem(row,col,item);
        }
    }

    vbl->addWidget(m_table);

    QPushButton * but = new QPushButton("add empty Row");
    vbl->addWidget(but);
    {
        QFormLayout * form = new QFormLayout;
        {
            m_counter= new QLabel();
            m_counter->setNum(m_table->rowCount());
            form->addRow("RowCounter: ", m_counter);
        }
        vbl->addLayout(form);
    }

    connect(but,SIGNAL(clicked()),this,SLOT(addNewRow()));
}

void Wid::addNewRow()
{
    static int num = 0;
    m_table->insertRow(m_table->rowCount());
    for (int col=0;col < 2; ++col)
        m_table->setItem(m_table->rowCount()-1,col,new QTableWidgetItem(QString::number(num++)));

    m_counter->setNum(m_table->rowCount());
}