Liste-Problem

Alles zur Entwicklung von KDE - Anwendungen
Antworten
Frau Kuchen
Beiträge: 18
Registriert: 20. September 2007 14:49

Liste-Problem

Beitrag von Frau Kuchen »

Hallo Forum,

ich möchte eine Liste erzeugen, die folgendermaßen aussieht:

"Blatt 1", 22
"Blatt 2", 32
"Blatt 3", 44
...
...

Der erste Wert soll ein String sein, der zweite Wert soll ein Integer sein. Im Borland C++ Builder konnte ich sowas mit einer StringList erschlagen, wobei jedes Element noch ein Object bekam, das den Integer enthielt. Unter Linux mit KDevelop scheint das nicht mehr zu gehen. Bisher habe ich mir:

List,
QStringList,
QValueList,
struct,

angesehen und den ganzen Nachmittag rumprobiert, aber ich komme nicht weiter. Könnt ihr mir mal einen Tip geben, wie ich weiter machen kann?

MfG

Eure Frau Kuchen
iaby
Beiträge: 53
Registriert: 10. Februar 2007 13:12

Beitrag von iaby »

Da würde ich eine Kombination aus struct und QList nehmen (oder QVector, etc.)

Code: Alles auswählen

typedef struct {
QString Text;
int Nummer;
} meinStruct;

QList<meinStruct> meineListe;
Ist jetzt nicht getestet der Code, sollte prinzipiell aber funktionieren.
Frau Kuchen
Beiträge: 18
Registriert: 20. September 2007 14:49

Beitrag von Frau Kuchen »

iaby hat geschrieben:Da würde ich eine Kombination aus struct und QList nehmen (oder QVector, etc.)

Code: Alles auswählen

typedef struct {
QString Text;
int Nummer;
} meinStruct;

QList<meinStruct> meineListe;
Ist jetzt nicht getestet der Code, sollte prinzipiell aber funktionieren.
Hallo iaby,

erstmal Danke für Deine Hilfe. Ich benutze KDevelop 3.4.0 und Qt 3.3.7 und dort kann ich QList nicht finden. Meinst Du eventuell QValueList?

Hier ist mein struct:

Code: Alles auswählen

typedef struct Zahnrad
{
		QString qstrBezeichnung;
		unsigned int uiZaehnezahl;
} meinZahnrad;		
Das Problem, was ich jetzt habe, ist folgendes. Ich bekomme die Struktur nicht an eine Liste. Bisher habe ich QStringList versucht, aber da meckert der Compiler was von "...kein Template...". QValueList scheint mir genau das richtige dafür zu sein, aber damit komme ich trotz Hilfe und Beispielen aus:

http://doc.trolltech.com/3.3/qvaluelist.html

nicht zurecht. Mittlerweile habe ich schon zig Variationen ausprobiert.

Codevervollständigung in KDevelop funktioniert auch nicht immer :-(
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

'Funktioniert nicht immer' ist keine Fehlermeldung. Und bei der QValueList-Doku ist ein passendes Beispiel dabei.
Frau Kuchen
Beiträge: 18
Registriert: 20. September 2007 14:49

Beitrag von Frau Kuchen »

upsala hat geschrieben:'Funktioniert nicht immer' ist keine Fehlermeldung. Und bei der QValueList-Doku ist ein passendes Beispiel dabei.
Hallo upsala,

Mit "Funktioniert nicht immer" meine ich, mal funktioniert sie, mal nicht. Keine Ahnung warum. Unter Project->Project Options->C++ Support sind auf dem Reiter "Code Completion" in der Groupbox "Code Completion Options" jedenfalls alle Checkboxen angehakt. Muß ich noch mehr dazu beachten?

Das QValueList-Beispiel habe ich wohl gesehen und auch versucht, es auszuprobieren. Für das, was ich machen will, scheint mir das Beispiel mit der Klasse Employee viel zu umfangreich, wie mit Kanonen auf Spatzen schießen. Mittlerweile habe ich ein ähnliches Beispiel in der Dokumentation von "QPtrList Class Reference" gefunden und es auf meine Verhältnisse angepaßt. Ich poste mal ein Beipiel, wie ich es gemacht habe. Es ist nicht sehr elegant und ich bitte um eure Verbesserungsvorschläge.

Hier ist die (bereinigte) Header-Datei:

Code: Alles auswählen

#ifndef KENTFALTUNG_H
#define KENTFALTUNG_H

#include "kentfaltungdlg.h"

#include <fstream>
#include <qstring.h>
#include <qmessagebox.h>
#include <qlineedit.h>
#include <qtable.h>
#include <qdir.h>
#include <qfile.h>
#include <qfiledialog.h>
#include <qtextstream.h>
#include <qstringlist.h>
#include <qptrlist.h>

class KEntfaltung : public frmEntfaltung
{
		Q_OBJECT

	public:
		KEntfaltung(QWidget* parent = 0, const char* name = 0, WFlags fl = 0 );
		~KEntfaltung();
		
		/*$PUBLIC_FUNCTIONS$*/
		void LoescheTabelle(QTable *qtblTab);
    	void Auswerten(QTable *qtblTab, QString qstrTemp);
    	
		typedef struct Zahnrad 
		{
			QString qstrBezeichnung;
			unsigned int uiZaehnezahl;
		} meinZahnrad;
		typedef meinZahnrad * pZahnrad;

	public slots:
		/*$PUBLIC_SLOTS$*/
		virtual void          slotLoeschen();
		virtual void          slotSpeichern();
		virtual void          slotOeffnen();
		virtual void          slotTestdaten();
		virtual void          slotBerechnen();

	protected:
		/*$PROTECTED_FUNCTIONS$*/

	protected slots:
		/*$PROTECTED_SLOTS$*/

};
#endif
Hier die betreffende Methode aus der CPP-Datei:

Code: Alles auswählen

void KEntfaltung::slotTestdaten()
{
	QPtrList<Zahnrad> qplBlatt;
	qplBlatt.setAutoDelete(true);
	
	pZahnrad myZahnrad;
	
	myZahnrad = new meinZahnrad;
	myZahnrad->qstrBezeichnung = "Blatt 1";
	myZahnrad->uiZaehnezahl = 22;
	qplBlatt.append(myZahnrad);
	
	myZahnrad = new meinZahnrad;
	myZahnrad->qstrBezeichnung = "Blatt 2";
	myZahnrad->uiZaehnezahl = 32;
	qplBlatt.append(myZahnrad);
	
	myZahnrad = new meinZahnrad;
	myZahnrad->qstrBezeichnung = "Blatt 3";
	myZahnrad->uiZaehnezahl = 44;
	qplBlatt.append(myZahnrad);
			
	tblZahnrad->setNumRows(qplBlatt.count());
	for (unsigned int ui = 0; ui < qplBlatt.count(); ui++)
	{
		tblZahnrad->verticalHeader()->setLabel(ui, qplBlatt.at(ui)->qstrBezeichnung);
		tblZahnrad->setText(ui, 0, QString::number(qplBlatt.at(ui)->uiZaehnezahl));
	}
}
Nun, was meint ihr? Was kann ich verbessern?


MfG Eure Frau Kuchen
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Solltest du diesen Teil hier noch öfters benötigen:

Code: Alles auswählen

myZahnrad = new meinZahnrad; 
myZahnrad->qstrBezeichnung = "Blatt 1"; 
myZahnrad->uiZaehnezahl = 22; 
qplBlatt.append(myZahnrad); 
Wäre es sinnvoll einen Konstruktor für deinen 'struct' zu erstellen, dann dann könnte man im kürzesten Falle auch so schreiben:

Code: Alles auswählen

qplBlatt.append(new meinZahnrad("Blatt 1", 22));
Frau Kuchen
Beiträge: 18
Registriert: 20. September 2007 14:49

Beitrag von Frau Kuchen »

upsala hat geschrieben:Solltest du diesen Teil hier noch öfters benötigen:

Code: Alles auswählen

myZahnrad = new meinZahnrad; 
myZahnrad->qstrBezeichnung = "Blatt 1"; 
myZahnrad->uiZaehnezahl = 22; 
qplBlatt.append(myZahnrad); 
Wäre es sinnvoll einen Konstruktor für deinen 'struct' zu erstellen, dann dann könnte man im kürzesten Falle auch so schreiben:

Code: Alles auswählen

qplBlatt.append(new meinZahnrad("Blatt 1", 22));
Hallo upsala,

jepp, den obigen Code aus dem ersten Code-Schnipsel brauche ich dreimal und acht mal.

Genausso wie in deinem Beispiel aus dem zweiten Code-Schnipsel wollte ich das auch haben, bin aber wohl zu doof, um das hinzukriegen. So wird es ja auch in Beispielen der beiden Dokus zu:
http://doc.trolltech.com/3.3/qvaluelist.html
http://doc.trolltech.com/3.3/qptrlist.html
gezeigt. Also muß ich doch eine Class bauen, oder?

MfG, Frau Kuchen
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Du kennst den Unterscheid zwischen 'class' und 'struct'. Versuch dir mal C++-Grundlagen anzueignen...
Frau Kuchen
Beiträge: 18
Registriert: 20. September 2007 14:49

Beitrag von Frau Kuchen »

upsala hat geschrieben:Du kennst den Unterscheid zwischen 'class' und 'struct'. Versuch dir mal C++-Grundlagen anzueignen...
Also ich versuchs mal:

Eine Klasse entspricht einer Schablone, mit der Sie gleichartige Objekte beschreiben können. Dabei fasst die Klasse alle in diesem Kontext relevanten Eigenschaften und möglichen Zustände der Objekte zusammen. Ein Objekt ist immer eine Ausprägung einer Klasse. Man bezeichnet es dann auch als Instanz oder Exemplar der Klasse (zum Beispiel: Klasse Button, Objekte PlayButton und StopButton). Von jeder Klasse können mehrere Objekte gleichzeitig existieren. Jede Klasse kann Variablen, also gespeicherte Daten, beinhalten. Diese nennt man Attribute oder Datenelemente der Klasse. Sie können bei jedem Objekt andere Werte haben (Beispiel: Beschriftung, Höhe). Ändern Sie den Wert eines Attributs in einem Objekt, so gilt diese Änderung auch nur für dieses Objekt; alle anderen bleiben unverändert.


Mit Hilfe von Strukturen (struct) kann ich aus einfachen Variablentypen wie char, double, int oder string neue, benutzer definierte Typen schaffen.


Ja, die fehlenden Grundlagen versuche ich mir gerade anzueignen. Habe gemerkt, das mir einiges an Wissen fehlt, obwohl ich schon viele Jahre in C++ programmiere. Aber wenn man autodidaktisch lernt, dann gibt es eben Wissenlücken. Die versuche ich nun aufzufüllen. Deswegen lese ich unter anderm auch gerade
http://www.cpp-entwicklung.de/cpplinux3 ... _main.html
um weiter zu kommen.

Vielen Dank, das Du mir auf meinem Weg des Lernens weiter hilfst.
Antworten