Generierte Signale & Slots von Designer nirgends zu find

Alles rund um die Programmierung mit Qt
Antworten
Oekel
Beiträge: 7
Registriert: 23. Dezember 2008 00:57
Kontaktdaten:

Generierte Signale & Slots von Designer nirgends zu find

Beitrag von Oekel »

Hi,
ich bin neu habe jedoch sowohl google, das Qt-Designer-Manual als auch die Suche hier genuttz und gelesen.
Einige Beiträge sind sehr ähnlich wie meine, jedoch konne ich keines mit einer Lösung finden.

Mein System:
Vista 64Bit
Java32+Java64 (1.6)
Eclipse 3.4.1
MinGW 5.1.4
Qt 4.4.3
Benuzte das DesignerPlugin für Eclipse

Mein Wissensstand:
habe mich mit dem Signal und Slot Prinzip vertraut gemacht und dieses auch verstanden.
C++ Basics (Consolenprogrammierung)
Java (sehr gute Kenntnisse)

Mein Problem:
Ich habe mich für komplizierte GUI-Strukturen entschieden und WILL mit den Designer arbeiten. (Ohne funktioniert alles)

-Erstelle ich ein neues Qt-GUI Projekt in Eclipse -nennen wir es "TestDesigner03" so erhalte ich 5 Dateien im selbigen verzeichniss, die ähnlich lauten

+main.cpp
-testdesigner03.cpp
-testdesigner03.h
-TestDesigner03.pro
-testdesigner03.ui
-ui_testdesigner03.h

1.Wenn ich den Designer richtig verstanden habe, dann kann ich dort unter einem Rechtsklick in das neue Fenster "Signale/Slots von Frame" ändern und hinzufügen.
Frame sollte ja meine Hauptinstanz sein, die ich in testdesigner03.cpp wiederfinde, oder nicht?
jedenfalls erstelle ich auf diesem Frame einen neuen Slot und ein neues Signal. Verbinde diese beide mit irgendetwas (z.B. Button oder auch untereinander) und speiere alles.

Nun würde ich erwarten, dass in irgendeiner von den obigen Dateien eine Codezeile mit "Slots" zu finden sein sollte, damit ich dort oder in einer erbenden Klasse meine ganz eigenen Ideen verwirklichen kann.
Dies ist nicht der Fall!?!?

===========================
2. Das ganze mal andersherum
Baue ich nun etwas lustiges in der testdesigner03.cpp und definiere in der testdesigner03.h meine slots und signale und verbinde diese in der testdesigner03.cpp mittels connect, so funktioniere diese auch nicht.
Erst wenn ich dann wieder im Designfenster GENAU die gleichen beiden Slots und Signale, wie unter 1. erklärt einfüge, dann läuft das Programm wie es soll.
Das Kann doch nicht der Sinn der Sache sein, oder?
Wie bekomme ich das ganze "Backwardskompatibel"?

3. Laut Manual sollte er mir doch auch die testdesigner03.cpp ständig überschreiben , oder ist schon wieder ein neues Vorgehen implementiert worden? Muss ich evtl. den uic in eclipse manuell starten? Ist dieser denn richtig konfiguriert, wenn ich am Ende doch bisher eine funktionierende exe raus bekomme?

Wäre euch sehr verbunden, wenn ihr mir einige Antworten geben könntet.
Vielen Dank und schöne Feiertage!

PS: 4. gibt es irgendwo eine Übersetzung des Qt Handbuches, falls ich dem Englisch doch nicht so mächtig bin, wie ich bisher dachte, würde ich dieses gerne noch ein drittes Mal in deutsch lesen.
Feel free to help everyone, even me;)
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

Schau doch mal in die ui_xxx.h rein.

Da steht dann soetwas:

Code: Alles auswählen

    QMetaObject::connectSlotsByName(ClassNaem);

weiterhin kannst dir ja auch mal deinen Src der ui anschauen. Das is nix anderes als ein XML.... hier mal ein Auszug von mir:

Code: Alles auswählen

<connections>
  <connection>
   <sender>checkModell</sender>
   <signal>toggled(bool)</signal>
   <receiver>cbModellTypen</receiver>
   <slot>setEnabled(bool)</slot>
   <hints>
    <hint type="sourcelabel" >
     <x>214</x>
     <y>303</y>
    </hint>
    <hint type="destinationlabel" >
     <x>308</x>
     <y>304</y>
    </hint>
   </hints>
  </connection>
 </connections>
Zu 2. dann schau dir doch mal an was das connect zurückliefert..... Scheint da das connect nicht zu klappen. Evtl schmeisst dir dein Compiler auch was in die std::out raus (Compilerausgabe oder Console)

3. hast kommerz oder freie Version?

4. nicht das ich wüsste aber es gibt ebooks zu qt...
pfid
Beiträge: 535
Registriert: 22. Februar 2008 16:59

Re: Generierte Signale & Slots von Designer nirgends zu

Beitrag von pfid »

Oekel hat geschrieben: 1.Wenn ich den Designer richtig verstanden habe, dann kann ich dort unter einem Rechtsklick in das neue Fenster "Signale/Slots von Frame" ändern und hinzufügen.
Frame sollte ja meine Hauptinstanz sein, die ich in testdesigner03.cpp wiederfinde, oder nicht?
jedenfalls erstelle ich auf diesem Frame einen neuen Slot und ein neues Signal. Verbinde diese beide mit irgendetwas (z.B. Button oder auch untereinander) und speiere alles.

Nun würde ich erwarten, dass in irgendeiner von den obigen Dateien eine Codezeile mit "Slots" zu finden sein sollte, damit ich dort oder in einer erbenden Klasse meine ganz eigenen Ideen verwirklichen kann.
Dies ist nicht der Fall!?!?
Habe noch nie im Designer Signale und Slots erstellt, daher bin ich hier keine Große Hilfe. Was du mit "Frame" meinst, was ich spontan auch nicht (idR ist deine "Hauptinstanz" eine Klasse, die von QWidget oder z.b. QMainWindow oder QDialog abgeleitet ist).
Hast du aber eine eigene Klasse, deren UI du im Designer erstellt hast, musst du in der Klassendefinition das Marko Q_OBJECT setzen, damit Signale/Slots funktionieren.
http://doc.trolltech.com/4.4/signalsand ... ll-example
Oekel hat geschrieben: 2. Das ganze mal andersherum
Baue ich nun etwas lustiges in der testdesigner03.cpp und definiere in der testdesigner03.h meine slots und signale und verbinde diese in der testdesigner03.cpp mittels connect, so funktioniere diese auch nicht.
Erst wenn ich dann wieder im Designfenster GENAU die gleichen beiden Slots und Signale, wie unter 1. erklärt einfüge, dann läuft das Programm wie es soll.
Das Kann doch nicht der Sinn der Sache sein, oder?
Wie bekomme ich das ganze "Backwardskompatibel"?
Hier gilt das gleiche wie bei 1., du brauchst das Q_OBJECT Makro in deiner Klasse. Ausserdem schalte den Konsolenoutput ein, dort siehst du wenn ein Connect fehlschlägt. Ausserdem solltest du den Rückgabewert von connect prüfen, obs überhaupt geklappt hat.
Ausserdem darauf achten, dass Signal sowie Slot a) die exakt gleichen Parameter erwarten, und b) im Connect-Aufruf keine Parameternamen abgegeben werden.
Oekel hat geschrieben: 3. Laut Manual sollte er mir doch auch die testdesigner03.cpp ständig überschreiben , oder ist schon wieder ein neues Vorgehen implementiert worden? Muss ich evtl. den uic in eclipse manuell starten? Ist dieser denn richtig konfiguriert, wenn ich am Ende doch bisher eine funktionierende exe raus bekomme?
Die generierte Datei hat den namen moc_[mein-designer-name].cpp bzw. entsprechend moc_[mein-designer-name].o.

Tip:

- bau die Signale/Slots nicht im Designer
- für Signale, die Qt-Widgets bereits mitbringen (z.b. void clicked(bool) von QPushButton), packst du einfach das hier in deine Klassendefinition:

Code: Alles auswählen

...
   public slots:
      void on_pushButton[MyName]_clicked(bool checked);
Den Connect macht dir Qt dann automatisch.

- das Q_OBJECT Makro brauchst du weiterhin
- für alle Signale, die du selbst erstellen wilslt, fummelst du entweder weiter im Designer rum, oder schreibst die 2 Zeilen Code kurz selbst in deine Dateien ;)
Oekel
Beiträge: 7
Registriert: 23. Dezember 2008 00:57
Kontaktdaten:

Beitrag von Oekel »

Hi,
erstmal Danke für die schnelle Antwort von euch beiden.
Aber ich denke das beschreibt man Problem noch nicht ganz.

1. Ich weiß sehr wohl, was ich tun muss, damit slots funktionieren und ich habe das besagte Makro "Q_OBJECT" bei mir standardgemäß drin.

ich poste einfach mal meinen minimalCode:

Code: Alles auswählen

#ifndef TESTDESIGNER03_H
#define TESTDESIGNER03_H

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

class TestDesigner03 : public QMainWindow
{
    Q_OBJECT

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

private:
    Ui::TestDesigner03Class ui;

signals:
    void signal1();

public slots:
    void slot1();
};

#endif // TESTDESIGNER03_H

Code: Alles auswählen

#include "testdesigner03.h"

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

    }

TestDesigner03::~TestDesigner03()
    {

    }

void TestDesigner03::slot1()
	{
	printf("Dies ist das \"slot1()\"");
	}
Nun guckt euch mal das Bild an
Bild

Der Code funktioniert so lange nicht, bis ich dort unter Edit ein "slot1()" hinzugüge und im Designer verbinde oder die cpp folgendermaßen ergänze:

Code: Alles auswählen

#include "testdesigner03.h"

TestDesigner03::TestDesigner03(QWidget *parent) :
    QMainWindow(parent)
    {
    ui.setupUi(this);
    connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(slot1()));

    }

TestDesigner03::~TestDesigner03()
    {

    }

void TestDesigner03::slot1()
	{
	printf("Dies ist das \"slot1()\"");
	}
Das muss doch auch automatisch gehen!!
Also entweder, dass er mir den Methodenstumpf im quellcode erzeugt, nachdem ich einen "slot1" im Designer gebaut habe, oder dass er mir die ergänzten Methoden aus dem quellcode im Designer anzeigt.

Bitte nochmals um Hilfe!
Dateianhänge
wo ist er?
wo ist er?
slotfehlt.jpg (34.34 KiB) 5867 mal betrachtet
Feel free to help everyone, even me;)
Ginsengelf
Beiträge: 79
Registriert: 2. Mai 2007 10:21

Beitrag von Ginsengelf »

Das muss doch auch automatisch gehen!!
Also entweder, dass er mir den Methodenstumpf im quellcode erzeugt, nachdem ich einen "slot1" im Designer gebaut habe, oder dass er mir die ergänzten Methoden aus dem quellcode im Designer anzeigt.
Moin, ich glaube nicht, dass der Designer das kann, weil er mit dem Quellcode überhaupt nichts anstellt, sondern nur innerhalb seiner xyz.ui arbeitet (und das ist auch gut so, sonst wirft dir das Ding nur deinen Code durcheinander).

Ginsengelf
pfid
Beiträge: 535
Registriert: 22. Februar 2008 16:59

Beitrag von pfid »

Du erbst von QMainWindow. QMainWindow hat keinen Slot "slot1". Die Klasse, der du im Designer den Slot "slot1" hinzufügst, ist nicht QMainWindow sondern die UI Klasse.
Oekel
Beiträge: 7
Registriert: 23. Dezember 2008 00:57
Kontaktdaten:

Beitrag von Oekel »

pfid hat geschrieben:... Die Klasse, der du im Designer den Slot "slot1" hinzufügst, ist nicht QMainWindow sondern die UI Klasse.
Ist also doch irgendetwas falsch bei mir?

Wie bereits oben geschrieben habe ich:
+main.cpp
-testdesigner03.cpp
-testdesigner03.h
-TestDesigner03.pro
-testdesigner03.ui
-ui_testdesigner03.h <--soll ich etwa von einem Header erben?
Feel free to help everyone, even me;)
pfid
Beiträge: 535
Registriert: 22. Februar 2008 16:59

Beitrag von pfid »

Oekel hat geschrieben:
pfid hat geschrieben:... Die Klasse, der du im Designer den Slot "slot1" hinzufügst, ist nicht QMainWindow sondern die UI Klasse.
Ist also doch irgendetwas falsch bei mir?

Wie bereits oben geschrieben habe ich:
+main.cpp
-testdesigner03.cpp
-testdesigner03.h
-TestDesigner03.pro
-testdesigner03.ui
-ui_testdesigner03.h <--soll ich etwa von einem Header erben?
Du könntest so erben:

Code: Alles auswählen

class Foo : public QMainWindow, private Ui::Foo
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Auch wenn es auf den ersten Blick praktisch erscheint, das alles über den Designer zu machen, bedenke bitte, dass das mit der Zeit wohl recht unübversichtlich wird.
Wenn du andere Klassen erstellst, und sich die definition der Slots im UI befinden, und du nachschauen willst, wie die jetzt genau heißen, musst du erst den Designer anwerfen.
So eine Zeile für ein connect ist wirklich alles andere als kompliziert und lang.

Und schau dich mal bei kde um, was wirklcih mächtig vom Umfang ist, da werden die connects auch händisch gemacht.
pfid
Beiträge: 535
Registriert: 22. Februar 2008 16:59

Beitrag von pfid »

franzf hat geschrieben:Auch wenn es auf den ersten Blick praktisch erscheint, das alles über den Designer zu machen, bedenke bitte, dass das mit der Zeit wohl recht unübversichtlich wird.
Wenn du andere Klassen erstellst, und sich die definition der Slots im UI befinden, und du nachschauen willst, wie die jetzt genau heißen, musst du erst den Designer anwerfen.
So eine Zeile für ein connect ist wirklich alles andere als kompliziert und lang.

Und schau dich mal bei kde um, was wirklcih mächtig vom Umfang ist, da werden die connects auch händisch gemacht.
Man muss die connects noch nichtmal machen. Wie gesagt, ein

Code: Alles auswählen

void on_[widget name]_[signal]();
im Header und schon funktionierts. Kein Designergefummel usw. . Manuelles connect brauchst du halt dann, wenn du deine Widgets nicht im Designer zusammenklickst, oder du mehrere connects oder explizit andere Slots brauchst.
Oekel
Beiträge: 7
Registriert: 23. Dezember 2008 00:57
Kontaktdaten:

DANKE

Beitrag von Oekel »

Hi,

also ich habe viel gelernt aus euren Beiträgen und werde es mir nun angewöhnen per Hand zu machen, um mehr Struktur rein zu bringen. Aber auch die anderen Tipps haben mich auf gute Ideen gebraucht.

Euch allen dann ein frohes Fest und nicht allzu viel Stress mit Neulingen im neuen Jahr!

cherio
Feel free to help everyone, even me;)
Antworten