AnfängerFrage zu Klassenübergreifenden Variablen



  • Danke schonmal.

    Was wäre denn dann ein gutes C++ Buch???





  • Ich blick da immernoch nicht durch...

    gibts da ne anständige Bezeichnung für damit ich mal im Internet nach einer Doku oder Anleitung suchen kann?



  • Nö, das ist doch ganz normale objektorientiertung in C++. Schau dir doch einfach mal fremden Code an. Diesen Debuggen und schauen was passiert, kann auch helfen. Ohne Literatur oder fremden Code durchstöbern, wird das sonst nichts. Sind wirklich Basics, die man irgendwann drauf hat. Das es beim ersten Versuch nicht Klick macht, sollte einen aber auch nicht demotivieren. Das dürfte bei vielen Anfänger so sein.



  • Es gibt auch Online-Tutorials.
    http://tutorial.schornboeck.net/oop2.htm
    Bücher sind natürlich besser.



  • GT schrieb:

    Ich blick da immernoch nicht durch...

    gibts da ne anständige Bezeichnung für damit ich mal im Internet nach einer Doku oder Anleitung suchen kann?

    Nein, da es eine absolute Grundlage ist und diese in jedem sinnvollen Buch beschrieben ist wenn man keine Seite unterschlägt.

    Aber um es dir mal in Nicht-C++ zu erklären, da es für manche einfacher ist (Wobei ich mich frage ob du nicht ein Troll bist der sich nur anstellt):

    1. Begriff Klasse/Objekt
    Eine der wichtigsten Grundlagen um überhaupt das ganze zu verstehen ist schon mal der Unterschied zwischen Klasse und Objekt zu verstehen. Wenn ich dich z.B. nach deinem Computer frage, verstehst du was ich mit dem Begriff Computer meine, obwohl ich dir keine genaue Beschreibung gegeben habe. Unser Gehirn abstrahiert und somit hast du eine Vorstellung davon, obwohl ich dir keine genauen Details nenne. Diese Abstrakte Vorstellung ist eine Klasse.

    Wenn du aber dann eine konkrete Beschreibung ablieferst so redest du von einem ganz konkreten Computer. Etwas ganz konkretes ist ein Objekt.

    Kurz: Eine Klasse beschreibt nur aus was sich ein Objekt zusammensetzt, ist aber nur eine Schablone. Ein Objekt ist eine konkrete Umsetzung einer Klasse, eine sogenannte "Instanz".

    2. Wie kommunizieren Objekte?
    Dies ist deine Frage nach dem Zugriff auf eine Variable eines anderen Objektes (nicht Klasse!). Nehmen wir mal ein ganz lächerliches und völlig weltfremdes Beispiel:

    Das Objekt "GT" der Klasse Person möchte seinen CD-Spieler (Objekt: Konkreter CD Spieler, definiert z.B. durch Marke/Farbe...; Klasse "CDSpieler") anstellen.

    So... damit das klappt musst du den CD-Spieler ja auch kennen. Dir wird es schwerfallen etwas anzustellen das du nicht kennst. In der Objektorientierung gibt es nun mehrere Möglichkeiten es dir bekannt zu geben. Nehmen wir einfach mal an du siehst es:

    [Alles in Pseudo C++ und nicht vollständig]

    CDSpieler DeinCDSpieler;
    Person GT;
    GT.Sehen(DeinCDSpieler);

    Innerhalb der Sehenmethode hast du nun kenntnis von dem CD-Spieler. Nun kannst du dir z.B. in deinem Gedächstnis merken das es diesen gibt (Membervariable) und später diesen Verwenden.

    class Person
    {
      private:
        map<string, BekannteObjekte> listeBekannterObjekte;
      //...
    };
    

    Nun ist es also möglich in einer Methode der Klasse Person etwas damit anzustellen.

    void Person::TueEtwas()
    {
      this->listeBekannterObjekte["MeinCDSpieler"].Starte();
    }
    

    Und du kannst auch werte ablesen, z.B. welcher Titel grade gespielt wird:

    Titel titel = this->listeBekannterObjekte["MeinCDSpieler"].GetAktuellenTitel();

    Da du aber nicht wissen solltest wie der CDSpieler innen arbeitet, kannst du nur wie hier dargestellt über Methoden auf die Werte zugreifen. Du verwendest also die vorgegebene Schnittstelle der Klasse. Du schraubst ja wohl nicht deinen CD-Spieler auf und hantierst mit Strommessern etc. um dies herauszufinden.

    So.... Besser verständlich?

    cu André



  • Wenn ich meinen Code poste würdet ihrs mir vieleicht genau an dem erklären???

    So abstrakt bekomme ich das nicht wirklich hin.

    Schaffe ne Funktion in der 1ten Klasse die den String ausliest. Aber die Funktion dann in die 2te zu bekommen stellt für mich ein unüberwindbares hinderniss da.

    Sorry das ichs nicht versteh... aber Danke für die mühe.

    Wenn ich Code Posten kann und ihr ein bisschen Zeit dafür aufwenden könnt dann sagts...



  • nadann poste mal.



  • OK

    MainWindow.h

    #ifndef _MAINWINDOW_H_
    #define _MAINWINDOW_H_
    #include "Ui_MainWindow.h"
    
    //
    //Class for standart things like: File Open, File Save, File Export
    //
    //And for starting drawing in a QWidget
    //
    class 
    MainWindow : public QMainWindow, protected Ui_MainWindow
    {
    	Q_OBJECT
    
    public:
    
    	MainWindow(QWidget* parent = 0, Qt::WindowFlags flags = 0);
    
    public slots:
    
    ////
    ///Function to draw contents of textedit into that widget
    /// 
    	void slotDrawButtonClicked(void);
    };
    #endif
    

    MainWindow.cpp

    #include <QtGui>
    #include "MainWindow.h"
    #include "ParameterToolWidget.h"
    
    MainWindow :: MainWindow(QWidget* parent /* = 0 */, Qt::WindowFlags flags /* = 0 */) : QMainWindow(parent, flags)
    {
    	setupUi(this);
    
    	slotDrawClearButtonClicked();
    
    	connect(OpenTriggered, SIGNAL(triggered()), this, SLOT(slotTriggeredOpen()));
    
    	connect(SaveTriggered, SIGNAL(triggered()), this, SLOT(slotTriggeredSave()));
    
    	connect(m_pButtonClearTextEdit, SIGNAL(clicked()), m_pTextEdit, SLOT(clear()));
    
    	connect(m_pButtonDraw, SIGNAL(clicked()), this, SLOT(slotDrawButtonClicked()));
    
    	connect(m_pButtonClearTextEdit, SIGNAL(clicked()), this, SLOT(slotDrawClearButtonClicked()));
    
    }
    
    void 
    MainWindow::slotDrawButtonClicked(void)
    {
    	QString sTextEditText = m_pTextEdit->toPlainText();
    
    	QFile file( "temp.txt" );
    
    	if ( !file.open( QFile::WriteOnly ) ) 
    	{
    		return;
    	}
    
    	QTextStream textstream( &file );
    
    	textstream << sTextEditText;
    
    	file.close();
    
    	update();
    
    	m_pParameterToolWidget->repaint();
    
    }
    

    ParameterToolWidget.h

    #ifndef _PARAMETERTOOLWIDGET_H_
    #define _PARAMETERTOOLWIDGET_H_
    #include <QBrush>
    #include <QPen>
    #include <QWidget>
    
    ///
    ///Class to Draw contents of textEdit into a widget
    /// 
    class 
    ParameterToolWidget : public QWidget
    {
    	Q_OBJECT
    
    public:
    
    ///
    ///kommt noch
    /// 
        ParameterToolWidget(QWidget *parent = 0);
    
    protected:
    
    ///
    ///PainEvent to draw into the widget
    /// 
    	void paintEvent(QPaintEvent *event);
    
    private:
    
    ///
    ///To set the pen
    /// 
    	  QPen m_pen;
    
    ///
    ///To set the pen
    ///
        QBrush m_brush;
    
    };
    
    #endif
    

    ParameterToolWidget.cpp

    #include <QtGui>
    #include <QRegExp>
    #include <QWidget>
    #include "MainWindow.h"
    #include "ParameterToolWidget.h"
    
    ParameterToolWidget::ParameterToolWidget(QWidget *parent): QWidget(parent)
    {
    	setBackgroundRole(QPalette::Base);
    
    	setAutoFillBackground(true);
    }
    
    void ParameterToolWidget::paintEvent(QPaintEvent * /* event */)
    {
    
    	QPainter painter(this);
    
    	painter.setPen(m_pen);
    
    	painter.setBrush(m_brush);     
    
    	painter.setRenderHint(QPainter::Antialiasing, true);
    
    	QString sTextTempFile;
    
      QFile TempFile( "temp.txt" );
    
    	TempFile.open(QFile::ReadOnly);
    
    	sTextTempFile = TempFile.readAll();
    
    	sTextTempFile = sTextTempFile.simplified();
    
    	if (sTextTempFile.contains("drawText", Qt::CaseInsensitive))
    	{		
    		sTextTempFile = sTextTempFile.mid(9);
    
    		QStringList list1 = sTextTempFile.split(",", QString::SkipEmptyParts);
    
    		QString xKoordinate = list1[0];
    
    		int xKoordinatezahl = xKoordinate.toInt();
    
    		QString yKoordinate = list1[1];
    
    		int yKoordinateZahl = yKoordinate.toInt();
    
    		QString drawText = list1[2];
    
    		painter.drawText(xKoordinatezahl,yKoordinateZahl,drawText);
    
    		update();
    	}
    
    	if  (sTextTempFile.contains("drawLine", Qt::CaseInsensitive))
    	{
    		QRegExp rx("(\\d+)");
    
    		QStringList list;
    
    		int pos = 0;
    
    		while ((pos = rx.indexIn(sTextTempFile, pos)) != -1) 
    		{
    			list << rx.cap(1);
    
    			pos += rx.matchedLength();
    		}
    
    		QString xKoordinate1 = list[0];
    
    		int xKoordinatezahl1 = xKoordinate1.toInt();
    
    		QString yKoordinate1 = list[1];
    
    		int yKoordinatezahl1 = yKoordinate1.toInt();
    
    		QString xKoordinate2 = list[2];
    
    		int xKoordinatezahl2 = xKoordinate2.toInt();
    
    		QString yKoordinate2 = list[3];
    
    		int yKoordinatezahl2 = yKoordinate2.toInt();
    
    		painter.drawLine(xKoordinatezahl1,yKoordinatezahl1,xKoordinatezahl2,yKoordinatezahl2);
    
    		update();
    	}
    
    	if  (sTextTempFile.contains("drawEllipse", Qt::CaseInsensitive))
    	{
    
    		QRegExp rx("(\\d+)");
    
    		QStringList list;
    
    		int pos = 0;
    
    		while ((pos = rx.indexIn(sTextTempFile, pos)) != -1) 
    		{
    			list << rx.cap(1);
    
    			pos += rx.matchedLength();
    		}
    
    		QString xKoordinate1 = list[0];
    
    		int xKoordinatezahl1 = xKoordinate1.toDouble();
    
    		QString yKoordinate1 = list[1];
    
    		int yKoordinatezahl1 = yKoordinate1.toDouble();
    
    		QString xKoordinate2 = list[2];
    
    		int xKoordinatezahl2 = xKoordinate2.toDouble();
    
    		QString yKoordinate2 = list[3];
    
    		int yKoordinatezahl2 = yKoordinate2.toDouble();
    
    		//QRectF rectangle(xKoordinatezahl1, yKoordinatezahl1, xKoordinatezahl2, yKoordinatezahl2);
    
    		QPainter painter(this);
    
    		painter.drawEllipse(xKoordinatezahl1,yKoordinatezahl1,xKoordinatezahl2,yKoordinatezahl2);
    
    		update();
    	}		
    
    	if  (sTextTempFile.contains("drawCircle", Qt::CaseInsensitive))
    	{
    
    		QRegExp rx("(\\d+)");
    
    		QStringList list;
    
    		int pos = 0;
    
    		while ((pos = rx.indexIn(sTextTempFile, pos)) != -1) 
    		{
    			list << rx.cap(1);
    
    			pos += rx.matchedLength();
    		}
    
    		QString xKoordinate = list[0];
    
    		int xKoordinatezahl = xKoordinate.toInt();
    
    		QString yKoordinate = list[1];
    
    		int yKoordinateZahl = yKoordinate.toInt();
    
    		QString Radius = list[2];
    
    		int RadiusZahl = Radius.toInt();
    
    		painter.drawEllipse(xKoordinatezahl - RadiusZahl, yKoordinateZahl - RadiusZahl, RadiusZahl * 2, RadiusZahl * 2);
    
    		update();
    	}		
    
    	if  (sTextTempFile.contains("Segment", Qt::CaseInsensitive))
    	{
    
    		painter.drawEllipse(170 - 170, 170 - 170, 170 * 2, 170 * 2);
    		painter.drawEllipse(170 - 113.33, 170 - 113.33, 113.33 * 2, 113.33 * 2);
    		painter.drawEllipse(340 - 226.66, 340 - 226.66, 56.66 * 2, 56.66 * 2);
    		painter.drawLine(0, 170, 340, 170);
    		painter.drawLine(170, 113.33, 170, 226.66);
    		//painter.drawLine(85, 0, 255, 340);
    		//painter.drawLine(255, 0, 85, 340);
    
    		update();
    	}		
    }
    

    Ja man dürfte ja erkennen das ich es im Moment in einem File zwischen Speicher. Aber wie schon am Anfang gefragt möchte ich das nicht sondern den Inhalt der Variable QString sTextEditText (aus MainWindow.cpp) in ParameterToolWidget.cpp bringen und damit die Temp Datei weglassen. Also der Inhalt von sTextEdit aus MainWindow.cpp soll quasi sTextTempFile aus ParameterToolWidget werden.

    Hoffe das gut erklärt so...



  • GT schrieb:

    OK

    Nichts OK. Leg das verdammte QT-Zeugs weg und lerne die absoluten C++ Grundlagen bevor du dich mit GUI-Design auseinander setzt. Das du in deinen Programm ständig Werte von anderen Objekten veränderst ist dir hoffentlich bewusst (Nein, sonst würdest du ja vielleicht irgendwas verstehen). Ich weiß nicht wie du überhaupt eine QT-Anwendung hinbekommst und sei sie noch so einfach - Obwohl vielleicht ist Kopieren oder Zusammenklicken die richtige Antwort.

    Warum ich überhaupt noch Zeit an jemanden verschwende, der garnicht lernen will, ist eine andere Sache - Weitere Antworten nach dieser kommen nur noch wenn ich sehe das du bereit bist etwas zu lernen, und das bist du bislang nicht (du beschäftigst dich mit Code den du ohne Grundlagen eh nicht verstehst, bist aber auch scheinbar nicht in der Lage dich mal auf eine Grundlegende Einführung C++/Objektorientierung zu stürzen).

    Aber dennoch eine Variante:
    Wenn dein MainWindow eh Zugriff auf das PropertyFenster hat, warum übergibst du nicht den String direkt?

    Auszug aus modifizierter MainWindow.cpp

    ...
    
    void 
    MainWindow::slotDrawButtonClicked(void)
    {
      update();
      m_pParameterToolWidget->SetText(m_pTextEdit->toPlainText());
      m_pParameterToolWidget->repaint();
    }
    

    Auszug aus modifizierter ParameterToolWidget.h

    ...
    class 
    ParameterToolWidget : public QWidget
    {
    	Q_OBJECT
      private:
        QString text;
    
      public:
        void SetText(const QString& text);
    ...
    

    Auszug aus modifizierter ParameterToolWidget.cpp

    void ParameterToolWidget::SetText(const QString& text)
    {
      this->text = text;
    }
    
    void ParameterToolWidget::paintEvent(QPaintEvent * /* event */)
    {
      // Zugriff auf Text nun über text oder this->text
      ...
    

    cu André


Anmelden zum Antworten