QComboBox model

Alles rund um die Programmierung mit Qt
Antworten
NoobSaibot
Beiträge: 99
Registriert: 27. Januar 2005 15:55

QComboBox model

Beitrag 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
NoobSaibot
Beiträge: 99
Registriert: 27. Januar 2005 15:55

Beitrag von NoobSaibot »

hat denn keiner eine Idee? :(
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag 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.
sascha
Beiträge: 37
Registriert: 12. Januar 2006 11:01

Beitrag 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]
sascha
Beiträge: 37
Registriert: 12. Januar 2006 11:01

Beitrag 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!
sascha
Beiträge: 37
Registriert: 12. Januar 2006 11:01

Beitrag 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!
NoobSaibot
Beiträge: 99
Registriert: 27. Januar 2005 15:55

Beitrag 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.
sascha
Beiträge: 37
Registriert: 12. Januar 2006 11:01

Beitrag 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();
   }   
} 
Antworten