Seite 1 von 1
QComboBox in QTreeView
Verfasst: 14. Juli 2011 23:08
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:
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.
Verfasst: 15. Juli 2011 06:32
von Christian81
Genau diese Frage haben wir doch schon beantwortet...
http://qtforum.de/forum/viewtopic.php?t=13859 
Verfasst: 15. Juli 2011 09:41
von mugi
Ja

das war ich der die Frage gestellt hat
Jetzt habe ich ein anderes Problem: nicht checkbox sondern combobox:=Dropdown-Liste
Verfasst: 15. Juli 2011 10:00
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.
Verfasst: 15. Juli 2011 10:22
von mugi
Ja ja das habe ich schon gesehen, ich wollte nur wissen ob es vielleicht einfacher geht
Danke.
Verfasst: 15. Juli 2011 16:37
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.
Verfasst: 15. Juli 2011 17:52
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.
Verfasst: 15. Juli 2011 18:23
von mugi
Ich habe das jetzt versucht, aber es wird nichts angezeigt !!
Sollte ich im Model was ändern ? (Data, setData, flags)
Verfasst: 15. Juli 2011 18:35
von ScyllaIllciz
Hast Du ein kleines Testprojekt?
Ansonsten Debugger anwerfen und schauen ob Du überhaupt im Delegate landest.
Verfasst: 15. Juli 2011 18:40
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...
Verfasst: 15. Juli 2011 18:47
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
Vielen Dank euch Allen für eure Zeit und für die Blitz schnellen Antworten.