Seite 1 von 1

QComboBox model

Verfasst: 26. November 2005 12:06
von NoobSaibot
Hallo zusammen,

ich versuche eine QComboBox an ein Datenmodel zu binden. Dazu habe ich mein eigenes Model implementiert

Code: Alles auswählen

#ifndef MYMODEL_H_
#define MYMODEL_H_

#include <QAbstractListModel>
#include <QStringList>

class MyModel : public QAbstractListModel
{
	Q_OBJECT
public:
	MyModel(const QStringList&, QObject*);
	virtual ~MyModel();
	
	int rowCount(const QModelIndex&) const;

	QVariant data(const QModelIndex&, int role) const;
	bool setData(const QModelIndex&, const QVariant&, int);

	QVariant headerData(int, Qt::Orientation, int) const;
	
	Qt::ItemFlags flags(const QModelIndex&) const;

private:
	QStringList entries;
};

#endif /*MYMODEL_H_*/







#include "mymodel.h"

MyModel::MyModel(const QStringList &strings, QObject *parent)
	: QAbstractListModel(parent), entries(strings)
{
}

MyModel::~MyModel()
{
}

int MyModel::rowCount(const QModelIndex &parent = QModelIndex()) const
{
	Q_UNUSED(parent);
	return entries.count();
}

QVariant MyModel::data(const QModelIndex &index, int role) const
{
	if (!index.isValid()) {
		return QVariant();
	}

	if (index.row() < 0 || index.row() >= entries.size()) {
		return QVariant();
	}

	if (role == Qt::DisplayRole) {
		return entries.at(index.row());
	} else {
		return QVariant();
	}	
}

bool MyModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
	if (index.isValid() && role == Qt::EditRole) {
		entries.replace(index.row(), value.toString());
		emit dataChanged(index, index);
		return true;
	}
	return false;
}

QVariant MyModel::headerData(int section, Qt::Orientation orientation, int role) const
{
	if (role != Qt::DisplayRole) {
		return QVariant();
	}
	
	if (orientation == Qt::Horizontal) {
		return QString(tr("Columnt %1")).arg(section);
	} else {
		return QString(tr("Row %1")).arg(section);
	}
}

Qt::ItemFlags MyModel::flags(const QModelIndex &index) const
{
	if (!index.isValid()) {
		return Qt::ItemIsEnabled;
	}
	
	return QAbstractItemModel::flags(index) | Qt::ItemIsEditable;
}
wenn ich jetzt einer ComboBox das Model zuweise, dann kann ich zwar die Einträge des Datenmodels sehen, aber auswählen kann ich sie nicht. Sprich, die Combobox klappt aus -- mit allen Einträgen --, ich wähle einen Eintrag aus, die ComboBox Auswahl bleibt jedoch leer. Wieso?

Hier noch die main()

Code: Alles auswählen

#include <QApplication>
#include <QComboBox>

#include "mymodel.h"

int main(int argc, char **argv) {
	QApplication app(argc, argv);
	
	QStringList entries;	
	entries << "eins" << "zwei";
	
	MyModel *model = new MyModel(entries, 0);
	
	QComboBox cBox;
	cBox.setModel(model);
	
	cBox.show();
	
	return app.exec();
}
Das Ganze mit Qt 4.0.1 unter Opensuse 10.0

Verfasst: 19. Dezember 2005 14:07
von NoobSaibot
hat denn keiner eine Idee? :(

Verfasst: 19. Dezember 2005 14:31
von BartSimpson
An sowas bastle ich auch gerade aber Aufgrund eines Bugs(im MySQL Treiber) kann ich erst wieder ab Qt 4.1.1 an der Sache weitermachen.

Verfasst: 13. Januar 2006 13:18
von sascha
Hallo!

Ich habe das eben auch mal versucht und bei mir bekomme ich schon den Fehler bei

Code: Alles auswählen

MyModel *model = new MyModel(test, 0);
dann sagt der Compiler

Code: Alles auswählen

'MyModel': Instanz von abstrakter Klasse kann nicht erstellt werden
Warum?[/quote]

Verfasst: 13. Januar 2006 15:26
von sascha
Ok....
Min Problem war, dass mein Modell von QAbstractItemModell abgeleitet worden ist und nicht von QAbstractListModell....

Nun kann ich es instanziieren, aber ausgewählt wird es auch bei mir nicht... Naja sagen wir mal so, QT bekommt mit, dass es gewählt wird, da der SLOT activated(int) angesprochen wird und mittels comboBox->getItem(int) auch das richtige Element des Modells ausgeggeben wird, aber in der ComboBox wird es nicht angezeigt....

Ich denke mal, das wird an einer nicht implementierten Funktion liegen... Ich werde weiter forschen!

Verfasst: 13. Januar 2006 15:32
von sascha
Nun habe ich die Lösung!
Man muss in der data Funktion auch die Rolle

Code: Alles auswählen

QT::EditRole
mit einem Wert belegen....
Dann wird es in der Auswahl der ComboBox angezeigt!

Verfasst: 20. Januar 2006 10:00
von NoobSaibot
Danke für den Tipp. Werde es mal ausprobieren! Am besten du postest hier noch einen Schnippsel Code dazu, damit es keine Missverständnisse gibt.

Verfasst: 20. Januar 2006 18:23
von sascha
Mach einfach aus Deiner data Methode folgendes:

Code: Alles auswählen

QVariant MyModel::data(const QModelIndex &index, int role) const
{
   if (!index.isValid()) {
      return QVariant();
   }

   if (index.row() < 0 || index.row() >= entries.size()) {
      return QVariant();
   }

   if (role == Qt::DisplayRole || role == Qt::EditRole) {
      return entries.at(index.row());
   } else {
      return QVariant();
   }   
}