Seite 1 von 2

QLabel zur Laufzeit erstellen

Verfasst: 8. April 2008 11:15
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?

Verfasst: 8. April 2008 11:17
von PeterLustig
Ist das die gesamte Fehlermeldung? Poste evtl. mal deine Klassendefinition.

Verfasst: 8. April 2008 11:24
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

Verfasst: 8. April 2008 12:09
von Flachkoepper
label1 = new QLabel(this);

Verfasst: 8. April 2008 13:24
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.

Verfasst: 8. April 2008 14:04
von PeterLustig
gerome, er bindet doch QLabel ein.. genauer schauen bitte. :) Und der Fehler wurde im Post vor dir genannt, hab ich glatt übersehen..

Verfasst: 9. April 2008 11:22
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").

Verfasst: 9. April 2008 12:14
von Christian81
Dafür gibts einen Debugger...

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

Verfasst: 9. April 2008 12:30
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

Verfasst: 9. April 2008 13:08
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.

Verfasst: 9. April 2008 14:07
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.

Verfasst: 9. April 2008 15:04
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.

Verfasst: 9. April 2008 15:12
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 ;)

Verfasst: 9. April 2008 15:14
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...

Verfasst: 9. April 2008 16:10
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.