Zugriff auf Klassen Variabel.

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
Alex66955
Beiträge: 56
Registriert: 23. September 2009 14:48

Zugriff auf Klassen Variabel.

Beitrag von Alex66955 »

Hey Community,

Habe folgendes Problem.
Ich habe eine Klasse mit einem Dialog der bei accept die Eingabe ausliest und in ein QString abspeichert. Nur schaffe ich es nicht auserhalb der Klasse auf diese QString´s zuzugreifen.

Mein Ansatz:
Variabel auf die zugegriffen werden sollen als public deklarieren. Von auserhalb der Klasse zugreifen mit

Code: Alles auswählen

Klassenname::Variabel oder Klassenname neuerbezeichner... neueuerbezeichner.Klassenname
Der Compiler bringt keine Fehlermeldung aber in der Ausgelesenen Variabel steht nix drin.

DIALOG KLASSE HEADER:

Code: Alles auswählen

#ifndef EINGABEDIALOG_H
#define EINGABEDIALOG_H

#include <QtGui>

namespace Ui {
    class EingabeDialog;
}

class EingabeDialog : public QDialog {
    Q_OBJECT
public:
    EingabeDialog(QWidget *parent = 0);
    ~EingabeDialog();
    QString Nr_von, Nr_bis, Fehler_1, Fehler_2;
    QLineEdit *Nr_von_LineEdit, *Nr_bis_LineEdit, *Fehler_1_LineEdit, *Fehler_2_LineEdit;

protected:
    void changeEvent(QEvent *e);

public slots:
    void einlesen();

private:
    Ui::EingabeDialog *m_ui;
    QDialogButtonBox *ButtonBox;
};

#endif // EINGABEDIALOG_H
DIALOG KLASSE:

Code: Alles auswählen

#include "eingabedialog.h"
#include "ui_eingabedialog.h"

EingabeDialog::EingabeDialog(QWidget *parent) :
    QDialog(parent),
    m_ui(new Ui::EingabeDialog){

    m_ui->setupUi(this);

    Nr_von_LineEdit = new QLineEdit;
    Nr_von_LineEdit = m_ui->Baunummer_von;
    Nr_von_LineEdit->setInputMask("999");

    Nr_bis_LineEdit = new QLineEdit;
    Nr_bis_LineEdit = m_ui->Baunummer_bis;
    Nr_bis_LineEdit->setInputMask("999");

    Fehler_1_LineEdit = new QLineEdit;
    Fehler_1_LineEdit = m_ui->Fehler_1;
    Fehler_1_LineEdit->setInputMask("HHHH");

    Fehler_2_LineEdit = new QLineEdit;
    Fehler_2_LineEdit = m_ui->Fehler_2;
    Fehler_2_LineEdit ->setInputMask("HHHH");

    ButtonBox = new QDialogButtonBox;
    ButtonBox = m_ui->buttonBox;


    
    connect(ButtonBox, SIGNAL(accepted()), this, SLOT(einlesen()));

}

EingabeDialog::~EingabeDialog()
{
    delete m_ui;
}

void EingabeDialog::changeEvent(QEvent *e)
{
    QDialog::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
        m_ui->retranslateUi(this);
        break;
    default:
        break;
    }
}


void EingabeDialog::einlesen(){
    QString Nr_von = Nr_von_LineEdit->text();
    QString Nr_bis = Nr_bis_LineEdit->text();
    QString Fehler_1 = Fehler_1_LineEdit->text();
    QString Fehler_2 = Fehler_2_LineEdit->text();
}

VON DER KLASSE ICH ZUGREIFEN MÖCHTE:

Code: Alles auswählen

#include "logviewer.h"
#include "ui_logviewer.h"


LogViewer::LogViewer(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::LogViewer){
    ui->setupUi(this);

    CloseAction = new QAction(this);
    CloseAction = ui->CloseAction;

    OpenAction  = new QAction(this);
    OpenAction  = ui->OpenAction;

    ResetAction = new QAction(this);
    ResetAction = ui->ResetAction;

    SuchenAction = new QAction(this);
    SuchenAction = ui->SuchenAction;
    SuchenAction->setEnabled(false);

    Main_TextEdit = new QTextEdit();
    Main_TextEdit = ui->Main_TextEdit;
    Main_TextEdit->setEnabled(false);

    Verzeichnis_Label = new QLabel;
    Verzeichnis_Label = ui->Verzeichnis_Label;

    connect(CloseAction,  SIGNAL(triggered()), this, SLOT(close()));
    connect(OpenAction,   SIGNAL(triggered()), this, SLOT(dialog_open()));
    connect(ResetAction,  SIGNAL(triggered()), this, SLOT(reset()));
    connect(SuchenAction, SIGNAL(triggered()), this, SLOT(suchen()));



}

void LogViewer::suchen(){
    QDialog *in_Dialog = new EingabeDialog(this);
    in_Dialog->show();

    EingabeDialog ein;
    QString test = ein.Nr_bis;

}
MiKla
Beiträge: 134
Registriert: 29. Juli 2007 15:29

Beitrag von MiKla »

sollte das nicht

Code: Alles auswählen

  EingabeDialog *in_Dialog = new EingabeDialog(this); 
heissen
Mani99
Beiträge: 244
Registriert: 15. April 2009 10:46
Wohnort: München

Beitrag von Mani99 »

@Alex66955

Schon mal was von properties gehört?

Im header:

Code: Alles auswählen

public:
    QString getNr_von();
    QString getNr_bis();
    QString getFehler_1();
    QString getFehler_2();

    void setNr_von(QString sNr_von);    
    void setNr_bis(QString sNr_bis);
    void setFehler_1(QString sFehler_1);
    void setFehler_2(QString sFehler_2);

private:
    QString nr_von;
    QString nr_bis;
    QString fehler_1;
    QString fehler_2;
Und im source file einfach alles zuweisen.
Alex66955
Beiträge: 56
Registriert: 23. September 2009 14:48

Beitrag von Alex66955 »

Michael.Klank hat geschrieben:sollte das nicht

Code: Alles auswählen

  EingabeDialog *in_Dialog = new EingabeDialog(this); 
heissen
Ja hast recht muss natürlich geändert werden. Danke ;)



Komme grad ins stocken weil ich mit properties noch nie gearbeitet habe. Von der Logik kann ich es nachvollziehen aber wie ich es genau Anwende im Source Code weis ich nicht. Kannst du mit mal ein Beispiel geben für einen Wert;

lg Alex.
Alex66955
Beiträge: 56
Registriert: 23. September 2009 14:48

Beitrag von Alex66955 »

Also hab da bestimmt einen Fehler drin.

Code: Alles auswählen

void EingabeDialog::einlesen(){
    setNr_von(Nr_von_LineEdit->text());
}


void EingabeDialog::setNr_von(QString sNr_von){
    nr_von = sNr_von;
}

QString EingabeDialog::getNr_von(){
    return nr_von;
}

Hast du da so gemeint? Beim Auslesen von einer anderen Klasse mit "getNr_von" ist der rückgabe Wert wieder leer.
Mani99
Beiträge: 244
Registriert: 15. April 2009 10:46
Wohnort: München

Beitrag von Mani99 »

Ist eher ein beispiel als ein lauffähiger source:

DeineKlasse.h

Code: Alles auswählen

class DeineKlasse : public QObject
{
	public:
		DeineKlasse(QObject *parent=0);
		
		QString getNr_von();
		
		void setNr_von(QString sNrVon);
		
	private:
		QString _nrvon;
		
		QLineEdit *line_edit1;
		
	public slots:
		void fill_nr_von(const QString &text);
		
}
DeineKlasse.cpp

Code: Alles auswählen

DeineKlasse::DeineKlass(QObject *parent):QObject(parent)
{
	//mit werten vorbelegen
	_nrvon = "";
	
	line_edit1 = new QLineEdit(parent);
	
	connect(this,SIGNAL(textChanged(....), this, SLOT(fill_nr_von(...));
}

QString DeineKlasse::getNr_von()
{
	return _nrvon;
}
// ... restlichen getter auch so implementieren

void DeineKlasse::setNr_von(QString sNrVon)
{
	_nrvon = sNrVon;
}
// ... restlichen setter auch so implementieren

void DeineKlasse::fill_nr_von(const QString &text)
{
	/*
	je nachdem was du jetzt machen möchtest
	kannst du in diesem slot noch alles 
	ausprogrammieren was du haben willst.*/
	
	setNr_von(...
}
BTW: Du solltest dich mit dem signal/slot konzept befassen.
Alex66955
Beiträge: 56
Registriert: 23. September 2009 14:48

Beitrag von Alex66955 »

Ich habe das soweit verstanden und zum Testen das ganze mit einer Variabel ausprobiert. Das Problem ist nur das beim aufrufen aus einer anderen Klasse bei deinem Beispiel die Variabel "_nrvon" leer ist.

Mir ist aufgefallen wenn ich jetzt die Variabel am Anfang mit einem beliebigen wert Initialisiere dann kommt dieser auch beim Aufrufen von einer anderen Klasse raus. Also wird dieser gar nicht ersetzt durch den Dialog text.

Also mein umgeänderten Source:


Klasse Header

Code: Alles auswählen

#ifndef EINGABEDIALOG_H
#define EINGABEDIALOG_H

#include <QtGui>

namespace Ui {
    class EingabeDialog;
}

class EingabeDialog : public QDialog {
    Q_OBJECT
public:
    EingabeDialog(QWidget *parent = 0);
    ~EingabeDialog();
    QLineEdit *Nr_von_LineEdit, *Nr_bis_LineEdit, *Fehler_1_LineEdit, *Fehler_2_LineEdit;

    QString getNr_von();
    QString getNr_bis();
    QString getFehler_1();
    QString getFehler_2();

    void setNr_von(QString sNr_von);
    void setNr_bis(QString sNr_bis);
    void setFehler_1(QString sFehler_1);
    void setFehler_2(QString sFehler_2);

protected:
    void changeEvent(QEvent *e);

public slots:
    void einlesen();

private:
    QString nr_von;
    QString nr_bis;
    QString fehler_1;
    QString fehler_2;
    Ui::EingabeDialog *m_ui;
    QDialogButtonBox *ButtonBox;
};

#endif // EINGABEDIALOG_H

Klasse CPP

Code: Alles auswählen

#include "eingabedialog.h"
#include "ui_eingabedialog.h"

EingabeDialog::EingabeDialog(QWidget *parent) :
    QDialog(parent),
    m_ui(new Ui::EingabeDialog){

    m_ui->setupUi(this);

    nr_von = "DIESER WERT WIRD BEIM AUFRUFEN AUSGEBEN KOMISCHER WEISE";

    Nr_von_LineEdit = new QLineEdit;
    Nr_von_LineEdit = m_ui->Baunummer_von;
    Nr_von_LineEdit->setInputMask("999");

    Nr_bis_LineEdit = new QLineEdit;
    Nr_bis_LineEdit = m_ui->Baunummer_bis;
    Nr_bis_LineEdit->setInputMask("999");

    Fehler_1_LineEdit = new QLineEdit;
    Fehler_1_LineEdit = m_ui->Fehler_1;
    Fehler_1_LineEdit->setInputMask("HHHH");

    Fehler_2_LineEdit = new QLineEdit;
    Fehler_2_LineEdit = m_ui->Fehler_2;
    Fehler_2_LineEdit ->setInputMask("HHHH");

    ButtonBox = new QDialogButtonBox;
    ButtonBox = m_ui->buttonBox;

    connect(ButtonBox, SIGNAL(accepted()), this, SLOT(einlesen()));
}

EingabeDialog::~EingabeDialog()
{
    delete m_ui;
}

void EingabeDialog::changeEvent(QEvent *e)
{
    QDialog::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
        m_ui->retranslateUi(this);
        break;
    default:
        break;
    }
}


QString EingabeDialog::getNr_von(){
    return nr_von;
}
void EingabeDialog::setNr_von(QString sNr_von){
    nr_von = sNr_von;
}

void EingabeDialog::einlesen(){
    //nr_von = Nr_von_LineEdit->text();
    //nr_bis = Nr_bis_LineEdit->text();
    //fehler_1 = Fehler_1_LineEdit->text();
    //fehler_2 = Fehler_2_LineEdit->text();
    setNr_von("TEST ANZEIGE");
}
Mani99
Beiträge: 244
Registriert: 15. April 2009 10:46
Wohnort: München

Beitrag von Mani99 »

Wie reagierst du im parent (hauptfenster) auf den dialog?
Alex66955
Beiträge: 56
Registriert: 23. September 2009 14:48

Beitrag von Alex66955 »

Hab mal ein wenig aufgeräumt das nur die relevanten Daten angezeigt werden

Code: Alles auswählen

#include "logviewer.h"
#include "ui_logviewer.h"


LogViewer::LogViewer(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::LogViewer){
    ui->setupUi(this);

    CloseAction = new QAction(this);
    CloseAction = ui->CloseAction;

    OpenAction  = new QAction(this);
    OpenAction  = ui->OpenAction;

    ResetAction = new QAction(this);
    ResetAction = ui->ResetAction;

    SuchenAction = new QAction(this);
    SuchenAction = ui->SuchenAction;
    SuchenAction->setEnabled(false);

    Main_TextEdit = new QTextEdit();
    Main_TextEdit = ui->Main_TextEdit;
    Main_TextEdit->setEnabled(false);

    Verzeichnis_Label = new QLabel;
    Verzeichnis_Label = ui->Verzeichnis_Label;
    
    EingabeDialog *in_Dialog = new EingabeDialog(this);

    connect(SuchenAction, SIGNAL(triggered()), in_Dialog, SLOT(show()));

}

void LogViewer::suchen(){
    in_Dialog->show();
    EingabeDialog test;
    QString hier = test.getNr_von();
}
 
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

Was versuchst du da?

Du legst dir ein neues Objekt an und versuchst aufd die Daten zuzugreifen => ja dann sind die Standard daten da drin!

Wenn du das so verwenden wilklst dann solltest dir deinen Dlg als Singleton iplementieren.
Ansonsten würde dir noch die Möglichkeit bleiben den Dlg Ptr als Member zu speichern und so auf deinen Dlg zu zgreifen!


Kompiliert der Code überhaupt????

Code: Alles auswählen

LogViewer::LogViewer(QWidget *parent) 
    : QMainWindow(parent), ui(new Ui::LogViewer){
...
EingabeDialog *in_Dialog = new EingabeDialog(this);
....}

Code: Alles auswählen

void LogViewer::suchen(){ 
    in_Dialog->show();
Der kann in Dialog doch gar nicht kennen!?!?!?!

Und dein TstDlg != in_Dialog!!!!
Alex66955
Beiträge: 56
Registriert: 23. September 2009 14:48

Beitrag von Alex66955 »

Also der Code wird compiliert und bringt mir keine Fehlermeldung.
Sowas habe ich mir schon gedacht. Habe versucht mit "in_Dialog.getNr_von()" auf die Variabeln des erstellten Objekt zuzugreifen aber das bringt mich auch nicht weiter. Mir fehlt einfach der Ansatz. Wie funktioniert denn das zugreifen per Singleton bzw als Member speichern?

Wäre echt hilfreich.

Gruss Alex.
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

In Logviewer.h machst dir eine Membervariable( meinKlass *ptrKlasse) vom Typ des Dialoges.
Im Konstruktur weist den dann zu. Dann kannst von überall aus drauf zugreifen.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Also der Code wird compiliert und bringt mir keine Fehlermeldung.
In diesem Fall wirst du drei(!) Variabeln für den Dialog haben:

Code: Alles auswählen

LogViewer::LogViewer(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::LogViewer){
   
    ...
    EingabeDialog *in_Dialog = new EingabeDialog(this); // Instanz eins
    ...
}

void LogViewer::suchen(){
    in_Dialog->show();           // Istanz zwei (uninitialisierte private Variabel)
    EingabeDialog test;          // Instanz drei
    QString hier = test.getNr_von();
} 
Ich glaube eher, du brauchst gar keinen privaten Member;

Code: Alles auswählen

// beim Dialog:
QString EingabeDialog::getNr_von(){
    return Nr_von_LineEdit->text(); 
} 

// in der Mainview:
void LogViewer::suchen(){
    EingabeDialog test;                     // Erstellen
    test.show();                               // Anzeigen
    test.exec();                                // Eingaben abwarten
    QString hier = test.getNr_von();   // Eingaben auslesen
} 
Alex66955
Beiträge: 56
Registriert: 23. September 2009 14:48

Beitrag von Alex66955 »

Ich glaubs nicht solarix so funktioniert es und so simple. Sitze seit zwei wochen an dieser Sache und bin nicht weitergekommen.

Vielen vielen Dank so macht das alles viel mehr spaß :D.


Gruß Alex
Antworten