Auf Knopfdruck QComboBox zu QTableWidget hinzufügen

Alles rund um die Programmierung mit Qt
Antworten
Luna1987
Beiträge: 11
Registriert: 2. September 2009 14:34
Wohnort: Kassel

Auf Knopfdruck QComboBox zu QTableWidget hinzufügen

Beitrag 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 :-)
Dateianhänge
qTableWidget.jpg
qTableWidget.jpg (13.01 KiB) 5497 mal betrachtet
Luna1987
Beiträge: 11
Registriert: 2. September 2009 14:34
Wohnort: Kassel

Beitrag von Luna1987 »

Hat den keiner eine Idee? :cry:
forgoden
Beiträge: 120
Registriert: 10. Februar 2008 17:52

Beitrag von forgoden »

lieber den ganzen code posten, damit wir schnell testen können.

weiss nicht warum da einmal tableWidget_mapping und einmal tableWidget steht.
Win7, VisualStudio 2010, Qt 4.7
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Beitrag 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.
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Beitrag 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());
}
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
Antworten