QComboBox in QTreeView

Alles rund um die Programmierung mit Qt
Antworten
mugi
Beiträge: 30
Registriert: 7. Juli 2011 18:12

QComboBox in QTreeView

Beitrag von mugi »

Hallo,
ich habe einen QTreeView mit viele Zeilen und Spalten. Die Daten kommen aus einem QAbstractItemModel das ich erfolgreich implementiert habe.
Jetzt zu meiner Frage: Gibt es einen einfachen Weg einer meiner Spalten mit Comboboxen zu versehen (mit einfach meine ich sowas:

Code: Alles auswählen

treeview->setCellWidget(row, column, comboBox);
funktioniert natürlich nicht !
Hier sind die Methoden die ich in meinem Model benutze :

Code: Alles auswählen

QModelIndex myModel::index ( int row, int column, const QModelIndex & parent) const 
       { 
             return createIndex(row, column); 
       } 
int myModel::rowCount ( const QModelIndex & parent) const 
       { 
            return(r); 
       } 
int myModel::columnCount ( const QModelIndex & parent) const 
       { 
            return(c); 
       } 
QVariant myModel::data ( const QModelIndex & index, int role) const 
       {  ...
       } 
Qt::ItemFlags myModel::flags(const QModelIndex& index) const 
       {....
       } 
bool myModel::setData(const QModelIndex& index, const QVariant& value, int role) 
        { ...
        } 

Vielen Dank im Voraus.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Genau diese Frage haben wir doch schon beantwortet... http://qtforum.de/forum/viewtopic.php?t=13859 :roll:
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
mugi
Beiträge: 30
Registriert: 7. Juli 2011 18:12

Beitrag von mugi »

Ja :lol: das war ich der die Frage gestellt hat

Jetzt habe ich ein anderes Problem: nicht checkbox sondern combobox:=Dropdown-Liste
archer
Beiträge: 306
Registriert: 2. Februar 2006 09:56

Beitrag von archer »

Thema Delegate.
In der Doku gibt es ein SpinBox-Delegate. Das kannst du als Muster nehmen und statt der QSpinBox eine QComboBox einbauen.
mugi
Beiträge: 30
Registriert: 7. Juli 2011 18:12

Beitrag von mugi »

Ja ja das habe ich schon gesehen, ich wollte nur wissen ob es vielleicht einfacher geht
Danke.
mugi
Beiträge: 30
Registriert: 7. Juli 2011 18:12

Beitrag von mugi »

Ok, ich habe das Beispiel entsprechend gefolgt, und ein Delegate Implementiert.
In meinem View habe ich jetzt folgende Befehle hinzugefügt:

Code: Alles auswählen

#include <QtGui> 
#include "ComboDelegate.h" 
ComboDelegate* delegate = new ComboDelegate();
TreeView->setItemDelegateForColumn(8, delegate);
Aber nichts ist passiert, ich kann in die entsprechende Spalte immer noch keine ComboBoxen sehen !! Sollten in meinem Model auch Änderungen erfolgen ?

Hier sind meine Delegates:

Code: Alles auswählen

 /*delegate.h*/
...
class ComboDelegate : public QItemDelegate
{
    Q_OBJECT
    public:
 
          ComboDelegate(QObject *parent = 0);
          QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
          void setEditorData(QWidget *editor, const QModelIndex &index) const;
          void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
          void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const;
};
 
#endif

Code: Alles auswählen

/*delegate.cpp*/
#include "ComboDelegate.h"
 
ComboDelegate::ComboDelegate(QObject *parent): QItemDelegate(parent)
{
}
 
QWidget *ComboDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &/* option */, const QModelIndex &/* index */) const
{
     QComboBox *editor = new QComboBox(parent);
     QStringList list ;
     list << "a" << "b" << "c" << "d";
     editor->addItems(list);
     return editor;
}
 
void ComboDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
     QString value = index.model()->data(index, Qt::DisplayRole).toString();
     QComboBox *comboBox = static_cast<QComboBox*>(editor);
     comboBox->addItem(value);
}
 
void ComboDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
     QComboBox *comboBox = static_cast<QComboBox*>(editor);
     QString value = comboBox->currentText();
     model->setData(index, value);
}
 
void ComboDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &/* index */) const
{
editor->setGeometry(option.rect);
}
Vielen Dank im Voraus.
ScyllaIllciz
Beiträge: 200
Registriert: 9. Juli 2010 19:31

Beitrag von ScyllaIllciz »

Die ComboBox wird auch nur angezeigt beim Ändern der Daten, sprich per default Doppelklick in die Zelle. Dann solltest Du die ComboBox sehen.
mugi
Beiträge: 30
Registriert: 7. Juli 2011 18:12

Beitrag von mugi »

Ich habe das jetzt versucht, aber es wird nichts angezeigt !!
Sollte ich im Model was ändern ? (Data, setData, flags)
ScyllaIllciz
Beiträge: 200
Registriert: 9. Juli 2010 19:31

Beitrag von ScyllaIllciz »

Hast Du ein kleines Testprojekt?
Ansonsten Debugger anwerfen und schauen ob Du überhaupt im Delegate landest.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Oder einfach mal schauen wie man es richtig macht: http://doc.qt.nokia.com/4.7/itemviews-s ... egate.html - ist ja nicht so als hätte ich einen ähnlichen Link schon im vorigen Thread gepostet. Deshalb auch meine erste Reaktion...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
mugi
Beiträge: 30
Registriert: 7. Juli 2011 18:12

Beitrag von mugi »

Danke, jetzt kenne ich mein Fehler
In myModel sollten folgende schritte gemacht werden:
1)flags für die Spalte auf:

Code: Alles auswählen

 Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable;
der letzte ist am wichtigsten.

2)in setData müssen die Values gespeichert werden :

Code: Alles auswählen

if (role == Qt::EditRole)
    {
        m_combo[index.row()]=value.toString();
        return true;
    }
3)in Data müssen die Werte angezeigt werden:

Code: Alles auswählen

 if((role == Qt::DisplayRole)&&(index.column() == 4))
    {
        return m_combo[index.row()];
    }
Ich hoffe das hilft jemandem weiter :wink:
Vielen Dank euch Allen für eure Zeit und für die Blitz schnellen Antworten.
Antworten