QLabel 2D Array

Alles rund um die Programmierung mit Qt
Antworten
Whitefurrows
Beiträge: 138
Registriert: 1. Mai 2006 19:50

QLabel 2D Array

Beitrag von Whitefurrows »

Hi,

in einem Programm benötige ich ein dynamisches 2D Array mit QLabel's. Das ganze sieht in etwa so aus:

Code: Alles auswählen

QLabel** pArray;
	pArray = new QLabel*[row];
	for(int i = 0; i < row; i++)
	{
		pArray[i] = new QLabel[col];
		for(int j = 0; j < col; j++)
		{
			QLabel* laField = new QLabel(this);
			laField->setText("ABC");
			pArray[i][j] = laField;
		}
	}
Leider erhalte ich an der Stelle (pArray[j] = laField;) die folgende Fehlermeldung:
error C2679: binary '=' : no operator found which takes a right-hand operand of type 'QLabel *' (or there is no acceptable conversion)
could be 'QLabel &QLabel::operator =(const QLabel &)'


Darauf habe ich mir eine Klasse von QLabel abgeleitet und dieser wie folgt einen Copy Konstruktor hinzugefügt:

Code: Alles auswählen

class MyLabel : public QLabel{
	Q_OBJECT

public:
    MyLabel(QWidget *parent = 0);	// Default Konstruktor
	MyLabel &operator = (const MyLabel &c){return *this;}; // Copy Konstruktor
    ~MyLabel();
};
Wenn ich jetzt anstelle von QLabel MyLabe verwende, kann ich den zuvor gezeigten Code verwenden, aber mit pArray[0][0].text() erhalte ich keinen Wert. Wo ist mein Fehler?
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Erstens wäre ein 2D-Array aus QLabel* eine "QLabel ***list" und zweitens verwende doch einfach

Code: Alles auswählen

QList<QLabel*> list;
for/while... {
  list << new QLabel....
}
und rechne die jeweilige Position im Array aus i und j (index = i*col+j)... ist viiiiiel einfach zu zerstören..
Whitefurrows
Beiträge: 138
Registriert: 1. Mai 2006 19:50

Beitrag von Whitefurrows »

Ja QList<QLabel*> list; wäre mit sicherheit auch eine Möglichkeit. Allerdings benötige ich ohnehin eine Klasse die von QLabel abgeleitet ist. Demzufolge müsste ich QList<MyLabel*> list; benutzen. Leider sagt mir mein Kompiler dann folgendes:

error C2248: 'QLabel::operator =' : cannot access private member declared in class 'QLabel'

In qlabel.h steht an der entsprechenden stelle:

Code: Alles auswählen

private:
    Q_DISABLE_COPY(QLabel)
Welche alternative habe ich jetzt?
Erstens wäre ein 2D-Array aus QLabel* eine "QLabel ***list" und zweitens verwende doch einfach
Verstehe ich nicht. Mit 2D-Array meine ich soetwas:

012
345
678

und das sollte doch QLabel** pArray; entsprechen oder nicht?
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Also... nochmals von vorne:

Bei

Code: Alles auswählen

pArray[i][j] = laField; 
möchtest du ja einer Dereferenzierten Instanz (also Typ "QLabel") einen Pointer (Typ QLabel*) zuweisen was nicht geht weil die Typen unterschiedlich sind. Aber das ist ja auch nicht das, was du brauchst. Du möchtest ja (hoffentlich) auch keine QLabels verwalten (Typ "QLabel"), sondern QLabel Pointer (Also "QLabel*"). Eine eindimensionale Liste von QLabel* wäre also in C-Style ein "QLabel**". Eine zweidimensionale Liste ein "Qlabel***".

Genau gleich verhält sich das ganze, wenn du eine von QLabel abgeleitete Klasse nehmen möchtest. Allerdings würde ich auf gar keinen Fall C-Style verwenden, sondern fertige Klassen:

Code: Alles auswählen

QList<MyLabel*> labelListe;
labelListe << new MyLabel();
Weil Pointer _immer_ kopiert werden können, bereitet dies auch keine Probleme. Falls du da Compilerfehlermeldungen hast, bitte Code zeigen..
Whitefurrows
Beiträge: 138
Registriert: 1. Mai 2006 19:50

Beitrag von Whitefurrows »

Vielen Dank nochmals für die Erklärung. Ja ich möchte QLabel Pointer ("QLabel*") verewenden.

Ich habe es jetzt auch so gemacht wie von Dir vorgeschlagen, da es in der Tat die bessere Lösung ist als C-Style zu verwenden:

Code: Alles auswählen

QList<MyLabel*> labelListe;
labelListe << new MyLabel(); 
Den Kompiler-Fehler hatte ich nur erhalten weil ich aus versehen den Copy Konstruktor in der abgeleiteten Klasse von QLabel auskommentiert hatte.

Also mit dem 2D Array stehe ich aber immer noch etwas auf dem Schlauch. Nach meiner Meinung wird das ganz gut hier erklär und das folgende Array in dem Beispiel sollte doch meinem Array entsprechen, oder?

Code: Alles auswählen

mytype **array;
array = new mytype*[20]; // Anzahl Spalten
for( int i = 0; i < 20; i++ )
array[i] = new int[10]; // Anzahl Zeilen
Wenn dem so ist, verstehe ich aber nicht, warum mein Array nicht funktioniert!
Antworten