Frage von Fitje, 76

qt-Programm: QLineEdit mit QPushButton auslesen funktioniert nicht, warum?

Hallo, ich versuche im 2 Fenster 2 des unteren Proggis Text der unteren QLineEdit nach oben zu übernehmen (mit testen ()), stürzt ab und wird oben(QlineEdit) nicht angezeigt . Warum klappt es nicht, bin Neuling in QT? Hier Counter.h: #include QLineEdit #include QPushButton #include QDialog

class Counter : public  QLineEdit
{
Q_OBJECT // Enable signals and slots
public:
Counter (QWidget *parent=0);
~Counter();
QPushButton *cl, *plus;  
QWidget *fen;
public slots:
 void countUp();
 void testen();
void MeinFenster(); 
private:
char zahlwort[200];
Counter *gf, *hf;
int n;
QString zahli;
};

hier Counter.cpp

#include "counter.h"
Counter::Counter (QWidget *parent)
  : QLineEdit (parent),
 n(0){}
 Counter::~Counter() {}
 void Counter :: MeinFenster() //QWidget parent)
 {
  fen = new QWidget();
 fen->setGeometry(100,200,300,200);
  fen->show();
  gf = new Counter(fen); // Eigentlich als Eingabe gedacht
  gf->setGeometry(10,10,100,20);
  gf->show();
  hf = new Counter(fen); // Als Ausgabe der Berechnungen gedacht
  hf->setGeometry(10,50,100,20);
  hf->show();
  hf->setText(zahli);
  cl = new QPushButton("test", fen);
  cl->setGeometry(50,120,95,20);
  cl->show();
  plus = new QPushButton("plus", fen);
  plus->setGeometry(50,150,95,20);
  plus->show();
  QObject::connect(cl, SIGNAL (clicked()), gf, SLOT(testen()));
  QObject::connect(plus, SIGNAL (clicked()), hf, SLOT(countUp()));
 }
 void Counter::countUp ()
 {
 zahli = text();
 n = zahli.toInt();
 n++;
 zahli.setNum(n);
 setText(zahli);
 }
 void Counter :: testen()
 {
  zahli = hf->text();
  setText(zahli);
 }
Counter::Counter (QWidget *parent)
 : QLineEdit (parent),
 n(0){}
 Counter::~Counter() {}
 void Counter :: MeinFenster() //QWidget parent)
 {
fen = new QWidget();
fen->setGeometry(100,200,300,200);
    fen->show();
gf = new Counter(fen); // Eigentlich als Eingabe gedacht
gf->setGeometry(10,10,100,20);
gf->show();
 hf = new Counter(fen); // Als Ausgabe der Berechnungen gedacht
 hf->setGeometry(10,50,100,20);
 hf->show();
hf->setText(zahli);
 cl = new QPushButton("test", fen);
 cl->setGeometry(50,120,95,20);
cl->show();
plus = new QPushButton("plus", fen);
plus->setGeometry(50,150,95,20);
    plus->show();
 QObject::connect(cl, SIGNAL (clicked()), gf, SLOT(testen()));
 QObject::connect(plus, SIGNAL (clicked()), hf, SLOT(countUp()));
}
void Counter::countUp ()
 {
 zahli = text();
 n = zahli.toInt();
 n++;
zahli.setNum(n);
 setText(zahli);
 }
 void Counter :: testen()
 {
  zahli = hf->text();
  setText(zahli);
 }

soll hf->text() heißen main.cpp = okay. Kann nicht auf Text der anderen mit Counter gesetzten QLineEdit-Elemente zurückgreifen. CountUp= ok.. Wird ohne Fehler / Warnmeldungen compiliert. Aber wenn ich versuche mit testen gf->text auf den Text vom Element gf zurückzugreifen will, stürzt das Prog ab. setText("hallo") wird angezeigt warum? Falsche Klasse oder was?

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von KaiAbuSir, 76

Hallo, der Aufbau des User-Interfaces ist sehr "krass" , aber, um es genau  erkären zu können solltest du noch den Inhalt der main() mit dazuschreiben.

Kommentar von Fitje ,

Für den ganzen Source-code reichte derPlatz im Editor von gutefrage.net nicht.

hier der Rest:

#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QLineEdit>
#include "counter.h"
int main(int argc, char argv[])
{
int zahl = 33;
QString zawo;
QString wort = "123";
//QString dummy = "";
QString test = "Test";
QApplication app(argc, argv);
QWidget
fenster = new QWidget();
fenster->setWindowTitle("Hallo 6");
fenster->setGeometry(300,200,300,200);
QLineEdit e = new QLineEdit(fenster);
e->setGeometry(10,10,150,20);
e->setText(wort);
QLineEdit
erge = new QLineEdit(fenster);
erge->setGeometry(10,50,150,20);
MeinFenster mf = new MeinFenster();
mf->setGeometry(50,100,200,200);
mf->show();
wort = e->text();
zahl = wort.toInt();
zahl +=2;
zawo.setNum(zahl);
erge->setText(zawo);
QPushButton
clear = new QPushButton("Clear", fenster);
clear->setGeometry(50,120,95,20);
QPushButton finito = new QPushButton("exit", fenster);
finito->setGeometry(150,120,95,20);
fenster->show();
Counter
z = new Counter(fenster);
z->setGeometry(10,80,95,20);
z->show();
// Wollte zuert alles im Hauptfenster machen, aber nichts ausser countUp klappt????
QObject::connect(clear, SIGNAL (clicked()), z, SLOT ( countUp() ) );
QObject::connect(finito, SIGNAL (clicked()), &app, SLOT ( quit() ) );
return app.exec();
}

Kommentar von Fitje ,

Habs mit allen Versionen von Zeiger-Aufrufen probiert. Bis Weihnachten gib ich mir Zeit. Wenns dann nicht funzt, hör ich mit qt auf und bleib bei c und c++. Mit 50 Jahren auf dem Buckel muß ich mir nichts mehr beweisen und hab was anderes zu tun als ständig aufm Rechner rumzudödeln.

Antwort
von KaiAbuSir, 56

Hallo,

am besten schick den ganzen source-code an kaiAbuSir at gmx.de damit nichts verloren geht.

Und: Wenn im Debug-Fenster die message kommt ...no such slot...,

dann hat man meist eine schreibfehler gemacht, oder die falschen paramter angegeben (z.b. mySlot(int) stall mySlot(int &) )

Antwort
von KaiAbuSir, 57

Hallo, der source code kann so nicht stimmen: ... = new MeinFenster(); //geht nicht: Denn es gibt ja gar keine Klasse "MeinFenster" sondern MeinFenster() ist ein Methode von Counter. (Außderdem fehlen ein paar Sternchen *, die sind aber wohl vom Editor verschluckt worden, kein Problem)

Kommentar von Fitje ,

Richtig der Editor hat da selbst im Source-Code-Modus einiges verschluckt. Mit geht es um die Parameterübergabe bei den Funktionen die auf QLineEdit. Selbst wenn ich diese in der Klassendeklaration als public angebe, geht es nicht. Ich möchte innerhalb der Methode testen auf *gf und * zurückgreifen können.

Wenn ich das Prog laufen lasse, kommt nur eine Fehlermeldung:

no such Slot.

Den Code für eine Parameterübergabe wie folgt:

 void Counter :: testen\
( hier Parameter für QlineEdit-zugriff ) { zahli = hf->text(); setText(zahli); }

wüßte ich gerne, wie geht das?

Kommentar von Fitje ,

Hab das ganze jetzt mit dem QT-Designer gemacht. ausserdem mit

gf -> setText(QString("%1").arg(sinus,0,'f',7));

jetzt klappt es. Der moderne QT-Creator rechnet die ui-Dateien dazu. Deswegen hat es mit dem alten code nicht geklappt.

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten