Signals and Slots ... warum gehts denn nicht?

Alles rund um die Programmierung mit Qt
Antworten
download123
Beiträge: 6
Registriert: 22. Mai 2006 23:14

Signals and Slots ... warum gehts denn nicht?

Beitrag von download123 »

Ich habe jetz mla mit dem designer ein main window erstellt...
mit einem Button, und wollte das beim klicken eine funktion der klasse aufgerufen wird... umgesetzt so

Code: Alles auswählen

class Ui_Login_w : public QObject
{
public:
bool test;
....
    QPushButton *pushButton;
....
    void setupUi(QMainWindow *Login_w)
    {
        test=false;
......
        QObject::connect(pushButton, SIGNAL(clicked()), this, SLOT(Click_Connect()));
     }
....
public slots:

        void Click_Connect()
        {
            connected = true;//wert neu setzen
        }
}




Aber irgendwie gehts nicht ... die variable bleibt auf false :-(

was ist falsch...

[da wo punkte sind ist anderer Code dazwischen, der aber nicht von belang ist (design des fensters)]
Querdenker
Beiträge: 99
Registriert: 1. Dezember 2005 17:44
Wohnort: Karlsruhe

Beitrag von Querdenker »

Hi,

du musst dem MOC ja auch was zum schaffen geben. Das tut der aber nur, wenn Du in der Klasse ein Q_OBJECT eingibst.

lass Ui_Login_w : public QObject
{
Q_OBJECT

public:
bool test;
....
QPushButton *pushButton;
....
void setupUi(QMainWindow *Login_w)
{
test=false;
......
QObject::connect(pushButton, SIGNAL(clicked()), this, SLOT(Click_Connect()));
}
....
public slots:

void Click_Connect()
{
connected = true;//wert neu setzen
}
}

damit weiß MOC, dass diese Klasse Slots und Signals verwendet und bindet den Code dazu ein. Ein bloßes erben von QObject reicht nicht aus.
e Grüssle au
Q... ;)
download123
Beiträge: 6
Registriert: 22. Mai 2006 23:14

Beitrag von download123 »

Vielen dank für die schnelle hilfe...

allerding hab ich immernoch ein problem ... nämlich den linker error der jetzt kommt :-(

Code: Alles auswählen

.objs\main.o:main.cpp:(.text$_ZN10Ui_Login_wC1Ev[Ui_Login_w::Ui_Login_w()]+0x20): undefined reference to `vtable for Ui_Login_w'
collect2: ld returned 1 exit status
es hat scheinbar was mit dem Q_OBJECT zu tun weil wenn ich es auskommentiere ist der error weg
Eltharion
Beiträge: 74
Registriert: 4. Mai 2006 14:42
Wohnort: Magdeburg
Kontaktdaten:

Beitrag von Eltharion »

Schreibst Du die Makefiles zufällig per Hand? Ich tippe mal drauf, dass der vom moc erzeugte C++-Quelltext nicht mit eingelinkt wird. moc erzeugt doch irgendwo eine C++-Datei. Kannst Du die einfach mal in Deiner Klasse mit inkluden? Dann weisst Du, ob's daran liegt. Oder nimm die von qmake erstellten Makefiles. Da wird der moc-Code automatisch mit übersetzt und verlinkt.

E*
Querdenker
Beiträge: 99
Registriert: 1. Dezember 2005 17:44
Wohnort: Karlsruhe

Beitrag von Querdenker »

Hi,

das war fast klar ;)
Du musst natürlich auch eine neue ProjektFile anlegen.
e Grüssle au
Q... ;)
download123
Beiträge: 6
Registriert: 22. Mai 2006 23:14

Beitrag von download123 »

Also .. ich schreibe makefiles nicht per hand ich benutze Code::Blocks [ging bisher sehr gut]

ich weiß leider nicht genau was du meinst ... benutze qt noch nicht lange...

ich habe mal den completten code der classe hochgeladen

http://pastebin.com/735241
Querdenker
Beiträge: 99
Registriert: 1. Dezember 2005 17:44
Wohnort: Karlsruhe

Beitrag von Querdenker »

Hi,

ich meinte mit neuer Projektdatei erstellen:

ShellPrompt>qmake -project
ShellPrompt>qmake verzeichnisname.pro
ShellPrompt>make

dann dürfte der make des MOC mitkommen.
Ich verwende Relo als Entwickungstool und kompiliere per Command Line mit dem MinGW.

Dein uploaded Beispiel dürfte kaum eine Klassendefinition darstellen und auch keine Implementierung einer solchen. Da ist was durcheinander gekommen - oder?
e Grüssle au
Q... ;)
download123
Beiträge: 6
Registriert: 22. Mai 2006 23:14

Beitrag von download123 »

eigentlich nicht....

es ist das was ich rauskriege wenn ich ein qtdesignerfile (.ui) mit der console und dem uic befehl in source verwandeln lasse....

ja eigentlich gehöhrt sich das nicht.... aber imprinzip ist das eine Klassendefinition in der gleich der Code der Klassen mit drin ist

ich habe das projekt schon mehrfach neu compiliert...[alles bis auf den Source gelöscht und neu erstellen lassen]

Ich habe beim Compilieren generell probleme mit dem
Q_OBJECT
es erzeugt
undefined references... muss ich irgendwelche speziellen libarys linken?

momentan gelinkt ist [ in dieser Reihenfolge]

libQt3Support4.a
libQtAssistantClient.a
libQtCore4.a
libQtDesigner4.a
libQtDesignerComponents4.a
libQtGui4.a
libqtmain.a
libQtNetwork4.a
libQtOpenGl4.a
libQtSql4.a
libQtXml4.a
Querdenker
Beiträge: 99
Registriert: 1. Dezember 2005 17:44
Wohnort: Karlsruhe

Beitrag von Querdenker »

ah so,

ne, mit Designern habe ich nichts am Hut (Gibt nur Ärger und Verdruß wenn man deren Wirkungsweise nicht wirklich versteht - oder die Designer glauben umzusetzen, was gemeint sein könnte).

self made ist die Devise und ist wesentlich schneller als sich mit Designer-Results herum zu ärgern ;)
e Grüssle au
Q... ;)
download123
Beiträge: 6
Registriert: 22. Mai 2006 23:14

Beitrag von download123 »

ich habe ja zwischendurch auch einfach mal so ne slotklasse versucht...

sobald
Q_OBJECT
auftrit bekomme ich den linkerfehler

[habe das beispiel aus der dokumentation genommen]
Eltharion
Beiträge: 74
Registriert: 4. Mai 2006 14:42
Wohnort: Magdeburg
Kontaktdaten:

Beitrag von Eltharion »

Lade den letzten Versuch einfach mal hoch. Die slot-Klasse, das main() und die .pro Datei. Sonst können wir auch nur raten. Dein problem hat tatsächlich was mit dem Q_OBJECT tu tun und egal wo Du es anpackst, das musste Du erstmal lösen. Danach wird auch der aus der UI-Datei erzeugte Quelltext laufen. Hoffe ich einfach mal.

E*
Antworten