Toon posts:

[QT/C++] Informatie tussen widgets doorgeven

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb volgend probleem:
Ik heb een hoofdvenster en als je daar op nieuw drukt krijg je een wizard om informatie in te zamelen: uit bestand inlezen of random. Als dat gebeurd is wordt de informatie in een klasse ingelezen en dan zou het in de lijst op het hoofdvenster moeten verschijnen, maar hoe geef ik met de wizard door dat de gegevens ingelezen werden?

  • whoami
  • Registratie: December 2000
  • Nu online
Callbacks? Functie-pointers? etc....

https://fgheysels.github.io/


Verwijderd

Topicstarter
Gui is in Qt gemaakt met ui.h-methode, dus kan je in constructors en zo zelf niets aanpassen

  • _Squatt_
  • Registratie: Oktober 2000
  • Niet online
Verwijderd schreef op 01 december 2003 @ 19:54:
Gui is in Qt gemaakt met ui.h-methode, dus kan je in constructors en zo zelf niets aanpassen
Je kunt toch je ontworpen klasse als base class gebruiken? Dan kun je toch in de constructor wat signals en slots connecten zodat je wizard aan het hoofdvenster laat weten dat de informatie is ingelezen.

Tenminste, dat is wat ik van een beetje spelen met Qt/KDE heb begrepen.

"He took a duck in the face at two hundred and fifty knots."


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Een wizard is een dialoog van een user-defined class. Hoe je die class ook maakt, je kunt zelf in die class signals toevoegen. Alle informatie kun je dus via een emit(info) uitsturen. Diegene die de wizard maakt weet het type, en dus de signals. De gebruiker kiest dus ook aan welke slots die signals geconnect worden. Dat is expliciet niet de taak van de wizard, anders zou de wizard niet herbruikbaar zijn. De wizard weet niet dat hij de informatie heeft doorgegeven, of aan wie.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Topicstarter
Ik heb het gevonden: het is toch niet zo simpel: je moet een speciale reciever klasse en functie schrijven en dan werkt het wel.

  • ATS
  • Registratie: September 2001
  • Laatst online: 12-02 13:46

ATS

Wat bedoel je met een 'receiver klasse'? Ik gebruik zelf veel Qt, maar zoiets ben ik nog nooit tegengekomen... Ik ben benieuwd naar hoe je het opgelost hebt.

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant


  • ATS
  • Registratie: September 2001
  • Laatst online: 12-02 13:46

ATS

@whoami:
Je reactie slaat niet echt op de vraag, als ik zo vrij mag zijn. Als je zelf als mod mensen er op wijst dat ze off topic reageren, geen goede vragen stellen, etc., dan lijkt het me reëel dat je zelf ook een beetje oplet. In dit geval zijn functiepointers e.d. geen goede oplossing, omdat Qt daar veel effectievere methoden voor heeft. Het is niet erg als je dat niet weet (je kan niet overal verstand van hebben), maar reageer in dat geval ook gewoon niet.

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant


Verwijderd

Topicstarter
receiver.cpp
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <qradiobutton.h>
#include <qspinbox.h>
#include "receiver.h"

void Receiver::setParent( QDialog *parent )
{
        p = parent;
        setAmount();
}
void Receiver::setAmount()
{
        QSpinBox *amount = (QSpinBox *) p->child( "amountSpinBox", "QSpinBox" );

        QRadioButton *radio =  (QRadioButton *) p->child( "stdRadioButton", "QRadioButton" );
        if ( radio && radio->isChecked() ) {
            if ( amount )
                amount->setValue( amount->maxValue() / 2 );
            return;
        }

        radio =  (QRadioButton *) p->child( "noneRadioButton", "QRadioButton" );
        if ( radio && radio->isChecked() )
            if ( amount )
                amount->setValue( amount->minValue() );
}


main.cpp
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void MainForm::creditDialog()
{
        Receiver *receiver = new Receiver;
        QDialog *creditForm = (QDialog *)
        QWidgetFactory::create( "../credit/creditformbase.ui", receiver );
        receiver->setParent( creditForm );

        if ( creditForm->exec() ) {
            QSpinBox *amount = (QSpinBox *) creditForm->child( "amountSpinBox", "QSpinBox" );
            if ( amount )
                ratingTextLabel->setText( amount->text() );
        }

        delete receiver;
        delete creditForm;
}

[ Voor 11% gewijzigd door Verwijderd op 03-12-2003 14:22 ]


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Slecht design. Als je nou wel de .ui.h methode wel had gevolgd, dan had je QWidgetFactory::create niet nodig gehad.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Topicstarter
MSalters schreef op 03 december 2003 @ 16:05:
Slecht design. Als je nou wel de .ui.h methode wel had gevolgd, dan had je QWidgetFactory::create niet nodig gehad.
Dit is een voorbeeld van trolltech zelf :) :) :)

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Het kan wel, maar je maakt het jezelf heel erg moeilijk. Je moet je afvragen wat de winst is van de flexibiliteit die QWidgetFactory je oplevert.

Het idee van Receiver is dat die class de slots kan proxyen van je QDialog. Aangezien je geen enkel slot proxyed cq. hoeft te gebruiken is Receiver dus overbodig.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • demonite
  • Registratie: April 2000
  • Laatst online: 23-05 06:25

demonite

the way is up

niet lullig bedoeld, maar ik zou nog maar eens wat meer voorbeelden bekijken.

Qt is een zeer programmer-friendly gui toolkit. Het kan veel makkelijker als wat jij nu hebt gemaakt. (Ja d'r zijn 1000 wegen naar Rome... ze alleen niet allemaal even lang / gemakkelijk)

Verwijderd

Topicstarter
Maar dat was het grote "subclassing"-voorbeeld.
Het werkt nu, toch bedankt voor jullie hulp?
Pagina: 1