`addWidget´ was not declared in this scope - Hilfe



  • Guten Morgen liebe Community,

    dies ist mein erster Beitrag. Bin daher offen für Kritik und Verbesserungsvorschläge. Wie füge ich denn den Quellcode richtig ein bzgl. Lesbarkeit ?

    Folgender Fehler tritt auf:

    Fehler: 'addWidget' was not declared in this scope
    connect(ui->Calculate, SIGNAL(clicked()), addWidget, SLOT(addAB()));

    Quellcode:

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <QLineEdit>
    #include <QString>
    #include<QApplication>
    #include "myAdd.h"
    #include "mySub.h"
    #include <QWidget>

    MainWindow::MainWindow(QMainWindow *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
    {
    ui->setupUi(this);
    ui->InputA->setText("0");
    ui->InputB->setText("0");
    ui->InputA_2->setText("0");
    ui->InputB_2->setText("0");

    connect(ui->Calculate, SIGNAL(clicked()), addWidget, SLOT(addAB()));
    connect(ui->Calculate_2, SIGNAL(clicked()), subWidget, SLOT(subAB()));

    ui->InputA->text();
    ui->InputB->text();
    ui->InputA_2->text();
    ui->InputB_2->text();

    connect(ui->actionQuit, SIGNAL (triggered()), qApp, SLOT(quit()));
    connect(ui->actionAdd, SIGNAL(triggered(bool)),this, SLOT(showAdd()));
    connect(ui->actionSub, SIGNAL(triggered(bool)),this, SLOT(showSub()));

    myAdd *addWidget = new myAdd(this);
    mySub *subWidget = new mySub(this);
    }

    Würde mich über eure Hilfe freuen.



  • connect(ui->Calculate, SIGNAL(clicked()), addWidget, SLOT(addAB()));

    1. der 3. parameter von connect muss ein Zeiger auf ein QObject sein.
    addWidget seh ich aber nicht als variable von irgendwas ...

    2. gewöhn dir die neue Connect Syntax an, die ist um welten übersichtlicher und nativer

    angenommen ui->Calculate ist nen QButton und addWidget ist sowieso falsch, sondern es soll auf die instanz der klasse die man grab baut ...

    connect(ui->Calculate,&QButton::clicked, this,&MainWindow::addAB);



  • Hallo,

    packe deinen Code in Code-Tags (editiere deinen Beitrag: Code markieren und Button "C++" drücken).

    Mit

    myAdd *addWidget = new myAdd(this);
    mySub *subWidget = new mySub(this);
    

    erstellst du zwei lokale Variablen, welche in den vorherigen Zeilen noch nicht bekannt sind.

    Was genau sind denn 'myAdd' und 'mySub'? Dialog-Klassen?

    Warum sind deine beiden SLOT-Methoden 'addAB' und 'subAB' nicht Methoden derselben Klasse MainWindow?

    PS: Außerdem sind die 4 "text()"-Zeilen überflüssig...



  • Vielen Dank für eure schnelle Antworten.
    Werde ich beim nächsten Beitrag beachten.

    myAdd und mySub sind Klassen. Diese dienen jeweils für die Addition bzw. Subtraktion des Taschenrechners.

    So ich habe den überlüssigen Teil erstmal gelöscht. Danke für den Tipp.

    Die Deklaration von addWidget und subWidget habe ich nun nach ganz oben gepackt.
    Der vorher beschriebene Fehler tritt nun nicht mehr auf.
    Jedoch schmiert das Programm nun ab, wenn ich es öffne und der mir das Ergebnis berechnen soll.

    Woran könnte das denn liegen ?



  • So nun der erste Versuch den Quellcode richtig einzubeziehen.
    Dies ist einmal der header für mainwindow, der header/Klasse für die Addition und die cpp datei für die Addition

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    #include <QLineEdit>
    #include <QString>
    #include "ui_mainwindow.h"
    #include "QWidget"
    
    namespace Ui {
    class MainWindow;
    }
    
    class MainWindow : public QMainWindow, public Ui::MainWindow
    {
        Q_OBJECT
    
    public:
        explicit MainWindow(QMainWindow *parent = 0);
        ~MainWindow();
    
    private:
        Ui::MainWindow *ui;
    
    private slots:
        void showAdd();
        void showSub();
    
    };
    
    #endif // MAINWINDOW_H
    
    #ifndef MYADD_H
    #define MYADD_H
    
    #include <QWidget>
    class MainWindow;//forward declaration damit der compiler entsprechend bescheid weiß
    
    class myAdd :public QWidget //abgeleitet von QWidget um QT Eigenschaften zu besitzen
    {
        Q_OBJECT
    
        MainWindow *myTaschenrechner;//klassenvariable vom typ mainwindow um übergreifende zugriffe zu ermöglichen
    
    public:
        myAdd(MainWindow *);//pointer muss auf die klasse mainwindow übergeben werden, wert an TRechner übergeben und dieser dann an myTaschenrechner
        ~myAdd();
    
    private slots:
        void addAB();
    };
    
    #endif // MYADD_H
    
    #include "myAdd.h"
    #include "mainwindow.h"
    #include "QWidget"
    #include <QLineEdit>
    #include <QString>
    #include<QApplication>
    
    myAdd::myAdd(MainWindow *TRechner):myTaschenrechner(TRechner)   //wert an einen pointer TRechner übergeben und diesen dann an myTaschenrechner übergeben
                                                                    //variable wird übergeben und dann weiter gereicht
                                                                    // variable wird mit ":" angehangen und der Wert in (xxxx)
    {
    myTaschenrechner=TRechner;
    }
    void myAdd::addAB()
    {
    
        double a,b;
    
        a = (myTaschenrechner->InputA->text().toDouble());//das lineedit hat einen qstring als datentyp, daher beim lesen die umwandlung in eine zahl fürs berechnen
        b = (myTaschenrechner->InputB->text().toDouble());//das lineedit hat einen qstring als datentyp, daher beim lesen die umwandlung in eine zahl fürs berechnen
        myTaschenrechner->InputC->setText(QString("%1").arg(a+b,0,'f',4));//umwandeln in string,
                                                            //%1 platzhalter für arg,
                                                            //a+b ist der wert der umgewandelt werden soll
                                                            //fieldWidth (feldbreite) = 0 gibt an ob die zahl links, mittig, rechts im kästchen steht
                                                            //char format gibt an in welche schreibweise umgewandelt werden soll bsp. exponenten
                                                            //int precision = stellen nach dem komma
    
    }
    
    myAdd::~myAdd()
    {
    
    }
    


  • 1. Fehlermeldungen ? Debuggen, bei welcher Zeile schmiert er ab ?
    Seh grad nix verdächtiges, ist aber auch Montag morgen.

    public QMainWindow, public Ui::MainWindow
    

    ui::Mainwindow vom Designer sollte doch schon nen QMainWindow sein(oder von QMainwindow abgeleitet) oder ?
    Frisst der compiler das überhaupt?

    und warum noch mal von ui::MainWindow ableiten, wenn Du auch nen Member vom Typ ui::MainWindow hasst ?
    Irgendwas passt da nicht ...

    class myAdd :public QWidget

    myAdd(MainWindow 😉

    Der Ctor kann durhaus sinn machen ....

    QObjects und die Hirarchie dahinter wollen fast immer nen Parent haben. Zumindest macht es meistens sinn das für das autodelete zu verwenden.
    also sollte Ctor sowas haben:
    myAdd::myAdd(MainWindow *TRechner):QWidget(TRechner),myTaschenrechner(TRechner)
    Wobei myTaschenrechner styletechnisch IMHO bedenklich ist. siehe nächster punkt.

    4. Style und Design ....

    double a,b;
    
        a = (myTaschenrechner->InputA->text().toDouble());//das lineedit hat einen qstring als datentyp, daher beim lesen die umwandlung in eine zahl fürs berechnen
        b = (myTaschenrechner->InputB->text().toDouble());//das lineedit hat einen qstring als datentyp, daher beim lesen die umwandlung in eine zahl fürs berechnen
    

    C++ ist RAI !

    double a = (myTaschenrechner->InputA->text().toDouble());
    double b = (myTaschenrechner->InputB->text().toDouble());
    

    Anmerkungen:
    QT lebt vom SIgnal/Slot Mechanismus. Das ist das grosse PLUS des Frameworks. Signal/Slot ist super um Dependencies zu vermeiden.

    myAdd sollte nicht TRechner kennen. Sondern die sollten ueber SIgnal/Slot miteinander kommunizieren.

    Klassennamen: Warum ist myAdd klein und mit my als prefix, MainWindow groß und ohne Prefix hingegen ???

    Dokumentation: Kommentarzeilen sind geil !!! Aber nur wenn was informatives drin steht. Und was QString::arg macht ist in der QT Doku besser beschrieben.
    Initialisierungslisten sollte auch jeder C++ Entwickler kennen.
    Forwarder sollt man auch nicht dokumentieren müssen.
    Besser wäre zum Beispiel zu dokumentieren, warum du das Mainwindow aggregierst, warum du direkte aufrufe machen willst, statt Signale/slots, was in QT üblicher ist.
    Wenn das für Dich ist, als anmerkung, als notiz quasi fürs Lernen, dann ok, aber lass das nicht zur gewohnheit werden.


Anmelden zum Antworten