2009-10-21 1 views
0

Im en utilisant la bibliothèque Qt. J'essaie actuellement de créer mon propre QDockWidget (la classe MY hérite de la classe). En ce moment, ma classe a un ptr à QDockWidget. Cela a-t-il même un sens? est-ce une déclaration légale? Y at-il une meilleure façon de séparer le QDockWidget du reste de mon programme dans Qt? Im un peu perdu sur la façon de mettre en œuvre un nouveau widget Dock. Voici une copie de ma classe de QDockWidget:pouvez-vous avoir un membre privé de la même classe que la classe de base dont vous héritez?

 

#ifndef DOC_MENU_WIDGET_H #define DOC_MENU_WIDGET_H #include "App_interface.h" #include <QObject> #include <QWidget> #include <QDockWidget> class Doc_menu_widget : public QWidget { //Q_OBJECT public: Doc_menu_widget(App_interface *parent); ~Doc_menu_widget(); private: QDockWidget *dock_widget; }; #endif
+3

Notez qu'un 'QDockWidget' et un" pointeur vers 'QDockWidget'" sont deux types complètement distincts. –

+0

Pourquoi ne dérivez-vous pas directement de QDockWidget? Que voulez-vous exprimer: (a) Doc_menu_widget IS-A QDockWidget -> dériver (b) IS-IMPLEMENTED_IN_TERMS-OF QDockWidget (identique à PERFORMS-LIKE QDockWidget) -> utiliser un membre privé – fmuecke

Répondre

3

Vous semblez confondre la relation IS-A et la relation HAS-A.

Les relations IS-A sont implémentées par héritage.Par exemple, un QWidget IS-A QObject.

Les relations HAS-A sont implémentées par les membres. Par exemple, une taille HAS-A QWidget.

Maintenant, quelle est la relation entre la classe que vous essayez de développer et un QDockWidget? Cela vous dira lequel des deux vous devriez choisir.

+0

Quel est le problème d'être les deux? Un 'Dock Widget' est un 'Widget' mais il n'y a rien de mal à posséder un autre 'Widget' (qui peut être un sous-widget ou un 'Widget' différent). –

+1

Dans ce cas particulier, il est peu probable qu'un 'QDockWidget' ait un autre' QDockWidget'. – MSalters

+0

has-a peut être implémenté via un héritage privé. Bien qu'il soit généralement préférable de considérer cela comme "implémenté en termes de". – jkyle

1

ne devriez-vous faire quelque chose comme ça?

class Doc_menu_widget : public QDockWidget 
{ 
    // ... 
}; 

Dérivation de QWidget et ayant un attribut QDockWidget privé bien sûr est logique, mais il ne sera probablement pas vous aider pour la mise en œuvre « votre propre widget dock » (aussi longtemps que je comprends bien). Vous obtenez seulement le widget dock original de cette façon et vous pouvez le placer quelque part dans votre nouveau widget.

Alternativement, si vous souhaitez implémenter un équivalent de QDockWidget à partir de zéro, vous n'avez probablement pas besoin de QDockWidget privé.

0

Bien sûr, pourquoi pas. Et si vous utilisez juste un ptr à un objet de classe de base, vous n'avez aucun problème . Pourquoi n'avez-vous pas directement dérivé de QDockWidget en premier lieu?

Voulez-vous exprimer:

  • (a) Doc_menu_widget EST-A QDockWidget ->

  • tirent
  • (b) IS-IMPLEMENTED_IN_TERMS-DE QDockWidget (comme PERFORMS- COMME QDockWidget) -> utiliser un membre privé

0

Si vous avez juste besoin de créer un QDockWidget* pour votre QMainWindow, la plupart du temps, vous pouvez simplement créer une instance et de l'utiliser tout de suite:

QDockWidget* dock = new QDockWidget(this); 
dock->setWindowTitle("My Dock Widget"); 
addDockWidget(Qt::LeftDockWidgetArea, dock, Qt::Vertical); 

Si au contraire vous souhaitez créer un QDockWidget personnalisé avec un comportement différent ou l'apparence, alors il est probablement plus facile d'hériter de QDockWidget:

#include <QDockWidget> 

class MyDockWidget : public QDockWidget 
{ 
Q_OBJECT 
    // ... 
}; 

Avoir une classe séparée avec un membre privé QDockWidget* est bien sûr tout à fait possible et légitime, mais ce n'est pas le choix le plus commun dans cette situation. La raison en est que vous voulez très probablement que votre classe soit une variation de QDockWidget (est une relation) ce qui signifie qu'elle devrait avoir toutes ses méthodes publiques et ses instances devraient pouvoir passer aux méthodes demandant QDockWidget instances (pour par exemple, vous voulez être en mesure de ajouter un à un QMainWindow).

+0

s/Q_WIDGET/Q_OBJECT/ –