Forum: PC-Programmierung QT: Objektzugriff von einem anderem Obejekt aus


von Loopy (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
ich habe eine GUI mit QT gestaltet.
In der GUI gibt es ein selbsterstelltes Objekt (Picdisplay), das Bilder 
anzeigt, dieses Objekt soll den Text eines Labels (Label) ändern können. 
Die zwei Objekte kennen sich nicht.
(Mit ui->Label->setText(„Test“) geht es nicht).
Wie kann ich die 2 Objekte bekannt machen, so, dass das Bildobjekt den 
Text auf das Label schreiben kann.

Vielen Dank im Voraus.

von Karl H. (kbuchegg)


Lesenswert?

Loopy schrieb:
> Hallo,
> ich habe eine GUI mit QT gestaltet.
> In der GUI gibt es ein selbsterstelltes Objekt (Picdisplay), das Bilder
> anzeigt, dieses Objekt soll den Text eines Labels (Label) ändern können.
> Die zwei Objekte kennen sich nicht.
> (Mit ui->Label->setText(„Test“) geht es nicht).
> Wie kann ich die 2 Objekte bekannt machen, so, dass das Bildobjekt den
> Text auf das Label schreiben kann.

So wie das in QT vorgesehen ist.
Das eine Objekt sendet ein Signal aus, das andere hat einen Slot, in dem 
es das Signal auffängt.

Auf deutsch: Das Picdisplay brüllt in den Raum "Ich hab da was". Und 
unter anderem reagiert dein Label (da wirst du dir noch eine Klasse 
dafür machen müssen) auf diesen ungerichteten Zuruf.

von Loopy (Gast)


Lesenswert?

Hallo,
ich habe es schon mit connect probiert, aber da kommt bei Visual Studio 
immer die Fehlermeldung, wenn ich ein Signal definieren will:

" fatal error LNK1169: Mindestens ein mehrfach definiertes Symbol 
gefunden "

Als normale void Funktion kommt allerdings keine Fehlermeldung.

von raute (Gast)


Lesenswert?

Wo ist der Quellcode? Ruhig ein Minimalbeispiel, wo der Fehler aber auch 
auftritt.

Ansonsten:
Das connect muss in einer Ebene sein, wo beide Objekte bekannt sind.

Bsp:
picdisplay und label werden in der main.cpp erzeugt, also kannst hier 
mit dem connect-Befehl eine Verbindung herstellen.
1
QObject::connect(picdisplay, SIGNAL(setLabel(QString)),
2
                 label,SLOT(getLabel(QString)));

Für Signals-Slots musst du in der Klassen-Definitonen noch Q_OBJECT mit 
einpflegen.
Das steht aber auch alles in der "QObject Class Reference" im "Qt 
Assistant" drin. Wenn das Q_OBJECT gefehlt hat, ruhig einen qmake-Befehl 
mal abfeuern, wobei ich nie mit VS in Verbindung mit Qt gearbeitet habe.
Der QtCreator ist mir da viel sympatischer.

Ansonsten, ein Signal wird nur deklariert, es ist ja nur ein Funktions- 
bzw. Methoden-Prototyp!
Siehe "Signals & Slots" widerrum im "Qt Assistant".
Aber ohne (Minimal-)Beispiel wird hier eh nur intensivst geraten. ;-)

von Loopy (Gast)


Lesenswert?

Hallo,
Danke hat geklappt :-)

Vielen Dank.

von Andreas M. (amesser)


Lesenswert?

raute schrieb:
>
1
QObject::connect(picdisplay, SIGNAL(setLabel(QString)),
2
                  label,SLOT(getLabel(QString)));

setText() von QLabel ist übrigens ein Slot, also kann man sich
das schreiben der Funktion getLabel auch sparen:
1
QObject::connect(picdisplay, SIGNAL(setLabel(const QString&)),
2
                 label,SLOT(setText(const QString&)));

von Georg Simon (Gast)


Lesenswert?

Mann kann auch ein Signal, z.B. einen button.clicked als Signal per 
connect re-emittieren..

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.