Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bekanntmachung eines Objekts



sxe
19-07-2005, 13:42
Hi zusammen

Es sind seit heute Semesterferien und da habe ich mir gedacht versuche ich mich doch
mal ein wenig an c++. Habe schon gewisse Erfahrung mit c und Java, deswegen bin ich wohl kein
Programmieranfänger mehr. Das ich aber wirklich gut programmieren kann will ich nun auch wieder nicht
behaupten. o_0


Nun zu meinem Problem

Ich habe eine kleine Anwendung mit kdev "geschrieben", was mit hilfe des einsteiger
Tutorials auch nicht so schwer war. Zumindest mit der nötigen Motivation nicht. :]

Mein Problem liegt jetzt aber in der OOP .. Ich habe eine GUI erstellt und kann den
Knöpfen auch Aktionen zuweisen. Das Problem ist allerdings, dass ich nur aus der zum
Knopf gehörenden Funktion die anderen GUI Elemente ansprechen kann. Schreibe ich eine
andere Funktion und will dann von da, z.B. Text in ein Textfeld schreiben, dann findet
er das Element aus der Funktion herraus nicht. Ist mir auch halbwegs klar, dass der anderen
Funktion mein GUI Element nicht bekannt ist. Ich schaffs allerdings nicht das zu ändern.
Wenn jemand als Erfahrung im Umgang mit kdev und QT hat wäre ich für ein paar Tieps dankbar.


/*$SPECIALIZATION$*/
void kajguiWidget::button_clicked()
{

if ( label->text().isEmpty() )
{
label->setText( "Hello World!" );

}
else
{
label->clear();
}

}
(Es geht darum "label" in einer anderen Funktion nutzen zu können)

bye

Andy

Deever
19-07-2005, 20:52
Bitte?
Hast du denn 'label' überhaupt in der Klassendefinition aufgeführt?

Gruß,
/dev

sxe
19-07-2005, 21:01
Also .. das Label hat mir ja der GUI editor angelegt und taucht so nicht in den cpp
Dateien auf. Ich weiss auch nicht wo ich da was bekannt machen muss.

undefined
19-07-2005, 21:06
void kajguiWidget::button_clicked()
Wenn ich das richtig sehe ist diese Funktion ein SLOT.
Zeige bitte mal den Konstruktor, so kann man nichts schreiben.

#ifndef _SLOTDEFINITIONEN_H_
#define _SLOTDEFINITIONEN_H_

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <kmainwindow.h>

class QLabel;
class QPushButton;
class QGridLayout;

class SlotDefinitionen : public KMainWindow
{
Q_OBJECT

protected:
QGridLayout *Layout;
QLabel *label;
QPushButton *btn;

public:
SlotDefinitionen();
virtual ~SlotDefinitionen();

public slots:
void machwas();

};

#endif // _SLOTDEFINITIONEN_H_


#include "slotdefinitionen.h"

#include <qlabel.h>
#include <qlayout.h>
#include <qpushbutton.h>

#include <kmainwindow.h>
#include <klocale.h>
#include <kdebug.h>

SlotDefinitionen::SlotDefinitionen() : KMainWindow( 0, "SlotDefinitionen" )
{
Layout = new QGridLayout( this, 1, 1, 11, 6, "Layout");

label = new QLabel( "Hello World", this, "hello label" );
Layout->addWidget( label, 0, 0 );

btn = new QPushButton( this, "Button" );
btn->setText( "Sende" );
Layout->addWidget( btn, 1, 0 );

connect( btn, SIGNAL( clicked() ), this, SLOT( machwas() ) );
}

void SlotDefinitionen::machwas()
{
label->setText( "machwas()" );
kdDebug() << "Signal cklicked() wurde aufgerufen." << endl;
}

SlotDefinitionen::~SlotDefinitionen()
{}

#include "slotdefinitionen.moc"

anda_skoa
20-07-2005, 13:18
Also .. das Label hat mir ja der GUI editor angelegt und taucht so nicht in den cpp
Dateien auf. Ich weiss auch nicht wo ich da was bekannt machen muss.


In diesem Fall hat es uic als public Member angelegt, also kein Problem.
Sollte daher in jeder Methode dieser Klasse benutzbar sein.

Ciao,
_

sxe
20-07-2005, 15:07
Tag .. erstmal danke für die Hilfe.

Ich habe folgende Dateien.

1. main.cpp


#include "kajgui.h"
#include <kapplication.h>
#include <kaboutdata.h>
#include <kcmdlineargs.h>
#include <klocale.h>

static const char description[] =
I18N_NOOP("A KDE KPart Application");

static const char version[] = "0.1";

static KCmdLineOptions options[] =
{
// { "+[URL]", I18N_NOOP( "Document to open" ), 0 },
KCmdLineLastOption
};

int main(int argc, char **argv)
{
KAboutData about("kajgui", I18N_NOOP("kajgui"), version, description,
KAboutData::License_GPL, "(C) 2005 sxe", 0, 0, "xx");
about.addAuthor( "sxe", 0, "xx" );
KCmdLineArgs::init(argc, argv, &about);
KCmdLineArgs::addCmdLineOptions( options );
KApplication app;
kajgui *mainWin = 0;

if (app.isRestored())
{
RESTORE(kajgui);
}
else
{
// no session.. just start up normally
KCmdLineArgs *args = KCmdLineArgs::parsedArgs();

/// @todo do something with the command line args here

mainWin = new kajgui();
app.setMainWidget( mainWin );
mainWin->show();

args->clear();
}

// mainWin has WDestructiveClose flag by default, so it will delete itself.
return app.exec();
}



2. kajguiwidget.cpp

#include <qlabel.h>

#include "kajguiwidget.h"
#include <klistview.h>

#include <stdio.h>
#include <libxml/xmlreader.h>

char* attr;


kajguiWidget::kajguiWidget(QWidget* parent, const char* name, WFlags fl)
: kajguiWidgetBase(parent,name,fl)
{}

kajguiWidget::~kajguiWidget()
{}


static void
test(const char *filename) {

// hier ist label nicht verfügbar..

}

/*$SPECIALIZATION$*/
void kajguiWidget::button_clicked()
{

if ( label->text().isEmpty() )
{
label->setText( "Hello World!" );

}
else
{
label->clear();
}

}



#include "kajguiwidget.moc"


3. kajgui.cpp

#include <kmainwindow.h>
#include <klocale.h>

#include "kajgui.h"
#include "kajguiwidget.h"

kajgui::kajgui()
: KMainWindow( 0, "kajgui" )
{
setCentralWidget( new kajguiWidget( this ) );
}

kajgui::~kajgui()
{
}

#include "kajgui.moc"

Bei 2. ist Label in der Funktion test nicht verfügbar. Zusätzlich habe ich noch eine ui
datei kajguiwidgetbase.ui.

Ich hoffe das hilft weiter.

bye

anda_skoa
20-07-2005, 18:49
Ja, ist logisch, die Funktion test gehört ja auch nicht zur Klasse kajguiWidget.

Wenn du eine Methode draus machst, ist dort label auch sichtbar.

Wenn du aus unerfindlichen Gründen einen reine C Funktion brauchen solltest, könntest du das Label als Parameter mitübergeben.

Ciao,
_

sxe
20-07-2005, 23:24
Hi

Wie schon oben gesagt kenne ich mich mit c++ nicht aus. Ich habe die Funktion
einfach wie ich es aus c gewöhnt bin angelegt. Kannst du mir ein Beispiel
geben wie man eine Methode in c++ anlegt?

Danke

anda_skoa
22-07-2005, 11:40
Kein Problem :)

Du mußt ansich nur die Funktion als Teil der Klasse deklarieren, also den Funktionsprototyp innerhalb der class {}; Deklaration einfügst


class kajguiWidget : public kajguiWidgetBase
{
private:
void test(const QString& filename);
};

mal als private deklariert.

In der .cpp Datei dann wie jede andere Klassenfunktion, bzw. jetzt Methode genannt, implementieren


void kajguiWidget::test(const QString& filename)
{
}


Man kann natürlich wie in C auch mit unabhängigen Funktionen arbeiten und alle nötigen Parameter übergeben, aber üblicherweise verändern Funktionen ohnehin nur wieder den Zustand eines Objekts und können daher Methoden der jeweiligen Klasse sein.

Ciao,
_