2009-12-22 5 views
3

J'ai défini une interface utilisateur (appelons-la myUI) à l'aide du concepteur Qt et l'utilise dans mes applications. J'ai besoin d'accéder à tous les sous-widgets (QToolButton s) dans myUI. Je veux obtenir tous les sous-widgets en tant que QObjectList.Accès aux éléments de l'interface utilisateur enfant dans une interface utilisateur Qt

Y at-il un moyen de le faire?

Le QObject::children() ne fonctionne pas ici parce que l'interface utilisateur Qt compilateur, lors de la conversion du fichier .ui à une classe C++, ne définit pas la classe ui_myUI comme une sous-classe de toute QObject classe dérivée. Est-il possible de forcer à faire cela, puis utilisez la fonction children()?

Merci.

Répondre

4

Appel children() au niveau supérieur instance de widget.

En supposant que votre widget niveau supérieur est appelé 'tlWidget':

myUI->tlWidget->children()

+0

Bien que cela n'ait pas résolu mon problème directement, cela m'a conduit dans le droit direction. Il s'avère qu'il y a un niveau d'indirection, et le parent réel de tous les widgets est un autre widget non défini par moi. –

1

Habituellement, ce qui se passe est que vous héritez de la classe UI ou que vous l'avez en tant que membre et appelez sa méthode setupUi, en envoyant this en tant que paramètre. La valeur par défaut dans Qt Creator/Designer est de l'avoir en tant que membre, nommé ui.
Vous pouvez utiliser ce membre pour accéder à tous les widgets définis dans votre formulaire.

+0

La chose est, je veux obtenir tous les widgets définis dans le formulaire comme 'QObjectList'. Est-ce possible? –

+0

oh, j'ai mal compris ce que vous avez demandé au départ. Donc, vous voulez tous les QObject dont parent est votre formulaire. Ne pas appeler des enfants() sur votre formulaire vous le donner? Après tout la classe d'interface utilisateur ajoute des enfants à cette classe. Donc, si vous avez une classe MyWindow qui utilise MyWindowUi, appelez children() sur MyWindow. Si je comprends bien cela vous donnera ce que vous voulez (bien que je suis sûr que cela retournera les enfants directs) –

+0

Il s'avère qu'il y a un niveau d'indirection utilisé dans le fichier ui_MyUI.cpp. Il définit son propre widget qui est le parent de tous les autres widgets. Enfin compris. Merci quand même. –

0

Vous pourriez trouver cela intéressant:

+0

Oui, j'ai vu ça. Et ça n'aide pas vraiment.J'ai essayé l'approche de l'héritage multiple, mais je ne suis pas capable d'obtenir les sous-widgets comme 'QObjectList' en utilisant' this-> children() ' –

0

Comment utilisez-vous votre interface utilisateur?

(a) quelque chose comme:

class MyWidget: public QWidget, protected myUI 
{ 
//... 
}; 

(b) ou plutôt quelque chose comme:

class MyWidget: public QWidget 
{ 
protected: 
    myUI ui; 
}; 

La solution est similaire pour les deux cas, supposons que vous appelez setupUi(this) ou ui.setupUi(this) dans le constructeur de MyWidget

setupUi (QWidget * p) enregistre chaque widget de l'interface utilisateur comme enfants de QWidget p, de sorte que vous peut facilement y accéder en appelant la fonction children() de p:

this->children(); //"this" refers to an object of MyWidget 
Questions connexes