Generierte Signale & Slots von Designer nirgends zu find
Generierte Signale & Slots von Designer nirgends zu find
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.
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;)
Schau doch mal in die ui_xxx.h rein.
Da steht dann soetwas:
weiterhin kannst dir ja auch mal deinen Src der ui anschauen. Das is nix anderes als ein XML.... hier mal ein Auszug von mir:
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...
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>3. hast kommerz oder freie Version?
4. nicht das ich wüsste aber es gibt ebooks zu qt...
Re: Generierte Signale & Slots von Designer nirgends zu
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).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!?!?
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
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.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"?
Ausserdem darauf achten, dass Signal sowie Slot a) die exakt gleichen Parameter erwarten, und b) im Connect-Aufruf keine Parameternamen abgegeben werden.
Die generierte Datei hat den namen moc_[mein-designer-name].cpp bzw. entsprechend moc_[mein-designer-name].o.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?
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);
- 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
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:
Nun guckt euch mal das Bild an

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:
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!
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()\"");
}

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()\"");
}
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?
- slotfehlt.jpg (34.34 KiB) 5859 mal betrachtet
Feel free to help everyone, even me;)
-
Ginsengelf
- Beiträge: 79
- Registriert: 2. Mai 2007 10:21
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).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.
Ginsengelf
Ist also doch irgendetwas falsch bei mir?pfid hat geschrieben:... Die Klasse, der du im Designer den Slot "slot1" hinzufügst, ist nicht QMainWindow sondern die UI Klasse.
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;)
Du könntest so erben:Oekel hat geschrieben:Ist also doch irgendetwas falsch bei mir?pfid hat geschrieben:... Die Klasse, der du im Designer den Slot "slot1" hinzufügst, ist nicht QMainWindow sondern die UI Klasse.
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?
Code: Alles auswählen
class Foo : public QMainWindow, private Ui::Foo
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.
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, einfranzf 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.
Code: Alles auswählen
void on_[widget name]_[signal]();
DANKE
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
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;)