Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: klasse binnen klasse aanroepen  (gelezen 2767 keer)

hosti

  • Gast
klasse binnen klasse aanroepen
« Gepost op: 2008/11/14, 16:13:31 »
Ik heb een simpel vraagje maar ik heb geen idee wat de simpele oplossing kan zijn:

Ik heb 2 verschillende Qt4 klassen waarin de GUI en wat functies gedefinieerd staan. Ik kan deze 2 verschillende GUI's zonder probleem oproepen vanuit de main van mijn programma.

Bon. Nu zou ik willen dat ik in een bepaalde void (parameters) van mijn EERSTE klasse de tweede klasse kan aanroepen.. maar natuurlijk is de 2° klasse niet gekend in de eerste klasse.

Iemand enig idee?

Iwein



Offline dvdmeer

  • Lid
    • Python-RandR :: dvdmeer.nl
Re: klasse binnen klasse aanroepen
« Reactie #1 Gepost op: 2008/11/14, 16:40:32 »
Je kan de tweede klasse als object meegeven aan de eerste klasse in je main. Dan dien je wel eerst die tweede klasse aangemaakt te hebben.

Om een simpel voorbeeldje te geven:
Main:
klasse2 = Klasse2()
klasse1 = Klasse1(klasse2)

Maar er zijn meerdere wegen die naar Rome leiden... dit is niet de enige mogelijkheid.
« Laatst bewerkt op: 2008/11/14, 16:42:09 door dvdmeer »
Python-randr Versie 0.9.1 (Update 26-04-11)

hosti

  • Gast
Re: klasse binnen klasse aanroepen
« Reactie #2 Gepost op: 2008/11/14, 16:53:54 »
hmm... toch graag een beter oplossing. diegene die je voorstelt heeft het nadeel dat die eerste klasse al gecreeerd moet zijn + het doorgeven van die klasse als argument blijkt hier ook niet zo eenvoudig te zijn :(

Offline dvdmeer

  • Lid
    • Python-RandR :: dvdmeer.nl
Re: klasse binnen klasse aanroepen
« Reactie #3 Gepost op: 2008/11/14, 17:01:13 »
Maar je hebt dus wel een main, klasse1 en klasse2?

Klasse1 wilt functies in klasse2 aanroepen...
Ik weet niet precies wat voor code erin staat maar je zou ook klasse2 in klasse1 kunnen aanmaken, en in de main alleen klasse1. Maar zonder code kan ik niet echt dé oplossing geven.

hosti

  • Gast
Re: klasse binnen klasse aanroepen
« Reactie #4 Gepost op: 2008/11/14, 17:14:19 »
De CPP van beiden:

hoofdvensterImpl::hoofdvensterImpl( QWidget * parent, Qt::WFlags f)
   : QMainWindow(parent, f)
{
   setupUi(this);
   
   vraagROI->hide();
   
   connect(actionFull_screen_modus, SIGNAL(toggled(bool)), this, SLOT(FullScreenModus(bool)));
   connect(actionLaad_bestanden_uit_directory, SIGNAL(toggled(bool)), this, SLOT(ShowDirs(bool)));
   connect(lstAfbeeldingen, SIGNAL(itemClicked(QListWidgetItem *)), this, SLOT(toonSelected(QListWidgetItem *))); ........... }


NieuweTagImpl::NieuweTagImpl( QWidget * parent, Qt::WFlags f)
   : QMainWindow(parent, f)
{
   setupUi(this);
}

De *h van beiden:

class hoofdvensterImpl : public QMainWindow, public Ui::hoofdvenster
{
Q_OBJECT
public:
   hoofdvensterImpl(QWidget * parent = 0, Qt::WFlags f = 0 );

   //newTagImpl t;

private slots:

void RunOCR();
void init();
void FullScreenModus(bool aan);
void LaadBestanden(QString Dir);
void toonSelected(QListWidgetItem *i);
QPixmap getHisto(QPixmap p);

QPixmap MediaanFiltering(QPixmap p, int win, int ite);
float BerekenenMediaan(QVector <int> in);
QPixmap Binarisation(QPixmap p, int T, int window);
QPixmap ConnectedLines4(QPixmap p, int lTH);
QPixmap DrawBB(QPixmap in, int kleurID);
QPixmap RLSA(QPixmap p, int Thr);
double CalScrewAngle(QPixmap rl, int d);
QVector<int> findPoint(QPixmap p, int x1, int y1, int x2, int y2, int d, int point);

private:

      //tekeningen
QGraphicsPixmapItem* orig;
QPixmap blanco;

      //bounding boxes
QVector<int> bbLeftX;
QVector<int> bbLeftY;   
QVector<int> bbRightX;
QVector<int> bbRightY;

};

class NieuweTagImpl : public QMainWindow, public Ui::NieuweTag
{
Q_OBJECT
public:
   NieuweTagImpl( QWidget * parent = 0, Qt::WFlags f = 0 );
private slots:
};

Offline dvdmeer

  • Lid
    • Python-RandR :: dvdmeer.nl
Re: klasse binnen klasse aanroepen
« Reactie #5 Gepost op: 2008/11/14, 17:45:45 »
Als ik het goed zie heb je de volgende 2 klasses:

hoofdvensterImpl
NieuweTagImpl

Beide klasses maken een GUI.

Het wordt me uit deze code niet duidelijk waarom de twee klasses van elkaar af moeten weten. Ook zie ik de main functie niet.

Ik denk dat je misschien het beste een klassediagram kan opstellen. Want je zal denk ik een aparte klasse moeten maken met de data. In de main waar je klasse1 en klasse2 aanmaakt geef je de dataklasse mee aan de constructor.

Re: klasse binnen klasse aanroepen
« Reactie #6 Gepost op: 2008/11/15, 20:17:38 »
Klein voorbeeld:
class Foo;
class Bar;

class Foo {
  public:
  Foo();
  virtual ~Foo();
  void setBar(Bar * bar) { this->bar=bar}
  private:
  Bar * bar; // a cute elephant, BTW
}

class Bar {
  public:
  Bar();
  virtual ~Bar();
  void setFoo(Foo * foo) { this->foo=foo}
  private:
  Foo * foo;
}

int main() {
Foo f;
Bar b;
f->setBar(&b);
b->setFoo(&f)
// or, with pointers:
Foo * f2;
Bar * b2;
f2 = new Foo();
b2 = new Bar();
f2->setBar(b2);
b2->setFoo(b1);

return 0; // for idiot -- read MS -- compilers.
}

Dat zou het moeten doen.
I use a Unix-based system, that means I'll get laid as often as I have to reboot.
LibSylph
SeySayux.net

Offline profoX

  • Lid
    • wesley
    • Lionslink
Re: klasse binnen klasse aanroepen
« Reactie #7 Gepost op: 2008/11/15, 21:34:21 »
Dat is min of meer correct, minus de typfouten en indien je met pointers werkt en objecten op de heap aanmaakt ze ook weer deleten... ik wou eigenlijk alleen maar zeggen dat interactie tussen verschillende klassen misschien wel makkelijker is door gebruik te maken van Qt Signals/Slot Connections als je toch Qt 4 gebruikt.
« Laatst bewerkt op: 2008/11/15, 21:36:07 door profoX »
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)

hosti

  • Gast
Re: klasse binnen klasse aanroepen
« Reactie #8 Gepost op: 2008/11/16, 15:43:46 »
hmmja.. ik heb de oplossing zelf al gevonden. declareer gewoon de twee klassen in 1 cpp file en roep in de 2° klasse de eerste gewoon op. Het probleem dat ik dan wel krijg is dat ik geen lokale info van klasse 1 kan doorgeven naar klasse 2.... ter verduidelijking:

klasse 1 en 2 zijn GUI's

in klasse 1 springt een signal naar een slot waarin staat dat de 2° GUI weergegeven moet worden (wat idd gebeurt).
Probleem is dat er vanuit die 2° GUI een signal zou moeten komen dat verwijst naar een slot in klasse 1 zodat de desbetreffende parameters geupdated kunnen worden.

Meervoudige overerving zou -denk ik wel-de oplossing zijn maar QDevelop lijkt die niet te accepteren, tenzij ik een nieuwe (3°) klasse definieer
class blablabla : public klasse1, public klasse 2

Weet er soms iemand een voorbeeldje staan waarin met QT4 een GUI weergegeven word, die na het klikken op bv. een commandbutton een 2° (modal, modeless) invoerscherm weergeeft?

Ikzelf ben nogal een voorstander geworden van die Qt Signals/Slot Connections.. enig idee hoe ik een slot van een andere klasse bind aan een signal van een andere klasse? (dit is de essentie van mijn probleem)

In bijlage de eerste GUI. na het drukken op een klopje zou een 2° GUI enkele papameters moeten vragen - ANALOOG aan met het ingeven van een nieuwe email in evolution

[verwijderd door de beheerder]
« Laatst bewerkt op: 2008/11/16, 15:48:51 door iwein »

Offline profoX

  • Lid
    • wesley
    • Lionslink
Re: klasse binnen klasse aanroepen
« Reactie #9 Gepost op: 2008/11/16, 18:20:13 »
De manier waarop je dat gaat doen hangt eigenlijk een beetje af van je huidige code...
Indien het een open source project is wil ik er wel eens naar kijken, anders probeer ik wel een algemeen voorbeeldje te maken.

edit: in dit geval is dit wss de beste oplossing: een connection in de 1e GUI aanmaken na het aanmaken / voor het aanroepen van de 2e GUI
edit2: bij nader inzien zou die connection in jouw geval misschien beter in die ene cpp file staan waar je de 2 GUI's aanmaakt, dus na het aanmaken van de 2 GUI's en voor het aanroepen/weergeven van de eerste GUI.. :P
« Laatst bewerkt op: 2008/11/16, 18:47:46 door profoX »
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)

hosti

  • Gast
Re: klasse binnen klasse aanroepen
« Reactie #10 Gepost op: 2008/11/16, 19:55:20 »
probeer als het kan eens een simpel voorbeeldje aan te maken. Je kan namelijk geen sloten en signalen uitwisselen tussen klassen dacht ik

Offline profoX

  • Lid
    • wesley
    • Lionslink
Re: klasse binnen klasse aanroepen
« Reactie #11 Gepost op: 2008/11/16, 23:19:31 »
tuurlijk kan dat wel.. het zijn allebei QObjects dus kunnen ze sowieso met elkaar 'praten' via Qt signals.
een klein voorbeeldje, uit mijn hoofd, dus wellicht niet 100% correct..

Gui1 gui1;
Gui2 gui2;
QObject::connect(gui2, SIGNAL(newMessage(const QString &)), gui1, SLOT(changeMessage(const QString &)));

...

class Gui1 : SomeQObject {
public slots:
  void changeMessage(const QString &msg);
};

...

class Gui2 : SomeQObject {
signals:
  void newMessage(const QString &msg);
};

(misschien is het trouwens beter om gui2 pas aan te maken en aan te roepen wanneer nodig in gui1 om geheugen te besparen)

edit: natuurlijk moet je ergens in Gui2 dan wel emit(newMessage(someQString)); doen
« Laatst bewerkt op: 2008/11/19, 11:34:06 door profoX »
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)

Offline profoX

  • Lid
    • wesley
    • Lionslink
Re: klasse binnen klasse aanroepen
« Reactie #12 Gepost op: 2008/11/18, 06:18:36 »
Werkt het? ??? :P
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)

hosti

  • Gast
Re: klasse binnen klasse aanroepen
« Reactie #13 Gepost op: 2008/11/19, 10:30:44 »
jep, die truk met die slots gaf de oplossing!  =D

[verwijderd door de beheerder]

hosti

  • Gast
Re: klasse binnen klasse aanroepen
« Reactie #14 Gepost op: 2008/11/19, 16:18:55 »
Om te zien hoe cool QT is: kijk naar mij zojuist gemaakte loep in het OCR programma  =D =D =D

[verwijderd door de beheerder]

Offline profoX

  • Lid
    • wesley
    • Lionslink
Re: klasse binnen klasse aanroepen
« Reactie #15 Gepost op: 2008/11/19, 16:54:43 »
cool! en mij hoef je daar niet van te overtuigen ^-^ ben zelf ook een Qt 4 gebruiker =D
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)