Seite 1 von 2
einfacher taschenrechner = proplem
Verfasst: 28. Oktober 2008 14:37
von wayneos
hi,
bin neu in der qt-szene

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?
Verfasst: 28. Oktober 2008 14:52
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
Verfasst: 28. Oktober 2008 15:00
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?
Verfasst: 28. Oktober 2008 15:03
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
Verfasst: 28. Oktober 2008 15:07
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...

Verfasst: 28. Oktober 2008 15:09
von wayneos
vielen dank für die raschen antworten
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?
Verfasst: 28. Oktober 2008 15:17
von jerry42
Das Problem wird der Connect-Aufruf sein.
inputc ist vom Typ QLineEdit. Hat also eigentlich keinen SLOT addieren().
Verfasst: 28. Oktober 2008 15:27
von wayneos
ok das hab ich mir auch schon gedacht. aber dann bin ich mir nicht mehr sicher was ich mit
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.
Verfasst: 28. Oktober 2008 15:31
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.
Verfasst: 28. Oktober 2008 15:42
von chrootdev
Also kurz und knackig:
Code: Alles auswählen
connect(inputc, SIGNAL(clicked()), this, SLOT(addieren()));
Verfasst: 28. Oktober 2008 15:46
von jerry42
bzw. so:
Code: Alles auswählen
connect(calculate, SIGNAL(clicked()), this, SLOT(addieren()));
Der Sender muss der Button bleiben.
Verfasst: 28. Oktober 2008 16:21
von chrootdev
Oh, sorry, mein fehler, hab mich verlesen, natürlich muss der button der sender sein!
Verfasst: 29. Oktober 2008 20:23
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
Verfasst: 29. Oktober 2008 20:56
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.
Verfasst: 29. Oktober 2008 21:07
von wayneos
stimmt das könnte sein. aber er der fehler ist 3 zeilen weiter oben! bei dem qstacked widget.