Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.net  
   

Die mobilen Seiten von c++.net:
https://m.c-plusplus.net

  
C++ Forum :: Andere GUIs - Qt, GTK+, wxWidgets ::  `addWidget´ was not declared in this scope - Hilfe     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
LaskoAVG
Mitglied

Benutzerprofil
Anmeldungsdatum: 08.09.2017
Beiträge: 3
Beitrag LaskoAVG Mitglied 07:28:38 08.09.2017   Titel:   `addWidget´ was not declared in this scope - Hilfe            Zitieren

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.

_________________
Mit freundlichen Grüßen,

T. Krüger
RHBaum
Mitglied

Benutzerprofil
Anmeldungsdatum: 09.04.2003
Beiträge: 1360
Beitrag RHBaum Mitglied 08:12:59 08.09.2017   Titel:              Zitieren

Zitat:
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);
Th69
Mitglied

Benutzerprofil
Anmeldungsdatum: 25.03.2008
Beiträge: 4692
Beitrag Th69 Mitglied 08:21:27 08.09.2017   Titel:              Zitieren

Hallo,

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

Mit
C++:
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...
LaskoAVG
Mitglied

Benutzerprofil
Anmeldungsdatum: 08.09.2017
Beiträge: 3
Beitrag LaskoAVG Mitglied 10:33:22 08.09.2017   Titel:              Zitieren

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 ?

_________________
Mit freundlichen Grüßen,

T. Krüger
LaskoAVG
Mitglied

Benutzerprofil
Anmeldungsdatum: 08.09.2017
Beiträge: 3
Beitrag LaskoAVG Mitglied 10:42:59 08.09.2017   Titel:              Zitieren

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



C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#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


C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#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


C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#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()
{
 
}

_________________
Mit freundlichen Grüßen,

T. Krüger
RHBaum
Mitglied

Benutzerprofil
Anmeldungsdatum: 09.04.2003
Beiträge: 1360
Beitrag RHBaum Mitglied 09:31:37 11.09.2017   Titel:              Zitieren

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

2.
Code:
 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 ...

3.
Zitat:
class myAdd :public QWidget

Zitat:
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 ....

Code:
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 !

Code:
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.


Zuletzt bearbeitet von RHBaum am 09:45:10 11.09.2017, insgesamt 5-mal bearbeitet
C++ Forum :: Andere GUIs - Qt, GTK+, wxWidgets ::  `addWidget´ was not declared in this scope - Hilfe   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.net ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.