Seite 1 von 1
QString in double umwandeln und umgekehrt
Verfasst: 28. September 2010 17:32
von ecoplus
hallo,
ich weis, dass ich zur zeit die leute hier im forum nerve, aber ich komm einfach nicht voran bei den tutorials die ich durchgehe.
ich habe mir 3 QLineEdit Widgets geschaffen

nput_a, Input_b, Output_c). jetzt wollte ich in Input_a und Input_b zwei zahlen eingeben und diese dann addiert in Output_c ausgeben.
hier der code von der umwandlung: (hab extra versucht die Umwandlungen ausführlich darzustellen)
Code: Alles auswählen
double a, b, c;
QString string_a;
QString strin_b;
string_a=Input_a->text();
string_b=Input_b->text();
a=string_a.toDouble();
b=sting_b.toDouble();
c=a+b;
QString string_c = QString().arg(c,0,'f',4);
Output_c -> setText(string_c);
über eine connect verbindung mit einem button lasse ich mir eine solche funktion aufrufen.
wenn ich das programm starte und auf den button klicke erscheint aber nicht das ergebnis von a+b.
ist da in meiner umwandlung was falsch?
vielen dank
Verfasst: 28. September 2010 17:50
von Christian81
Und was soll hier rauskommen??
Verfasst: 28. September 2010 17:58
von ecoplus
dort soll der zahlenwert, welcher in c steht in einen QString in dem fall string_c umgewandelt werden.
im format 'f' ->float und er soll 4 nachkommastellen enthalten
ist das so komplett falsch?
Verfasst: 28. September 2010 18:12
von Christian81
Verfasst: 29. September 2010 10:04
von ecoplus
also entweder bin ich zu blöd oder ich weis auch nich....
das ist doch voll nach schema f abegarbeitet:
Code: Alles auswählen
double d = 12.34;
QString str = QString("delta: %1").arg(d, 0, 'E', 3);
// str == "delta: 1.234E+01"
mein schema:
mein double ist meinem fall c (wo die addition stattgefunden hat). diese wird nun in einen string umgewandelt laut dieser funktion:
Code: Alles auswählen
QString QString::arg ( double a, int fieldWidth = 0, char format = 'g', int precision = -1, const QChar & fillChar = QLatin1Char( ' ' ) ) const
für "%1" wird "c ersetzt und dem string "string_c" zugewiesen.
dandach wird "string_c" mit der funktion setText an das QLineEdit Widget übergeben.
ich raff einfach nich was daran falsch ist.
vielen dank
Verfasst: 29. September 2010 10:25
von pfid
Also in dem Code ganz oben steht nix von wegen "%1".
Verfasst: 29. September 2010 10:36
von ecoplus
das hab ich ja noch geändert. hatte es davor aber auch schon mit dem ("%1"). jedoch klappt es bei beiden nich, ich weis einfach nich was da falsch ist.
vieleicht hat jemand ne idee was da falsch ist.
wie gesagt ich bekomm keine ausgabe von dem ergebnis in meiner kleinen gui.
Verfasst: 29. September 2010 11:43
von Christian81
Mit %1 funktioniert es auf alle Fälle...
Verfasst: 29. September 2010 11:51
von franzf
Was heißt "bekomme kein Ergebnis in meiner GUI"?
Kannst du nicht testweise das Ergebnis auf die Konsole ausgeben, mit qDebug()? Dann siehst du ob das korrekte im String steht.
Falls nur dein lineEdit nicht aktualisiert wird:
Bist du sicher, dass es das korrekte ist? Verwendest du den Designer? Kann es sein, dass du mit einem veralteten ui arbeitest?
Wenn du das nicht beantworten kannst:
Poste ein kopilierbares Minimalbesipiel, das dein Problem verdeutlicht.
Zu guter Letzt:
Verwende doch die statische Funktion QString::number(), da ist dann gleich ersichtlich was du machst, und die funktioniert auch sicher.
Verfasst: 29. September 2010 11:58
von ecoplus
bei mir nicht!!
ich post mal das ganze programm in der hoffnung das dort vieleicht ein fehler ist, was ich aber eigentlich auch schon mehrere std nach fehlern durchsucht habe!
main.cpp:
Code: Alles auswählen
#include <QApplication>
#include "MyWidget.hpp"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyWidget widget;
widget.show();
return a.exec();
}
MyWidget.cpp:
Code: Alles auswählen
#include <QApplication>
#include <QFormLayout>
#include "MyWidget.hpp"
MyWidget::MyWidget (QWidget *parent) : QWidget(parent)
{
calc = new QPushButton("Calc");
calc->setFont(QFont("Times",12,QFont::Bold));
a = new QLabel("a:");
a->setFont(QFont("Times",12,QFont::Bold));
a->setAlignment(Qt::AlignBottom);
Input_a = new QLineEdit();
b = new QLabel("a:");
b->setFont(QFont("Times",12,QFont::Bold));
b->setAlignment(Qt::AlignBottom);
Input_b = new QLineEdit();
platzhalter = new QLabel();
c = new QLabel("a+b:");
c->setFont(QFont("Times",12,QFont::Bold));
c->setAlignment(Qt::AlignBottom);
Output_c = new QLineEdit();
QFormLayout *layout = new QFormLayout;
layout->addRow(a,Input_a);
layout->addRow(b,Input_b);
layout->addRow(platzhalter);
layout->addRow(calc);
layout->addRow(c,Output_c);
layout->addRow(platzhalter);
setLayout(layout);
connect(calc, SIGNAL(clicked()),this, SLOT(erg()));
}
MyWidget::~MyWidget(){
}
void MyWidget::erg()
{
double a, b, c;
QString string_a;
QString string_b;
string_a=Input_a->text();
string_b=Input_b->text();
a=string_a.toDouble();
b=string_b.toDouble();
c=a+b;
QString str = QString("%1").arg(c,0,'f',4);
Output_c -> setText(str);
}
MyWidget.hpp:
Code: Alles auswählen
#ifndef MYWIDGET_HPP_
#define MYWIDGET_HPP_
#include <QApplication>
#include <Qpushbutton>
#include <Qfont>
#include <QWidget>
#include <QLabel>
#include <QlineEdit>
#include <QString>
class MyWidget : public QWidget
{
public:
MyWidget(QWidget *parent=0);
~MyWidget();
private:
QPushButton *calc;
QLabel *a;
QLineEdit *Input_a;
QLabel *b;
QLineEdit *Input_b;
QLabel *c;
QLineEdit *Output_c;
QLabel *platzhalter;
private slots:
void erg();
};
#endif /* MYWIDGET_HPP_ */
bild gui:

Verfasst: 29. September 2010 12:14
von franzf
Nächstes mal bitte auch auf die AUsgabe in der Konsole schauen!
Da kommt knallhart:
-> bei dir fehlt im Header in der Klassendefinition das Q_OBJECT!
Mit einer qDebug()-Ausgabe hättest du auch sofort gesehen, dass die Berechnung klappt.
Das nächste mal erst gründlicher schauen, dann verbrätst du nicht sinnlos die Zeit Anderer. Danke.
Verfasst: 29. September 2010 15:16
von ecoplus
so jetzt hats hingehaun... vielen dank für eure mühe
nebenbei hab ich die warnung in der konsole gar nicht gesehn, da ich die diese nicht konfiguriert hatte. hab das nun auch im .pro file gemacht un dann kam auch die warnung. vieleicht hätt ich es da schon eher gemerkt.
beim nächsten mal werde ich mich vorher besser informieren... versprochen!
Verfasst: 29. September 2010 19:57
von padreigh
Du kannst ganze Teile deines Codes auch weglassen ... zB brauchst du den größten Teil deiner private members nicht ... stattdessen vielleicht lieber eine Eingabevalidierung, zum Beispiel so:
Code: Alles auswählen
#ifndef WIDGET_H
#define WIDGET_H
#include <QtGui/QWidget>
class QLineEdit;
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
private slots:
void calc();
private:
QLineEdit *sum1;
QLineEdit *sum2;
QLineEdit *erg;
};
#endif // WIDGET_H
Code: Alles auswählen
#include "widget.h"
#include <QDoubleValidator>
#include <QLabel>
#include <QLineEdit>
#include <QGridLayout>
Widget::Widget(QWidget *parent) : QWidget(parent)
{
sum1 = new QLineEdit(this);
sum2 = new QLineEdit(this);
erg = new QLineEdit(this);
erg->setEnabled(false);
sum1->setValidator(new QDoubleValidator(this));
sum2->setValidator(new QDoubleValidator(this));
connect(sum2,SIGNAL(textChanged(QString)),this,SLOT(calc()));
connect(sum1,SIGNAL(textChanged(QString)),this,SLOT(calc()));
QGridLayout * grid = new QGridLayout(this);
grid->addWidget(new QLabel("a:"), 0, 0);
grid->addWidget(new QLabel("b:"), 1, 0);
grid->addWidget(new QLabel("a+b:"), 2, 0);
grid->addWidget(sum1, 0, 1);
grid->addWidget(sum2, 1, 1);
grid->addWidget(erg, 2, 1);
grid->setRowMinimumHeight(2,60)
}
void Widget::calc()
{
erg->setText(
QString::number( sum1->text().toDouble() + sum2->text().toDouble(), ' ', 4 )
);
}
Code: Alles auswählen
#include <QtGui/QApplication>
#include "widget.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
Verfasst: 30. September 2010 13:04
von franzf
Die interessanteste Verbesserung hat padreigh aber unterschlagen: statt der QLineEdits solltest du QDoubleSpinBox verwenden. Dann kannst du dir auf einen Schlag alle Konvertierungen sparen, und du bekommst noch ne automatische Validierung deiner Eingaben (macht der QDoubleValidator auch, aber warum nicht gleich die spezialisierte Klasse nutzen?)