PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wie auf Objekte einer fremden Klasse zugreifen??



fraggo01
18-08-2004, 18:39
Hi,

ich hoffe der Titel ist richtig gewählt. :D



Also, ich will im QT Designer aus einer selbstgeschriebenen Klasse auf ein QLineedit aus dem mainform zugreifen.

settings.h

#include <qsettings.h>
#include "tvtool.h"

class Set
{
QSettings* settings;
//mainform* m;
public:

void writechannel();
};

settings.cpp

#include "settings.h"
#include "tvtool.h"
#include <qdir.h>
#include <qlineedit.h>
#include <qlistbox.h>

void Set::writechannel()
{
settings = new QSettings();
settings -> insertSearchPath( QSettings::Unix, QDir::homeDirPath() );
settings -> beginGroup( ".TVgrabTool" );
settings -> writeEntry( "/Channels/" + mainform::kanalname.text(), mainform::kanal_ID.text() );
//m = new mainform;
mainform::kanalliste.insertItem( mainform::kanalname.text(), -1);
delete settings;
}

fehler beim kompilieren:

g++ -c -pipe -Wall -W -O2 -fomit-frame-pointer -pipe -march=i586 -mcpu=pentiumpro -DQT_NO_DEBUG -DQT_SHARED -DQT_THREAD_SUPPORT -I/usr/lib/qt3/mkspecs/default -I. -I/usr/lib/qt3//include -I.ui/ -I. -I.moc/ -o .obj/settings.o settings.cpp
settings.cpp: In member function `void Set::writechannel()':
settings.cpp:12: error: type `mainform' is not a base type for type `Set'
settings.cpp:12: error: type `mainform' is not a base type for type `Set'
settings.cpp:14: error: type `mainform' is not a base type for type `Set'
settings.cpp:14: error: type `mainform' is not a base type for type `Set'
make: *** [.obj/settings.o] Fehler 1

anda_skoa
18-08-2004, 22:17
Du musst ansich nur einen Pointer in der Klasse bekannt machen, zB im Konstruktor übergeben:



class Set
{
public:
Set(mainform* m) : m_mainfor(m) {}

private:
mainform * m_mainform;
};


Ciao,
_

fraggo01
19-08-2004, 10:40
Funktioniert irgendwie nicht...


settings.h:

#include <qsettings.h>
#include "tvtool.h"


class Set
{
QSettings* settings;
mainform * m_mainform;
//mainform* m;
public:
Set(mainform* m) : m_mainform(m) {}
void writechannel();
};

settings.cpp:

#include "tvtool.h"
#include <qdir.h>
#include <qlineedit.h>
#include <qlistbox.h>

void Set::writechannel()
{
settings = new QSettings();
settings -> insertSearchPath( QSettings::Unix, QDir::homeDirPath() );
settings -> beginGroup( ".TVgrabTool" );
settings -> writeEntry( "/Channels/" + m_mainform->kanalname->text(), m_mainform->kanal_ID->text() );
//m = new mainform;
m_mainform->kanalliste->insertItem( m_mainform->kanalname->text(), -1);
delete settings;
}

So rufe ich die Klasse auf:

Set wt;
wt.writechannel();


Fehler:

In file included from .ui/tvtool.cpp:30:
tvtool.ui.h: In member function `virtual void mainform::kanal_add_clicked()':
tvtool.ui.h:381: error: no matching function for call to `Set::Set()'
settings.h:6: error: candidates are: Set::Set(const Set&)
settings.h:12: error: Set::Set(mainform*)
make: *** [.obj/tvtool.o] Fehler 1



Na ja, ich werd mir mal konstruktor und destruktor genau anschauen, das ist mir alles noch ziemlich schleierhaft...


EDIT:
Ich hab mal noch einen standard konstruktor "Set();" in die klasse eingefügt. jetzt kommt der fehler:

.obj/tvtool.o(.text+0x628c): In function `mainform::kanal_add_clicked()':
: undefined reference to `Set::Set[in-charge]()'
collect2: ld returned 1 exit status

undefined
19-08-2004, 12:35
undefined reference to `Set::Set[in-charge]()'
Die Klasse erwartet Parameter für den Konstruktor ;)
zu dem würde mich Interessieren wie du dein Projekt erstellt (KDevelop oder nur QT?) hast, wegen dem Linker Fehler.

fraggo01
19-08-2004, 12:49
Die Klasse erwartet Parameter für den Konstruktor

Aber ich hab doch den Konstruktor ohne Parameter in der Klasse angegeben (Set())..



Mit QT(-designer)

mit qmake und dann make

fraggo01
19-08-2004, 13:38
Irgendwie verstehe ich den sinn des konstruktors "Set(mainform* m) : m_mainform(m) {}" nicht..

hab das mal ausprobiert, kompiliert ohne fehler durch aber das programm stürtzt mit einem Segmantation Fault ab, wenn ich die klasse per button aufrufe:

settings.h:

#include <qsettings.h>
#include "tvtool.h"


class Set
{
QSettings* settings;
mainform* m_mainform;
//mainform* m;
int a;
public:
//Set();
//Set(mainform* m) : m_mainform(m) {}
void writechannel();
};

settings.cpp:

#include <qdir.h>
#include <qlineedit.h>
#include <qlistbox.h>


void Set::writechannel()
{
settings = new QSettings();
settings -> insertSearchPath( QSettings::Unix, QDir::homeDirPath() );
settings -> beginGroup( ".TVgrabTool" );
settings -> writeEntry( "/Channels/" + m_mainform->kanalname->text(), m_mainform->kanal_ID->text() );
//m = new mainform;
m_mainform->kanalliste->insertItem( m_mainform->kanalname->text(), -1);
delete settings;
}

So rufe ich die Klasse auf:

void mainform::kanal_add_clicked()
{
/*QSettings* settings;
settings = new QSettings();
settings -> insertSearchPath( QSettings::Unix, QDir::homeDirPath() );
settings -> beginGroup( ".TVgrabTool" );
settings -> writeEntry( "/Channels/" + kanalname->text(), kanal_ID -> text() );
kanalliste -> insertItem( kanalname->text(), -1);
delete settings;*/

Set wt;
wt.writechannel();
}

EDIT:
Hab mal das objekt m_mainform nicht als zeiger auf mainform gemacht.
Jetzt funktioniert die klasse soweit, das QSettings aufgerufen wird und die konfiguration geschrieben wird.
Nur

m_mainform->kanalliste->insertItem( m_mainform->kanalname->text(), -1);
funktioniert nicht...

anda_skoa
19-08-2004, 16:16
Irgendwie verstehe ich den sinn des konstruktors "Set(mainform* m) : m_mainform(m) {}" nicht..


Damit du den mainform Pointer in Set zur Verfügung hast?
Soll der Pointer durch schwarze Magie gesetzt werden?

Könnte zwar klappen (kenn mich mit schwarzer Magie nicht so aus), aber normalerweise wird man vermutlich bei Erzeugung der Set Instanz einfach den entsprechende Pointer an den Konstruktor übergeben. :rolleyes:

Ciao,
_

fraggo01
19-08-2004, 20:07
Danke für eure hilfe, han es leider trotzdem ncht hinbekommen.
Ich habe jetzt ne andere lösung gefunden...

anda_skoa
21-08-2004, 06:00
Danke für eure hilfe, han es leider trotzdem ncht hinbekommen.


Sagen wir du erzeugst die Instanz von Set in MainWindow



Set s(this);


Nicht so schwierig oder?

Ciao,
_