QMAP Lektion nr1. QMultiMap Lektion nr1.

Alles rund um die Programmierung mit Qt
Antworten
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

QMAP Lektion nr1. QMultiMap Lektion nr1.

Beitrag von patrik08 »

Also ich kann begreifen das in der c++ sprache niemand begreift was ein Multidimensionales Array ist.. wie in http://php.net/array beschreiben ist..
Oder ein array wie im javascripts.
Doch in meinem Kopf ist seit 10 Jahren diese terminologie.

Nun seit 2 monaten (im c++) muss ich mein array verbinden mit :
1 - ein Qvector = (ein array mit nur eine index) wert[1]="charstring"
(also kann nur einen wert haben prozeile! einen vector in einen anderen
geht nicht) so wie php oder javasripts.
2 - enum ja ... ist auch eine liste total auf wort basiert print aepfel[golden]

3 - struct ... ist auch ein winziges array hatte ich als ich daten an einen callback von sqlite senden musste... aber jede variable hat nur eine wert...

4 - map (oder qmap) .... da wirt es interessant... da kann man verschiedene typen von variablen in eine liste setzen...

5 - es gibt sicher noch mehr ....

LEKTION BEGIN 1.0

nun machen wir ein QComboBox ( wie im html <select>) mit den werten:

|uebergabe an programm| utf8 was der benutzer sehen kann|
11 int | Deutsch aepfel qstring |
12 int | Deutsch bananen qstring |
13 int | Deutsch orangen qstring |

111 int | Italiano mela qstring |
112 int | Deutsch banane qstring |
113 int | Deutsch arance qstring |

und noch weitere 3 sprachen..

also ein vector unmoeglich ausser man stelt ein separator da und der wert int ist nicht sauber...

Jede sprache ein enum ..... nein...

also einen Herr Qmap....

QMap<QString, int , QString> NRdeutschQComboBox;
drei werte in eine zeile geht sicher nicht... (forum suche doc nichts!)
also wie vector ... aber ein qmap kann auch functionen aufnehmen... gehe ich da richtig?

Also laut classe name QMultiMap ( obwohl doku beispiel wieder nur 2 werte drinnen hat... also wie ein vector! oder normalen Qmap.

QMultiMap<QString, int> map1, map2, map3;
map1.insert("plenty", 100);
map1.insert("plenty", 2000);
..... forum suche QMultiMap NULL .. also ausser diskussion QMultiMap > /dev/null

Also um ein Ganz gewohnliches Array zu machen mit 3 sprachen
muss ich 2 qmap machen und ... fuer jede sprache eins damit dieses QComboBox beispiel zu sehen ist...?



struct beisbiel...

Code: Alles auswählen

struct sqljumper {
  sqlite3 *db;            /* The database */
  int cnt;               /* Number of records displayed so far */
  int mode;              /* An output mode setting */
  int showHeader;        /* True to show column names in List or Column mode */
  QString zDestTable;      /* Name of destination table when MODE_Insert */
  QString CleanTableName;  /* Name of destination table when export dump */
  QString separator;    /* Separator character for MODE_List */
  int colWidth[100];     /* Requested width of each column when in column mode*/
  int actualWidth;  /* Actual width of each column */
  QString nullvalue;    /* The text to print when a NULL comes back from*/
  QString zDbFilename;    /* name of the database file */
};


..
vector beisbiel.

Code: Alles auswählen

/* header    => QVector<QString> cfg; */
cfg.resize(0);
    cfg.resize(100);
    cfg.fill("tagname|");  /* go xml file  []    qstring data.right(data.indexOf("[]")) */
    cfg.insert(1, "applongname|"+ApplicationLongName);
    cfg.insert(2, "appname|"+ApplicationName);
    cfg.insert(3, "cachedir|"+cachedir);
    cfg.insert(4, "sqldir|"+logfile);
    cfg.insert(5, "logfile|"+ApplicationLongName);

/* auslesen ... */

QString *data = cfg.data();

    for (int i = 0; i < cfg.size(); ++i) {
        QString pos = QString( "Position =>%1 " ).arg( int2char(i) );
        if (data[i] !="tagname|") {
        file_put_contents_append(logfile,pos+data[i]+" vector ....");
           RegisterLog("Vector config file "+pos+data[i]+" vector ...."); 
        }
    }


LEKTION BEGIN 1.0 a) nun geht es bei dir weiter... mit dem QComboBox beispiel.
Goos
Beiträge: 360
Registriert: 17. August 2004 10:10
Wohnort: Black Forest

Re: QMAP Lektion nr1. QMultiMap Lektion nr1.

Beitrag von Goos »

patrik08 hat geschrieben:Also ich kann begreifen das in der c++ sprache niemand begreift was ein Multidimensionales Array ist.. wie in http://php.net/array beschreiben ist..
Oder ein array wie im javascripts.
Wie kommst zu dieser albernen Vermutung?
Ich hab hier langsam schon Traenen in den Augen, weil du staendig versuchst, C++ und php bzw. javascript zu vergleichen (Ist in meinen Augen naemlich mehr als albern....sollte man auch nicht tun nur weil die Syntax eine gewisse Aehnlichkeit aufweisst.)

Hattest du bei diesem Post eigentlich nur Lust deinen Unmut und dein Unverstaendnis zu aeussern, oder gabs irgendwo auch eine Frage, die ich in der Masse an Text vielleicht ueberlesen habe?

Abgesehen davon probierst du immer mit Qt und redest wohl immer nur ueber C++. Das sind aber zwei paar Dinge.
Falls du ein mehrdimensionales Array in C++ komplett von Hand erstellen und auch den Speicher selbst verwalten willst, dann musst du in etwa wie folgt vorgehen.

Code: Alles auswählen

char** pCharArray = NULL; 
     
    pCharArray = (char**)malloc(sizeof(char*)); 
    pCharArray[0] = (char*) malloc(150 * sizeof(char)); 
    pCharArray[0][0]= 'a'; //mal so zum Test 

     
    pCharArray = (char**)realloc(pCharArray, _msize(pCharArray) +  sizeof(char*));  //erweitern um eins 
    pCharArray[1] = (char*) malloc(150 * sizeof(char)); 
    pCharArray[1][0]= 'b'; //mal so zum Test 
     
     
    printf("%c", pCharArray[0][0]); 
    printf("\n%c", pCharArray[1][0]); 

    free(pCharArray[0]); 
    free(pCharArray[1]); 
    free(pCharArray);
Goos

PS: Hier vielleicht noch die Bitte, dich praeziser auszudruecken und genaue Fragen zu stellen. (Alternativ vielleicht in den Threadttitel einfach ein (Diskussion) mit reinschreiben)
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

ja gut .... array ist bei dir bekannt ... doch nun das
QComboBox beispiel... kann es ueberhaup 2 werte behalten ... oder muss man es alles durch switch en...

sicher bin ich nicht der einzige der nicht weiss wie eine qmap aufstellen...
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

patrik08 hat geschrieben:doch nun das QComboBox beispiel... kann es ueberhaup 2 werte behalten
Natürlich, guck dir mal addItem an:
void addItem ( const QString & text, const QVariant & userData = QVariant() )
Der erste Parameter ist der Text, der in der Combobox zu sehen ist und als UserData kannst Du alles Mögliche reinpacken. Z.B. einen Pointer auf eine Struktur, in der Du wiederum mehrere Werte hinterlegen kannst usw.
Shadow
Beiträge: 92
Registriert: 27. August 2005 18:15
Wohnort: Iserlohn
Kontaktdaten:

Re: QMAP Lektion nr1. QMultiMap Lektion nr1.

Beitrag von Shadow »

patrik08 hat geschrieben:Also ich kann begreifen das in der c++ sprache niemand begreift was ein Multidimensionales Array ist.. wie in http://php.net/array beschreiben ist..
Oder ein array wie im javascripts.
Doch in meinem Kopf ist seit 10 Jahren diese terminologie.

Nun seit 2 monaten (im c++) muss ich mein array verbinden mit :
1 - ein Qvector = (ein array mit nur eine index) wert[1]="charstring"
(also kann nur einen wert haben prozeile! einen vector in einen anderen
geht nicht) so wie php oder javasripts.
2 - enum ja ... ist auch eine liste total auf wort basiert print aepfel[golden]

3 - struct ... ist auch ein winziges array hatte ich als ich daten an einen callback von sqlite senden musste... aber jede variable hat nur eine wert...

4 - map (oder qmap) .... da wirt es interessant... da kann man verschiedene typen von variablen in eine liste setzen...

5 - es gibt sicher noch mehr ....

LEKTION BEGIN 1.0

nun machen wir ein QComboBox ( wie im html <select>) mit den werten:

|uebergabe an programm| utf8 was der benutzer sehen kann|
11 int | Deutsch aepfel qstring |
12 int | Deutsch bananen qstring |
13 int | Deutsch orangen qstring |

111 int | Italiano mela qstring |
112 int | Deutsch banane qstring |
113 int | Deutsch arance qstring |

und noch weitere 3 sprachen..

also ein vector unmoeglich ausser man stelt ein separator da und der wert int ist nicht sauber...

Jede sprache ein enum ..... nein...

also einen Herr Qmap....

QMap<QString, int , QString> NRdeutschQComboBox;
drei werte in eine zeile geht sicher nicht... (forum suche doc nichts!)
also wie vector ... aber ein qmap kann auch functionen aufnehmen... gehe ich da richtig?

...
Also wer wirklich seit 10 Jahren mehr oder weniger professionell entwickelt, sollte sich eigentlich solche Sprüche in einem Forum verkneifen können. Die Qt-Bibliothek für C++ nimmt dem Programmierer nunmal nicht alles ab.
Mehrdimensionale Array waren in C/C++ noch nie intuitiv. Ein Lösungsansatz wäre ein aus dem 2D Array eines bestimmten Typs ein eindimensionales zu machen und anschließend auf die einzelnen "2D"-Felder über einen berechneten Index zugreifen, wie z.B. index=wert_x*wert_y.
Dadurch würdest Du dir immerhein die Speicherverwaltung sparen, oder du nimmst sowas wie double pointer als nD-Felder, die du dir alle vorher mit dem new operator entsprechend erstellst und intern auf diese verweist. Damit könntest Du dann direkt zugreifen, wie z.B. über array[x][y][z].

Ein gut gemeinter Rat: Ich empfehle trotzdem, Dir ein gutes Buch zu C++ zuzulegen, am besten gleich ein Standardwerk wie das hier.
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

Ich habe ja ein buch ....
1 - Modernes C++ Design (Generische Programmirung und Entwurf angewendet) http://www.amazon.de/exec/obidos/ASIN/3 ... 16-6436229

2 - sowie ein Italieniches von Herbert Schildt...
das erste ist ja fast alles Template... das 2 e ... ist etwas besser .. obwohl alle Beispiele fast nur mit zahlen arbeitet ...

das einzige beispiel was mir hilft einen Qmap zu bauen ist dass:

Code: Alles auswählen


// map verwendung 
#include <iostream>
#include <map>
#include <string>
using namespace std;

int main()
{
  map<string, string> dictionary;  /*  definition */

  dictionary.insert(pair<string, string>("haus", "Ort zum wohnen.")); 
  dictionary.insert(pair<string, string>("tastatur", "Ein Eigabe Geraet.")); 
  dictionary.insert(pair<string, string>("programm", "Der Akt ein ablauf zu schreiben.")); 
  dictionary.insert(pair<string, string>("STL", "Standard Template Library"));
  dictionary.insert(pair<string, string>("qt", "Ein super Framework das auf vielen OS Kompatibel sein kann.")); 
  
  
  string s; 
  cout << "Bitte ein wort eingeben: ";
  cin >> s; 

  map<string, string>::iterator p; 
  
  p = dictionary.find(s); 
  if(p != dictionary.end()) 
    cout << "Definition: " <<  p->second; 
  else
    cout << "Wort nicht worhanden.\n";

  return 0;
}

die definition wird mittels cout << "Definition: " << p->second;
rausgegeben ... doch koennen dort mehr al paare gesetz werden?

und dann gefunden werden mit p->second p->first ecc... und funktionen.. ?
Shadow
Beiträge: 92
Registriert: 27. August 2005 18:15
Wohnort: Iserlohn
Kontaktdaten:

Beitrag von Shadow »

Da solltest du dir vielleicht eher einen struct für deine Paare bauen.

Code: Alles auswählen

typedef struct pair
{
   QString a;
   QString b;
};
und dann anschließend ein zweidimensionales Array oder eine QMap diesen Typs davon bauen. Dann hast du jeweils pro Feld immer ein Wertepaar beisammen, wenn dir das weiterhilft.
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

also fuer jede sprache im QComboBox einen struct in einen array

aber geht das nicht mit einem die int die sind ja fuer alle sprachen das selbe....

wenn ich das englische mache :
qmap .....
an => QComboBox
int zahl | funktion_translate(englisches word) |

so kann ich nur die zahlen aufrufen mit qmap und die funktion linguistic qt
nimmt das richtige word und setzt es in QComboBox was qlocale so gagt...
oder?
Shadow
Beiträge: 92
Registriert: 27. August 2005 18:15
Wohnort: Iserlohn
Kontaktdaten:

Beitrag von Shadow »

patrik08 hat geschrieben:also fuer jede sprache im QComboBox einen struct in einen array

aber geht das nicht mit einem die int die sind ja fuer alle sprachen das selbe....

wenn ich das englische mache :
qmap .....
an => QComboBox
int zahl | funktion_translate(englisches word) |

so kann ich nur die zahlen aufrufen mit qmap und die funktion linguistic qt
nimmt das richtige word und setzt es in QComboBox was qlocale so gagt...
oder?
Du kannst einmal den QTranslator mit tr() u.s.w. benutzen, dir aber auch ein ResourceFile mit entsprechenden Werten schreiben, einlesen und ensprechend der Auswahl der Sprache einen bestimmten Wert anzeigen lassen. Für Übersetzungen bezogen auf die Applikation nimm' den QTranslator. Bezogen auf Daten wäre das allerdings meiner Meinung nach umständlich.

Da würde auch eine Resourcendatei reichen, die alle Einträge für alle benötigten Sprachen enthält und setze entsprechende Marker. Innerhalb des Programms kannst du auch einen QVector von QVectoren haben, die dann jeweils alle Einträge einer Sprache wiedergeben. Entsprechend der Menge der Sprachen in der Resourcendatei, fügst du für jede Sprache einen gefüllten QVector in deinen globalen QVector von Sprachen hinzu. Somit wärst du sehr flexibel, hättest alles auf einmal "erschlagen" und bräuchtest dich zudem nicht mehr mit Zahlen und dergleichen auseinandersetzen. Das ganze könnte für jedes Steuerelement, das flexible Daten und Sprachen haben kann, fortgeführt werden.
Die einzige Bedingung, die damit verknüpft ist, dass in der Resourcendatei entsprechende Einträge synonym gehalten werden müssen, aber das sollte eigentlich klar sein.
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

macman hat geschrieben:
patrik08 hat geschrieben:doch nun das QComboBox beispiel... kann es ueberhaup 2 werte behalten
Natürlich, guck dir mal addItem an:
void addItem ( const QString & text, const QVariant & userData = QVariant() )
Der erste Parameter ist der Text, der in der Combobox zu sehen ist und als UserData kannst Du alles Mögliche reinpacken. Z.B. einen Pointer auf eine Struktur, in der Du wiederum mehrere Werte hinterlegen kannst usw.

Was ist dass genau einen QVariant()?

mit was kann ich es in php vergleichen ob ueberhaubt?

array , oder ein mix von daten? oder ist es wie ein c++ struct?

danke fuer die aufklahrung.

und wie bekomme ich die werte retour von qvariant...

text ist mir bekant...

QComboBox_OBj->currentText()
und es kommt den text... currentIndex () die position ab 0
Goos
Beiträge: 360
Registriert: 17. August 2004 10:10
Wohnort: Black Forest

Beitrag von Goos »

Hier gehts doch um QT und nicht um irgendein PHP Zeugs :D
Zum QVariant schau einfach im Assistant, da ists ausfuehrlich und mit Beispiel beschrieben.

Goos
Antworten