Eigener SLOT funktioniert nicht

Alles rund um die Programmierung mit Qt
mischa
Beiträge: 12
Registriert: 29. Mai 2007 22:57

Eigener SLOT funktioniert nicht

Beitrag 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.
heikob
Beiträge: 81
Registriert: 23. März 2005 23:20

Beitrag 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]
mischa
Beiträge: 12
Registriert: 29. Mai 2007 22:57

Beitrag 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]
heikob
Beiträge: 81
Registriert: 23. März 2005 23:20

Beitrag 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.
nexus
Beiträge: 75
Registriert: 14. Oktober 2006 19:24

Beitrag 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();
}; 
heikob
Beiträge: 81
Registriert: 23. März 2005 23:20

Beitrag von heikob »

Sorry, Fehler von mir, änder mal

Code: Alles auswählen

class Qttest: public QWidget 
 { 
       private: 
      ...
in

Code: Alles auswählen

class Qttest: public QWidget 
 { 
      Q_OBJECT
       private: 
       ...
dann müsste es besser funktionieren

Gruß
HeikoB
heikob
Beiträge: 81
Registriert: 23. März 2005 23:20

Beitrag von heikob »

Da war jetzt jemand schneller :o

[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]
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Das ';' ist nicht notwendig, es schadet aber auch nicht, wenns vorhanden ist.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

upsala hat geschrieben:es schadet aber auch nicht, wenns vorhanden ist.
Ich denke gcc mit "-fpendantic" beschwert sich darüber
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
mischa
Beiträge: 12
Registriert: 29. Mai 2007 22:57

Beitrag 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.
Zandru
Beiträge: 84
Registriert: 29. Mai 2007 15:35

Beitrag 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
mischa
Beiträge: 12
Registriert: 29. Mai 2007 22:57

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
mischa
Beiträge: 12
Registriert: 29. Mai 2007 22:57

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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)
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten