Anzeige:
Ergebnis 1 bis 10 von 10

Thema: QT: Signals and slots

  1. #1
    Registrierter Benutzer
    Registriert seit
    04.10.2003
    Beiträge
    11

    QT: Signals and slots

    Hallo, ich bin C++ neuling und habe ein problem mit QT.
    Ich möchte eine GUI machen, wie das geht habe ich nun herausgefunden.
    Nun möchte ich machen das etwas passiert wenn ich auf einen button klicke, und zwar in meinem fall, dass der inhalt von textfeld a ins textfeld b kopiert wird.
    hier der code:
    Code:
    #include <qapplication.h>
    #include <qpushbutton.h>
    #include <qtextedit.h>
    #include <qwidget.h>
    
    class Gui : public QWidget
    {
    private:
     QTextEdit * text;
     QTextEdit * trans;
    public:
        Gui( QWidget *parent=0, const char *name=0 );
    public slots:
        void convert();
    };
    
    void Gui::convert()
    {
      trans->setText(text->text());  
    }
    
    Gui::Gui( QWidget *parent, const char *name )
            : QWidget( parent, name )
    {
        setMinimumSize( 400, 200 );
        setMaximumSize( 400, 200 );
        
        text = new QTextEdit(this, "text");
        trans = new QTextEdit(this, "text");
        QPushButton * convert = new QPushButton( "Convert", this );
        
        convert->setGeometry( 100, 150, 50, 30 );
        connect( convert, SIGNAL(clicked()), this, SLOT(convert()) );
        
        text->setTextFormat(Qt::PlainText);
        text->setGeometry( 1, 1, 180, 100 );
        
        trans->setTextFormat(Qt::PlainText);
        trans->setGeometry( 190, 1, 180, 100 );
        }
    
    
    int main( int argc, char **argv )
    {
        QApplication a( argc, argv );
        
        Gui gui;
        gui.setGeometry( 100, 100, 200, 120 );
        a.setMainWidget( &gui );
        gui.show();
        
        return a.exec();
    }
    ich bekommen als fehler folgendes:
    QObject::connect: No such slot QWidget::convert()
    QObject::connect: (sender name: 'unnamed')
    QObject::connect: (receiver name: 'unnamed')


    Warum?

  2. #2
    Registrierter Benutzer Avatar von BlueJay
    Registriert seit
    27.08.2004
    Beiträge
    825
    Zitat Zitat von Asraniel
    public slots:
    void convert();
    ein Slot namens convert, fein.

    Gui::Gui( QWidget *parent, const char *name )
    : QWidget( parent, name )
    Gib dem Kerlchen mal seinen Namen, damit man weiss, ob die Beschwerde von ihm kommt.

    text = new QTextEdit(this, "text");
    trans = new QTextEdit(this, "text");
    QPushButton * convert = new QPushButton( "Convert", this );
    Nun haben wir 2x denselben Namen in derselben Klasse. Wenn das mal gutgeht!

    so long,
    BlueJay

  3. #3
    Registrierter Benutzer
    Registriert seit
    04.10.2003
    Beiträge
    11
    danke :-) geht zwar noch immer nicht.. aber egal. Das ist mein neuster versuch

    Code:
    #include <qapplication.h>
    #include <qpushbutton.h>
    #include <qtextedit.h>
    #include <qwidget.h>
    
    class Gui : public QWidget
    {
    private:
     QTextEdit * text;
     QTextEdit * trans;
    public:
        Gui( QWidget *parent=0, const char *name=0 );
    public slots:
        void convert();
    };
    
    void Gui::convert()
    {
      trans->setText(text->text());  
    }
    
    Gui::Gui( QWidget *parent, const char *name )
            : QWidget( parent, name )
    {
        setMinimumSize( 400, 200 );
        setMaximumSize( 400, 200 );
        
        text = new QTextEdit(this, "text");
        trans = new QTextEdit(this, "trans");
        QPushButton * convert = new QPushButton( "Convert", this , "button");
        
        convert->setGeometry( 100, 150, 50, 30 );
        connect( convert, SIGNAL(clicked()), this, SLOT(convert()) );
        
        text->setTextFormat(Qt::PlainText);
        text->setGeometry( 1, 1, 180, 100 );
        
        trans->setTextFormat(Qt::PlainText);
        trans->setGeometry( 190, 1, 180, 100 );
        }
    
    
    int main( int argc, char **argv )
    {
        QApplication a( argc, argv );
        
        Gui gui(0,"test");
        gui.setGeometry( 100, 100, 200, 120 );
        a.setMainWidget( &gui );
        gui.show();
        
        return a.exec();
    }
    und das ist der error:
    QObject::connect: No such slot QWidget::convert()
    QObject::connect: (sender name: 'button')
    QObject::connect: (receiver name: 'test')

  4. #4
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Code:
    class Gui : public QWidget
    {
      Q_OBJECT
    private:
     QTextEdit * text;
    das Makro brauchst du in jeder Klasse die einen Slot implementiert oder so. Obs geht kann ich nicht testen, bei mir geht da noch gerade was anderes schief

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  5. #5
    Registrierter Benutzer
    Registriert seit
    04.10.2003
    Beiträge
    11
    daran hatte ich auchschon gedacht, aber es kommt leider folgender fehler beim kompilieren:

    Code:
    g++ -c -pipe -Wall -W -O2 -fomit-frame-pointer -pipe -march=i586 -mtune=pentiumpro  -DQT_NO_DEBUG -DQT_SHARED -DQT_THREAD_SUPPORT -I/usr/lib/qt3/mkspecs/default -I. -I. -I/usr/lib/qt3//include -o kmorse.o kmorse.cpp
    g++  -o morse_gui kmorse.o    -L/usr/lib/qt3//lib -L/usr/X11R6/lib -lqt-mt -lXext -lX11 -lm
    kmorse.o(.text+0xd3): In function `Gui::Gui(QWidget*, char const*)':
    : undefined reference to `vtable for Gui'
    kmorse.o(.text+0xdf): In function `Gui::Gui(QWidget*, char const*)':
    : undefined reference to `vtable for Gui'
    kmorse.o(.text+0x333): In function `Gui::Gui(QWidget*, char const*)':
    : undefined reference to `vtable for Gui'
    kmorse.o(.text+0x33f): In function `Gui::Gui(QWidget*, char const*)':
    : undefined reference to `vtable for Gui'
    kmorse.o(.text+0x5fc): In function `main':
    : undefined reference to `vtable for Gui'
    kmorse.o(.text+0x607): more undefined references to `vtable for Gui' follow
    collect2: ld returned 1 exit status
    make: *** [morse_gui] Fehler 1

  6. #6
    Registrierter Benutzer Avatar von BlueJay
    Registriert seit
    27.08.2004
    Beiträge
    825
    Zitat Zitat von Asraniel
    void Gui::convert()
    {
    trans->setText(text->text());
    }


    ...

    QPushButton * convert = new QPushButton( "Convert", this , "button");

    convert->setGeometry( 100, 150, 50, 30 );
    connect( convert, SIGNAL(clicked()), this, SLOT(convert()) );
    Die Dinger heissen ja immer noch gleich.
    Ich schätze, du überplättest den Slot/die function mit dem QButton, und wech ist er!

    und das ist der error:
    QObject::connect: No such slot QWidget::convert()
    QObject::connect: (sender name: 'button')
    QObject::connect: (receiver name: 'test')
    Da nennt er ja Roß und Reiter!
    Ich denke mal, ausser dem fehlenden QOBJECT hast du die Function in 'text' mit dem Button gleichen Namens gehimmelt.

    Probiere mal deinen QButton-Pointer umzubenennen (QPushButton* my_butt o.ä.)

    so long,
    BlueJay
    Geändert von BlueJay (24-02-2005 um 20:00 Uhr) Grund: näher spezifizieren

  7. #7
    Registrierter Benutzer
    Registriert seit
    04.10.2003
    Beiträge
    11
    danke, habe ich geändert, bringt aber nichts. Genau der gleiche fehler wie vorher :-(
    kann es sein das das problem irgendwie von da her kommt das QWidget ein QObject ist, und man normalerweise Q_OBJECT verwendet UND die klasse von QObject erben sollte, aber das geht ja nicht weil QWidget ja schon von QObject erbt :-(

    Code:
    #include <qapplication.h>
    #include <qpushbutton.h>
    #include <qtextedit.h>
    #include <qwidget.h>
    
    class Gui : public QWidget
    {
    Q_OBJECT
    private:
     QTextEdit * text;
     QTextEdit * trans;
    public:
        Gui( QWidget *parent=0, const char *name=0 );
    public slots:
        void convert();
    };
    
    void Gui::convert()
    {
      trans->setText(text->text());  
    }
    
    Gui::Gui( QWidget *parent, const char *name )
            : QWidget( parent, name )
    {
        setMinimumSize( 400, 200 );
        setMaximumSize( 400, 200 );
        
        text = new QTextEdit(this, "text");
        trans = new QTextEdit(this, "trans");
        QPushButton * my_butt = new QPushButton( "Convert", this , "button");
        
        my_butt->setGeometry( 100, 150, 50, 30 );
        connect( my_butt, SIGNAL(clicked()), this, SLOT(convert()) );
        
        text->setTextFormat(Qt::PlainText);
        text->setGeometry( 1, 1, 180, 100 );
        
        trans->setTextFormat(Qt::PlainText);
        trans->setGeometry( 190, 1, 180, 100 );
        }
    
    int main( int argc, char **argv )
    {
        QApplication a( argc, argv );
        
        Gui gui(0,"test");
        gui.setGeometry( 100, 100, 200, 120 );
        a.setMainWidget( &gui );
        gui.show();
        
        return a.exec();
    }

  8. #8
    Registrierter Benutzer
    Registriert seit
    02.04.2003
    Beiträge
    43
    hi,

    hab deinen code mal in drei dateien aufgeteilt.

    gui.h

    Code:
    #ifndef GUI_H
    #define GUI_H
    #include <qwidget.h>
    
    class QTextEdit;
    
    class Gui : public QWidget
    {
    	Q_OBJECT
    
    	public:
        	        Gui( QWidget *parent=0, const char *name=0 );
    
    	public slots:
        	        void convert();
    	private:
     		QTextEdit * text;
     		QTextEdit * trans;
    };
     
    #endif
    gui.cpp

    Code:
    #include <qpushbutton.h>
    #include <qtextedit.h>
    
    #include "gui.h"
    
    Gui::Gui( QWidget *parent, const char *name )
            : QWidget( parent, name )
    {
        setMinimumSize( 400, 200 );
        setMaximumSize( 400, 200 );
        
        text = new QTextEdit(this, "text");
        trans = new QTextEdit(this, "trans");
        QPushButton * my_butt = new QPushButton( "Convert", this , "button");
        
        my_butt->setGeometry( 100, 150, 50, 30 );
        connect( my_butt, SIGNAL(clicked()), this, SLOT(convert()) );
        
        text->setTextFormat(Qt::PlainText);
        text->setGeometry( 1, 1, 180, 100 );
        
        trans->setTextFormat(Qt::PlainText);
        trans->setGeometry( 190, 1, 180, 100 );
    }
    
    void Gui::convert()
    {
      trans->setText(text->text());  
    }

    main.cpp

    Code:
    #include <qapplication.h>
    #include "gui.h"
    
    
    int main( int argc, char **argv )
    {
        QApplication a( argc, argv );
        
        Gui gui(0,"test");
        gui.setGeometry( 100, 100, 200, 120 );
        a.setMainWidget( &gui );
        gui.show();
        
        return a.exec();
    }

    er macht jetzt auch was er soll, hoffe ich wenigsten .


    Gruß HL

  9. #9
    Registrierter Benutzer Avatar von BlueJay
    Registriert seit
    27.08.2004
    Beiträge
    825
    yepp, das war's! Bin auch gerade drauf gekommen.

    Ohne den gui.h hat er das moc nicht angefasst, deshalb gab es keinen neuen Slot, sondern nur das von QWidget vorgekaute Zeugs.

    Beim "Zwangsmoccen" via Q_OBJECT gab's dann die ellenlange Fehlermeldung.

    Um die Sache komplett zu machen, das zugehörige *.pro-File:

    Code:
    TEMPLATE = app
    INCLUDEPATH += .
    
    # Input
    HEADERS += gui.h 
    SOURCES += main.cpp gui.cpp
    Ich vermute, in deinem (ursprünglichem) pro ist das moc abgeschaltet.

    so long,
    BlueJay
    Geändert von BlueJay (24-02-2005 um 22:33 Uhr) Grund: Teil vergessen

  10. #10
    Registrierter Benutzer
    Registriert seit
    04.10.2003
    Beiträge
    11
    danke vielmals :-) jetz kann ich wieder etwas weitermachen, bis ich auf mein nächstes problem treffen werde ;-) bin aber optimistisch das ich in ein paar monaten ganz gut c++ programmieren kann :-)
    Geändert von Asraniel (25-02-2005 um 11:26 Uhr)

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •