einfacher taschenrechner = proplem

Alles rund um die Programmierung mit Qt
wayneos
Beiträge: 38
Registriert: 28. Oktober 2008 14:09

einfacher taschenrechner = proplem

Beitrag von wayneos »

hi,

bin neu in der qt-szene :D
hab mit hilfe eines tutorials mal einen taschenrechner erstellt:

rechner.h:

Code: Alles auswählen

#ifndef TASCHENRECHNER_H
#define TASCHENRECHNER_H

#include <QWIDGET>

class rechner : public QWidget{

	Q_OBJECT

	public:
    rechner(QWidget *parent = 0);
    
    private slots:
    void addieren();
    
};

#endif
rechner.cpp:

Code: Alles auswählen

#include "rechner.h"
#include <QLABEL>
#include <QLINEEDIT>
#include <QPUSHBUTTON>
#include <QGRIDLAYOUT>

rechner::rechner (QWidget *parent)

	: QWidget (parent)
	
{

    QLabel *labela = new QLabel;
    labela -> setText ("variable a");
    QLabel *labelb = new QLabel;
    labelb -> setText ("variable b");
    QLabel *labelc = new QLabel;
    labelc -> setText ("a + b =");
    
    QLineEdit *inputa = new QLineEdit;
    inputa -> setText ("0");
    QLineEdit *inputb = new QLineEdit;
    inputb -> setText ("0");
    QLineEdit *inputc = new QLineEdit;
    
    QPushButton *calculate = new QPushButton;
    calculate -> setText ("aktion");
    
    connect(calculate, SIGNAL(clicked()), inputc, SLOT(addieren()));
    
    QGridLayout *grid = new QGridLayout;
    grid -> addWidget (labela, 0, 0);
    grid -> addWidget (labelb, 1, 0);
    grid -> addWidget (labelc, 2, 0);
    grid -> addWidget (inputa, 0, 1);
    grid -> addWidget (inputb, 1, 1);
    grid -> addWidget (inputc, 2, 1);
    grid -> addWidget (calculate, 3, 1);
    
    setLayout (grid);

}

void rechner::addieren () {

    double a, b;
    a = (inputa -> text ()).toDouble ();
    b = (inputb -> text ()).toDouble ();
    inputc -> setText (QString ("%1").arg (a+b,0,'f',4));

}
main.cpp:

Code: Alles auswählen

#include "rechner.h"
#include <QApplication>

int main( int argc, char* argv[]){

	QApplication a(argc, argv);
	rechner w;
	w.show();
	return a.exec();

}
beim compilen bekomm ich aber dann die fehlermeldung das inputa b und c der funktion addieren() nicht deklariert sind.

was mach ich falsch?
chrootdev
Beiträge: 70
Registriert: 18. April 2008 17:52

Beitrag von chrootdev »

Das hat mit der gültigkeit der QLineEdits zu tun!

Wenn du die in der header-datei anlegst:

Code: Alles auswählen

#ifndef TASCHENRECHNER_H
#define TASCHENRECHNER_H

#include <QWIDGET>

class rechner : public QWidget{

   Q_OBJECT

   public:
    rechner(QWidget *parent = 0);
   
    private slots:
    void addieren();
    
    private:   
    QLineEdit *inputa;
};

#endif
und dann im konstruktor initialisierst:

Code: Alles auswählen


#include "rechner.h"
#include <QLABEL>
#include <QLINEEDIT>
#include <QPUSHBUTTON>
#include <QGRIDLAYOUT>

rechner::rechner (QWidget *parent)

   : QWidget (parent)
   
{

    QLabel *labela = new QLabel;
    labela -> setText ("variable a");
    QLabel *labelb = new QLabel;
    labelb -> setText ("variable b");
    QLabel *labelc = new QLabel;
    labelc -> setText ("a + b =");

   
    inputa = new QLineEdit(parent);


    inputa -> setText ("0");
    QLineEdit *inputb = new QLineEdit;
    inputb -> setText ("0");
    QLineEdit *inputc = new QLineEdit;
   
    QPushButton *calculate = new QPushButton;
    calculate -> setText ("aktion");
   
    connect(calculate, SIGNAL(clicked()), inputc, SLOT(addieren()));
   
    QGridLayout *grid = new QGridLayout;
    grid -> addWidget (labela, 0, 0);
    grid -> addWidget (labelb, 1, 0);
    grid -> addWidget (labelc, 2, 0);
    grid -> addWidget (inputa, 0, 1);
    grid -> addWidget (inputb, 1, 1);
    grid -> addWidget (inputc, 2, 1);
    grid -> addWidget (calculate, 3, 1);
   
    setLayout (grid);

} 

Dann sollte es funktionieren!

Bei deiner deklaration der varibalen sind diese nur im konstruktor gültig! z.B. inputb und inputc
wayneos
Beiträge: 38
Registriert: 28. Oktober 2008 14:09

Beitrag von wayneos »

habs nun mal so wie du gesagt hast ausprobiert und bekomm jetzt beim copilieren die fehlermeldung

Code: Alles auswählen

rechner.h:17: error: ISO C++ forbids declaration of `QLineEdit' with no type
was nun?
jerry42
Beiträge: 126
Registriert: 9. Oktober 2008 10:48

Beitrag von jerry42 »

du solltest die Qt Klassen in deinem Header includen (nicht in der cpp-Datei), denn wenn du dein QLineEdit im Header deklarierst, benötigst du sie da bereits.

gruß jerry42
tribari
Beiträge: 63
Registriert: 23. Juli 2008 13:31
Wohnort: Braunschweig

Beitrag von tribari »

Code: Alles auswählen

#include <QLABEL> 
#include <QLINEEDIT> 
#include <QPUSHBUTTON> 
#include <QGRIDLAYOUT> 
die includes aus der cpp in die header-datei schreiben ;-)

In der cpp nur noch deine header-datei includen...

Du willst ein Objekt in der Header erstellen, also muss QLineEdit dort auch bekannt sein...

//edit: oha da war wer schneller als ich ;-) Nonstop service hier... :lol:
wayneos
Beiträge: 38
Registriert: 28. Oktober 2008 14:09

Beitrag von wayneos »

vielen dank für die raschen antworten :D

hat viel zu meinem verständnis beigetragen. hat sich jetzt auch wunderbar durch den compiler jagen lassen.

allerdings schreibt er das ergebnis nicht in die inputc bei klicken des buttons. weiß hier vielleicht noch jemand rat?
jerry42
Beiträge: 126
Registriert: 9. Oktober 2008 10:48

Beitrag von jerry42 »

Das Problem wird der Connect-Aufruf sein.

inputc ist vom Typ QLineEdit. Hat also eigentlich keinen SLOT addieren().
wayneos
Beiträge: 38
Registriert: 28. Oktober 2008 14:09

Beitrag von wayneos »

ok das hab ich mir auch schon gedacht. aber dann bin ich mir nicht mehr sicher was ich mit

Code: Alles auswählen

    private slots: 
    void addieren(); 
gemacht hab. dachte das ich damit den slot der klasse zur verfügung gestellt habe. wie stell ich an das er mir das ergebnis ausgibt?

edith sagt: habs selbst rausgefunden! musste im connect aufruf nur this für inputc eingeben.
Zuletzt geändert von wayneos am 28. Oktober 2008 15:31, insgesamt 1-mal geändert.
jerry42
Beiträge: 126
Registriert: 9. Oktober 2008 10:48

Beitrag von jerry42 »

Letztlich heißt das nur das der Slot bei der Klasse soundso zufinden ist.

Wenn du inputc mit this (also mit dem Objekt der rechnen-Klasse) dann sollte es eigentlich funktionieren.
chrootdev
Beiträge: 70
Registriert: 18. April 2008 17:52

Beitrag von chrootdev »

Also kurz und knackig:

Code: Alles auswählen

connect(inputc, SIGNAL(clicked()), this, SLOT(addieren()));
jerry42
Beiträge: 126
Registriert: 9. Oktober 2008 10:48

Beitrag von jerry42 »

bzw. so: :)

Code: Alles auswählen

connect(calculate, SIGNAL(clicked()), this, SLOT(addieren())); 
Der Sender muss der Button bleiben.
chrootdev
Beiträge: 70
Registriert: 18. April 2008 17:52

Beitrag von chrootdev »

Oh, sorry, mein fehler, hab mich verlesen, natürlich muss der button der sender sein!
wayneos
Beiträge: 38
Registriert: 28. Oktober 2008 14:09

Beitrag von wayneos »

sorry aber es hat sich nochmal ein problem ergeben! hab den code jetzt wie folgt verändert:

rechner.h

Code: Alles auswählen

#ifndef TASCHENRECHNER_H
#define TASCHENRECHNER_H

#include <QWIDGET>
#include <QLINEEDIT>
#include <QSTACKEDWIDGET>

class rechner : public QWidget{

	Q_OBJECT

	public:
    rechner(QWidget *parent = 0);

    private slots:
    void addieren();
    void subtrahieren();
    void showaddieren();
    void showsubtrahieren();
    void klosen();
     
    private:    
    QLineEdit *inputa;
    QLineEdit *inputb;
    QLineEdit *inputc;
    QLineEdit *inputa2;
    QLineEdit *inputb2;
    QLineEdit *inputc2;
    QStackedWidget *stacked;
    
};

#endif
rechner.cpp:

Code: Alles auswählen

#include "rechner.h"
#include <QLABEL>
#include <QPUSHBUTTON>
#include <QGRIDLAYOUT>

rechner::rechner (QWidget *parent)

	: QWidget (parent)
	
{

    QLabel *labela = new QLabel;
    labela -> setText ("variable a");
    QLabel *labelb = new QLabel;
    labelb -> setText ("variable b");
    QLabel *labelc = new QLabel;
    labelc -> setText ("a + b =");
    QLabel *labelc2 = new QLabel;
    labelc2 -> setText ("a - b =");
    
    inputa = new QLineEdit(parent);
    inputa -> setText ("0");
    inputb = new QLineEdit(parent);
    inputb -> setText ("0");
    inputc = new QLineEdit(parent);
    inputa2 = new QLineEdit(parent);
    inputa2 -> setText ("0");
    inputb2 = new QLineEdit(parent);
    inputb2 -> setText ("0");
    inputc2 = new QLineEdit(parent);
   
    QPushButton *calculate = new QPushButton;
    calculate -> setText ("aktion");
    QPushButton *calculate2 = new QPushButton;
    calculate2 -> setText ("aktion");
    
    connect(calculate, SIGNAL(clicked()), this, SLOT(addieren()));
    connect(calculate2, SIGNAL(clicked()), this, SLOT(subtrahieren()));
    
    QGridLayout *grid = new QGridLayout;
    grid -> addWidget (labela, 0, 0);
    grid -> addWidget (labelb, 1, 0);
    grid -> addWidget (labelc, 2, 0);
    grid -> addWidget (inputa, 0, 1);
    grid -> addWidget (inputb, 1, 1);
    grid -> addWidget (inputc, 2, 1);
    grid -> addWidget (calculate, 3, 1);

    QGridLayout *grid2 = new QGridLayout;
    grid2 -> addWidget (labela, 0, 0);
    grid2 -> addWidget (labelb, 1, 0);
    grid2 -> addWidget (labelc2, 2, 0);
    grid2 -> addWidget (inputa2, 0, 1);
    grid2 -> addWidget (inputb2, 1, 1);
    grid2 -> addWidget (inputc2, 2, 1);
    grid2 -> addWidget (calculate2, 3, 1);
    
    stacked = new QStackedWidget(parent);
    stacked -> insertWidget (0, grid);
    stacked -> insertWidget (1, grid2);
    
    QVBoxLayout *layout = new QVBoxLayout;
    layout -> addWidget (stacked);
    
    setLayout (layout);

}

void rechner::addieren () {

    double a, b;
    a = (inputa -> text ()).toDouble ();
    b = (inputb -> text ()).toDouble ();
    inputc -> setText (QString ("%1").arg (a+b,0,'f',4));

}

void rechner::subtrahieren () {

    double a, b;
    a = (inputa2 -> text ()).toDouble ();
    b = (inputb2 -> text ()).toDouble ();
    inputc2 -> setText (QString ("%1").arg (a-b,0,'f',4));

}

void rechner::showaddieren () {

    stacked -> setCurrentIndex(0);

}

void rechner::showsubtrahieren () {

    stacked -> setCurrentIndex(1);

}

void rechner::klosen () {
    
    close();

}
nun sagt er mir beim comp.:

Code: Alles auswählen

rechner.cpp:59: error: no matching function for call to `QStackedWidget::insertW
idget(int, QGridLayout*&)'
was sich auf die zeilen:

Code: Alles auswählen

stacked -> insertWidget (0, grid);
stacked -> insertWidget (1, grid2);
was mach ich falsch? es funktioniert doch beim QLINEEDIT auch?

vielen dank schonmal
jerry42
Beiträge: 126
Registriert: 9. Oktober 2008 10:48

Beitrag von jerry42 »

also ganz spontan würde ich sagen, dass die Methode addWidget(), ein QWidget als Parameter verlangt. (siehe Doku)
Und QGridLayout ist nicht von QWidget abgeleitet.
Deshalb meckert er.
wayneos
Beiträge: 38
Registriert: 28. Oktober 2008 14:09

Beitrag von wayneos »

stimmt das könnte sein. aber er der fehler ist 3 zeilen weiter oben! bei dem qstacked widget.
Antworten