QLabel zur Laufzeit erstellen

Alles rund um die Programmierung mit Qt
skfink
Beiträge: 16
Registriert: 25. März 2008 16:25

QLabel zur Laufzeit erstellen

Beitrag von skfink »

Hallo,
ich wollte erstmal ein ganz einfaches Beispiel machen wie das bei C++/Qt4 mit der Erstellung von Komponenten zur Laufzeit funktioniert. Ich habe lediglich einen Button und wenn der betätigt wird soll ein QLabel erstellt werden, aber noch nichtmal das funktioniert.

Hier die cpp:

Code: Alles auswählen

#include "dynwidgets.h"
#include "qlabel.h"

QLabel *label1;

DynWidgets::DynWidgets(QWidget *parent)
    : QMainWindow(parent)
{
	ui.setupUi(this);
}

DynWidgets::~DynWidgets()
{

}

void DynWidgets::on_pushButton_clicked()
{
	label1 = new QLabel(DynWidgets);	
}
Beim Project->Clean wird mit der Fehlermeldung "expected primary-expression before ‘)’ token" abgebrochen.
woran liegts?
PeterLustig
Beiträge: 386
Registriert: 21. November 2007 20:07

Beitrag von PeterLustig »

Ist das die gesamte Fehlermeldung? Poste evtl. mal deine Klassendefinition.
skfink
Beiträge: 16
Registriert: 25. März 2008 16:25

Beitrag von skfink »

ja, das ist die ganze Meldung.

Hier noch die gewünschte Header-Datei:

Code: Alles auswählen

#ifndef DYNWIDGETS_H
#define DYNWIDGETS_H

#include <QtGui/QMainWindow>
#include "ui_dynwidgets.h"

class DynWidgets : public QMainWindow
{
    Q_OBJECT

public:
    DynWidgets(QWidget *parent = 0);
    ~DynWidgets();

private:
    Ui::DynWidgetsClass ui;
    
private slots:
	void on_pushButton_clicked();
};

#endif // DYNWIDGETS_H
Flachkoepper
Beiträge: 149
Registriert: 11. Januar 2005 12:14
Wohnort: Hannover

Beitrag von Flachkoepper »

label1 = new QLabel(this);
gerome69
Beiträge: 188
Registriert: 28. April 2006 22:50
Wohnort: Berlin
Kontaktdaten:

Beitrag von gerome69 »

skfink hat geschrieben:ja, das ist die ganze Meldung.

Code: Alles auswählen

#ifndef DYNWIDGETS_H
#define DYNWIDGETS_H

#include <QtGui/QMainWindow>
#include "ui_dynwidgets.h"

Da fehlt ja für ein QLabel auch entweder ganz generell
#include <QtGui>
oder speziell
#include <QtGui/QLabel>

G.
PeterLustig
Beiträge: 386
Registriert: 21. November 2007 20:07

Beitrag von PeterLustig »

gerome, er bindet doch QLabel ein.. genauer schauen bitte. :) Und der Fehler wurde im Post vor dir genannt, hab ich glatt übersehen..
skfink
Beiträge: 16
Registriert: 25. März 2008 16:25

Beitrag von skfink »

also gerome hatte auch recht. Ich hab statt QLabel qlabel.h eingebunde, was aber nicht für Qt4 sondern Qt3 ist :roll:

Jetzt lässt sich das Programm ohne Fehler kompilieren, sobald ich den Button aber ausführe stürtzt das Programm ab ("unknown software exception").
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Dafür gibts einen Debugger...

Gibts einen Grund warum label eine globale Variable ist? Sowas sollte man vermeiden.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
gerome69
Beiträge: 188
Registriert: 28. April 2006 22:50
Wohnort: Berlin
Kontaktdaten:

Beitrag von gerome69 »

skfink hat geschrieben:also gerome hatte auch recht. Ich hab statt QLabel qlabel.h eingebunde, was aber nicht für Qt4 sondern Qt3 ist :roll:
Das dürfte nicht wirklich ein Unterschied sein.
In "QLabel" steht doch einfach nur ein "#include "qlabel.h".
skfink hat geschrieben: Jetzt lässt sich das Programm ohne Fehler kompilieren, sobald ich den Button aber ausführe stürtzt das Programm ab ("unknown software exception").
Wie Christian schon sagte: Deine Label-Variable sollte nicht global sein, sondern in die Klasse gehören.
Deine label-Variable ist ja nur ein Zeiger auf einen QLabel. Wenn du den noch nicht mit Leben gefüllt hast oder dir der Garbage Collector den Inhalt wieder gelöscht hast, weil du aus dem Context draussen bist, gibt es eben diese Zugriffsfehler auf nicht zugewiesenen Speicher.
Also pack deine label-Variable in die Klasse. Wenn du sie von außen brauchst, kannst du sie ja als "public" deklarieren.

Mittagsgruß, Gérôme
skfink
Beiträge: 16
Registriert: 25. März 2008 16:25

Beitrag von skfink »

ändert leider auch nix dran, dass

Code: Alles auswählen

label1 = new QLabel(this);
das Programm abstürzen lässt. Egal ob das Label unter private oder public deklariert ist.
gerome69
Beiträge: 188
Registriert: 28. April 2006 22:50
Wohnort: Berlin
Kontaktdaten:

Beitrag von gerome69 »

skfink hat geschrieben:ändert leider auch nix dran, dass

Code: Alles auswählen

label1 = new QLabel(this);
das Programm abstürzen lässt. Egal ob das Label unter private oder public deklariert ist.
Ich glaube nicht, daß genau diese Zeile den Speicherzugriffsfehler erzeugt.
Laß dir genau davor und dahinter mal ne QMessageBox ausgeben, um zu sehen, ob es diese Zeile ist.

Wenn doch: was ist denn "this" in diesem Zusammenhang?
Nur testweise: Ändert new QLabel(NULL) was? Dann siehst wahrscheinlich den Label nicht, oder?!

G.
skfink
Beiträge: 16
Registriert: 25. März 2008 16:25

Beitrag von skfink »

ich hab mal Testweise die Labelerstellung in die main{} verlegt. Ergebnis, Programm startet, kein Label sichtbar, und wenn ich auf den Button klicke der eine leere Ereignisfunktion hat, stürtzt das Programm trotzdem ab :shock:

Also was ich noch falsch mache um das Label mal sehn zu können ist eine Sache, die andere ist dass wohl auch bei der signal slot Geschichte was nicht stimmt. Ich benutze Eclipse mit dem integrierten Qt Designer mit dem ich auch den slot zugewiesen habe. Vom Button zum Button und click() mit clicked() verbunden. Slot Definition steht ja schon im dritten Posting.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Bitte pack doch einfach mal dein ganzes Projekt in ein Zip [1]. Dann kann man auch mehr sagen. Außer es gibt hier jemanden der Hellsehen kann - bitte vortreten ;)

[1] Wenn du noch nicht "winzip"-Vorbestraft bist und auch sonst besorg dir mal 7zip. Als Linuxer nimm die konsole ;)
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Ich glaube Du solltest ersteinmal die Tutorials durcharbeiten... deine Herangehensweise ist total unlogisch und bringt uns nichts an Informationen.
Ein simples label = new QLabel() kann nicht zum Absturz führen...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
skfink
Beiträge: 16
Registriert: 25. März 2008 16:25

Beitrag von skfink »

also ich hab da wohl noch einige Missverständnisse mit dem Signal und Slots Prinzip (gehabt) und mit dem Qt Designer Slots Zuweisungen gemacht die nicht nur nicht notwendig waren, sondern auch den Absturtzt herbeiführten.

Jetzt stürtzt das Programm nicht mehr ab, der Debugger zeigt auch an, dass die Zeile um das Label zu erstellen ausgeführt wird

Code: Alles auswählen

void ScrollBook::on_pushButton_clicked()
{
	QLabel* label1 = new QLabel(this);
}
aber es passiert nix, bzw. seh ich zumindest nichts.
Antworten