PDA

Visualizza la versione completa : [Qt - C++] Signal da children widget di un QStackedWidget


ing82
20-09-2018, 11:54
Ho un QStackedWidget popolato da n MyWidget (intendendo con MyWidget che sono derivati da QWidget).
Mi servirebbe 'raccogliere' il signal emesso dal widget corrente del QStackedWidget, ma non riesco a capire come fare.
Il mio tentativo e' stato



connect(mStackedWidget->currentWidget(),SIGNAL(mysignal()),this,SLOT(mySlo t()))


ma come temevo non funziona.

Se puo' essere utile, lo stackedwidget viene popolato da n elementi al momento della costruzione dell'oggetto principale, e il numero non e' noto a priori, ma tramite un parametro passato al costruttore stesso dell'oggeto parent che 'contiene' lo stackedwidget.
Tutti i widget children del qstackedwidget, derivano da una classe astratta derivata da QWidget, e mysignal e' stato definito all'interno di questa classe astratta.

Non ricevo alcun errore durante la fase di compilazione, ne messaggi di errore del tipo che QObject non trova il signal o lo slot, la macro Q_OBJECT e' stata messa in tutte le classi, in giro non riesco a trovare niente che mi dia una mano.

Ho provato a derivare QStackedWidget, ma non riesco a capire come indicare di connettere tutti i widget children...

Spero di essermi spiegato in modo abbastanza chiaro.

Grazie

denis76
21-09-2018, 14:36
Ciao, per core relative a Qt ti consiglio il loro forum ufficiale.
Relativamente a quanto da te chiesto secondo me dovresti implementare un even filter dentro ai widget e filtrare l'evento focus.

ing82
24-09-2018, 09:40
Grazie denis76 per l'interessamento.
Mentre davo un occhio a quanto da te consigliato, mi e' venuto in mente quanto segue, che pare funzionare nel senso che non ricevo alcun messaggio durante la compilazione ed effettivamente ottengo cio' che voglio.

Faccio un breve riepilogo.

La mia situazione e' aver creato una classe che chiamo AbstractWidget (ho dei metodi astratti in questa classe) derivata 'public' da QWidget.
Da AbstractWidget derivo sempre 'public' Una piccola serie di Widget, che chiamo Widget1, Widget2, Widget3, ecc.
Questi Widget_i emettono il signal miosegnale.
Ho poi creato un'altra classe, che chiamo MyWidget, derivata sempre 'public' da QWidget, che tra le altre cose, ha come child un QStackedWidget che viene popolato dai Widget_i col costruttore di MyWidget.

Quando uno dei Widget_i emette il signal miosegnale, MyWidget deve far partire lo slot myslot

Ho quindi pensato, che una volta creati tutti gli oggetti, posso far scorrere tutti i child del QStackedWidget, ad esempio mediante ciclo for, e fare effettivamente connect, sotto uno stalcio di pseudocodice



MyWidget::MyWidget(/*parametri necessari*/)
{
//quello che serve
//...
//in base ai parametri passati
//popolo mStackedWidget->insertWidget(/*...*/);
//a questo punto posso far scorrere tutti i child di mStackedWidget e fare, ad esempio mediante un ciclo for
//connect(static_cast<MyWidget*>(mStackedWidget->widget(i)),SIGNAL(miosegnale),this,SLOT(myslot));
//eventuali altre cose
}


Spero che funzioni perche' sia veramente corretto e non per una serie fortuita di coincidenze, grazie

Loading