problem mit eigener funktion



  • hallo,

    ich hab mir eine eigene funktion geschrieben, um damit ber buttonklick den text des labels zu ändern. dabei stosse ich auf das problem, das mein objekt label in der changelabel() funktion nicht erkannt wird

    mein code

    test.cpp

    #include <qpushbutton.h>
    #include <qlineedit.h>
    #include <qlayout.h>
    #include <qpopupmenu.h>
    #include <qmenubar.h>
    #include <qlabel.h>
    
    #include "test.h"
    
    TestWidget::TestWidget(QWidget* parent, const char* name)
      : QWidget(parent, name)
    {
        QLayout* layout = new QVBoxLayout(this);
    
        QPopupMenu *fileMenu = new QPopupMenu(this);
        fileMenu->insertItem( "Neu" );
        fileMenu->insertItem( "Oeffnen");
        fileMenu->insertSeparator();
        fileMenu->insertItem( "&Beenden", this, SLOT(close()));
    
        QMenuBar *mainMenu = new QMenuBar(this);
        mainMenu->insertItem( "&Datei",fileMenu );
    
        QLabel *label = new QLabel(this);
        label->setText("alter text");
        label->setGeometry(0, 120, 200, 50);
        label->setAlignment(Qt::AlignCenter);
        label->setFont(QFont("Arial", 20, QFont::Bold));
    
        QLineEdit* lineEdit = new QLineEdit(this);
        QPushButton* button = new QPushButton("Hier klicken", this);
    
        layout->add(lineEdit);
        layout->add(button);
        layout->add(label);
    
        QObject::connect(button, SIGNAL(clicked()), label, SLOT(changeLabel));
    }
    
    void TestWidget::changeLabel()
    {
        label->setText("neuer text");
    }
    

    test.h

    #ifndef QTTUTWIDGET_H
    #define QTTUTWIDGET_H
    
    #include <qwidget.h>
    
    class TestWidget : public QWidget
    {
        Q_OBJECT
    public:
        TestWidget(QWidget* parent=0, const char* name=0);
    
    private slots:
    
    protected:
    };
    
    #endif
    

    main.cpp

    #include <qapplication.h>
    
    #include "test.h"
    
    int main( int argc, char* argv[] )
    {
        QApplication app( argc, argv );
    
        TestWidget tutwidget( 0 );
        tutwidget.resize( 300,300 );
    
        app.setMainWidget( &tutwidget );
    
        tutwidget.show();
    
        return app.exec();
    }
    

    ich geh mal von aus, das ich mein label öffentlich machen muss... aber wie???



  • test.cpp

    #include <qpushbutton.h>
    #include <qlineedit.h>
    #include <qlayout.h>
    #include <qpopupmenu.h>
    #include <qmenubar.h>
    #include <qlabel.h>
    
    #include "test.h"
    
    TestWidget::TestWidget(QWidget* parent, const char* name)
      : QWidget(parent, name)
    {
        QLayout* layout = new QVBoxLayout(this);
    
        QPopupMenu *fileMenu = new QPopupMenu(this);
        fileMenu->insertItem( "Neu" );
        fileMenu->insertItem( "Oeffnen");
        fileMenu->insertSeparator();
        fileMenu->insertItem( "&Beenden", this, SLOT(close()));
    
        QMenuBar *mainMenu = new QMenuBar(this);
        mainMenu->insertItem( "&Datei",fileMenu );
    
        label = new QLabel(this);
        label->setText("alter text");
        label->setGeometry(0, 120, 200, 50);
        label->setAlignment(Qt::AlignCenter);
        label->setFont(QFont("Arial", 20, QFont::Bold));
    
        QLineEdit* lineEdit = new QLineEdit(this);
        QPushButton* button = new QPushButton("Hier klicken", this);
    
        layout->add(lineEdit);
        layout->add(button);
        layout->add(label);
    
        QObject::connect(button, SIGNAL(clicked()), label, SLOT(changeLabel));
    }
    
    void TestWidget::changeLabel()
    {
        label->setText("neuer text");
    }
    

    test.h

    #ifndef QTTUTWIDGET_H
    #define QTTUTWIDGET_H
    
    #include <qwidget.h>
    #include <qlabel.h>
    
    class TestWidget : public QWidget
    {
        Q_OBJECT
    public:
        TestWidget(QWidget* parent=0, const char* name=0);
    
    private slots:
    
    protected:
        QLabel *label;
    };
    
    #endif
    

    ungetestet, sollte aber gehn..



  • hallo,

    danke für die antwort.

    das problem besteht leider immer noch in anderer form.

    ich hab die header datei mal ein wenig abgewandelt. sie sieht nun so aus:

    #ifndef QTTUTWIDGET_H
    #define QTTUTWIDGET_H
    
    #include <qwidget.h>
    #include <qlabel.h>
    
    class TestWidget : public QWidget
    {
        Q_OBJECT
    public:
        TestWidget(QWidget* parent=0, const char* name=0);
    
    private slots:
        void changeLabel(void);
    
    protected:
        QLabel* label;
    };
    
    #endif
    

    und die stelle in der cpp hab ich mal so geändert:

    label = new QLabel(this);
        label->setText("alter text");
        label->setGeometry(0, 120, 200, 50);
        label->setAlignment(Qt::AlignCenter);
        label->setFont(QFont("Arial", 20, QFont::Bold));
    
        QPushButton* button = new QPushButton("Hier klicken", this);
    
        layout->add(lineEdit);
        layout->add(button);
    
        QObject::connect(button, SIGNAL(clicked()), label, SLOT(changeLabel()));
    }
    
    void TestWidget::changeLabel(void)
    {
        label->setText("neuer text");
    }
    

    meine fehlermeldung lautet nun:
    QObect::connect: No such slot QLabel::changeLabel()
    QObect::connect: (sender name:'unnamed')
    QObect::connect: (receiver name:'unnamed')

    das verstehe ich aber nicht ganz.. es ist doch ein eindeutiger sender und ein receiver definiert. wo liegt nun noch das problem.



  • Das Label musst du schon ins Layout tun, sonst wird es ja nicht angezeigt..

    QObject::connect(button, SIGNAL(clicked()), this, SLOT(changeLabel()));



  • super hat funktioniert.

    wenn ich das label ins layout tue, dann ist mein design komplett verschoben und meine lineedit verschwunden.. wenn ich die zeile layout->add(label); auskommentiere, wird alles korrekt angezeigt.. auch das label. nachvollziehbar ist das allerdings nicht, da ich ja meine objekte mit layout->add auf die form bringe.

    naja nun geht es jedenfalls.. 🙂

    dank dir nochmal 😉



  • bevor ich ein neuen post aufmache, ich hab da ein kleineres folgeproblem.

    und zwar möchte ich das nun so regeln, das ein text aus der lineedit an das label übergeben wird, wenn der button gedrückt wird.

    dazu mein code

    ..........
        QLineEdit *lineEdit = new QLineEdit(this);
        lineEdit->setGeometry(10, 80, 180, 20);
    
        QObject::connect(button, SIGNAL(clicked()), this, SLOT(changeLabel()));
    }
    
    void TestWidget::changeLabel()
    {
            label->setText(lineEdit->text());
    }
    

    das wird auch ganz wunderbar kompiliert.. leider bekomme ich dann beim klick auf den button ein speicherzugriffsfehler.

    rein technisch sollte der code aber korrekt sein.
    zumindest kann ich von der logik her nix aussergewöhnliches ableiten.

    danke



  • Gleiches Prob wie davor. Im changeLabel() slot is lineEdit nicht bekannt. Du musst es in die Klasse verschieben.

    Aber kompilieren sollte es eigentlich auch nicht, außer du hast es in der Klasse definiert und machst dann im Konstruktor noch ne 2. lokale Variable/Pointer (QLineEdit *lineEdit)..



  • ja korrekt..

    es ist in der klasse definiert und ich hab eine 2. lokale var angelegt.

    meine test.h

    #ifndef QTTUTWIDGET_H
    #define QTTUTWIDGET_H
    
    #include <qwidget.h>
    #include <qlabel.h>
    #include <qlineedit.h>
    
    class TestWidget : public QWidget
    {
        Q_OBJECT
    public:
        TestWidget(QWidget* parent=0, const char* name=0);
    
    private slots:
        void changeLabel();
    
    protected:
        QLabel* label;
        QLineEdit* lineEdit;
    };
    
    #endif
    

    danke für deine bemühungen


Anmelden zum Antworten