Seite 1 von 2
Eigener SLOT funktioniert nicht
Verfasst: 29. Mai 2007 23:13
von mischa
Hallo,
die Frage ist vielleicht blöd aber ich mache erst seit gestern Qt.
Ich habe mir einen Button, TextEdit und eigenen SLOT gemacht
test.h
...
QTextEdit qtextedit;
private slots:
void Qttest::b_save_click()
{
qtextedit.setText("hallo");
}
...
test.cpp
QPushButton *b_save=new QPushButton("save",this);
qtextedit.setParent(this);
connect(b_save, SIGNAL(clicked()), this, SLOT(b_save_click()));
...
Aber wenn ich auf den Button klicke erscheint der Text nicht im Textfenster. Ich habe keine Ahnung was da nicht funktioniert. Hoffe ihrkönnt mir helfen.
Verfasst: 30. Mai 2007 00:06
von heikob
Hallo,
so ganz verstehe ich deinen Quelltext nicht. Was macht das " Qttest::" im Header? Das er das überhaupt kompiliert. Auch ansonsten ist mir nicht alles klar. Vielleicht postest du besser nochmal den kompletten Quellcode. Und am Besten im "Code-Tag", denn dann kann man ihn besser lesen. Dann klappt das auch besser mit der Fehlersuche
HeikoB[/code]
Verfasst: 30. Mai 2007 00:30
von mischa
gut war etwas unklar
qttest.h
Code: Alles auswählen
#include <QTextEdit>
#include <QPushButton>
#include <QApplication>
#include <QWidget>
class Qttest: public QWidget
{
private:
QTextEdit qtextedit;
public:
Qttest(QWidget *parent=0);
virtual ~Qttest();
private slots:
void b_save_click();
};
qttest.cpp
Code: Alles auswählen
#include "qttest.h"
Qttest::Qttest()
{
qtextedit.setParent(this);
QPushButton *b_save= new QPushButton("save",this);
connect(b_save,SIGNAL(clicked()), this, SLOT(b_save_click()));
}
Qttest::~Qttest()
{}
void Qttest::b_save_click()
{
qtextedit.setText("hallo");
}
[/code]
Verfasst: 30. Mai 2007 00:42
von heikob
Servus,
was passierst, wen du aus deinem "private slot" ein "public slot" machst? Ich muss gestehen, ich glaube ich habe noch nie einen private Slot genutzt, da ich sowas dann in der Regel über Funktionsaufrufe nutze. Daher kann ich jetzt nicht mit absoluter Sicherheit sagen kann, ob es daran liegt. Allerdings fällt mir im Moment nichts weiteres ein, woran dein Problem liegen könnte.
Verfasst: 30. Mai 2007 00:51
von nexus
Du hast vergessen das Q_OBJECT Macro anzugeben. Dies musst du immer machen, wenn du mit Signals und Slots arbeitest.
Code: Alles auswählen
class Qttest: public QWidget
{
Q_OBJECT;
private:
QTextEdit qtextedit;
public:
Qttest(QWidget *parent=0);
virtual ~Qttest();
private slots:
void b_save_click();
};
Verfasst: 30. Mai 2007 00:52
von heikob
Sorry, Fehler von mir, änder mal
in
dann müsste es besser funktionieren
Gruß
HeikoB
Verfasst: 30. Mai 2007 00:53
von heikob
Da war jetzt jemand schneller
[edit]
Sollte das ; nach Q_OBJECT wirklich sein? Ich mache es immer ohne. Hat das irgend einen Vorteil von dem ich noch nichts erfahren habe?
[/edit]
Verfasst: 30. Mai 2007 09:05
von upsala
Das ';' ist nicht notwendig, es schadet aber auch nicht, wenns vorhanden ist.
Verfasst: 30. Mai 2007 09:29
von Christian81
upsala hat geschrieben:es schadet aber auch nicht, wenns vorhanden ist.
Ich denke gcc mit "-fpendantic" beschwert sich darüber
Verfasst: 30. Mai 2007 14:38
von mischa
Wenn ich das Q_OBJECT rein schreibe krieg ich Linker Errors

Ich benutze Devc++ und free QT unter Windows.
Kleine Frage, wie funktioniert den connect(). Es muss ja irgend wie auf der Message Arhetiktur von der WinApi aufbauen aber wie ist es programmiertechnich gemacht. Öffnet es einen thread in dem PickMessage() drin steht oder modifiziert es generisch den WindowsProducer.
Verfasst: 30. Mai 2007 14:43
von Zandru
dann "moc"st du das file nicht. moc ist der "meta-object-compiler" der die notwendigen Meta-Informationen die für signal-slot gebraucht werden erzeugt.
http://doc.trolltech.com/4.3/moc.html#moc
Verfasst: 30. Mai 2007 15:15
von mischa
da steht ja das wenn ich mit qmake meine makefiles mache brauch ich das moc nicht selber aufzurufen. ich hab die makefiles mit qmake gemacht aber krieg trotzdem linker fehler
Verfasst: 30. Mai 2007 15:24
von Christian81
Dann ist dein pro-File falsch (HEADERS += qttest.h vergessen) und / oder du hast qmake nach dem Einfügen von Q_OBJECT nicht wieder aufgerufen.
Verfasst: 30. Mai 2007 16:20
von mischa
die headers sind alle da, wenn ich das Q_OBJECT weglasse läufts aber wenn ich das nicht einfüge gehts nicht mehr.Ich hab das qmake gestartet nachdem ich das Q_OBJECT eingefügt habe
Verfasst: 30. Mai 2007 16:33
von Christian81
mischa hat geschrieben:Ich hab das qmake gestartet nachdem ich das Q_OBJECT eingefügt habe
Das glaube ich nicht sonst würde es gehen. Zeig uns mal deine pro-Datei bzw. den kompletten Code (als Anhang)