2015-03-02 1 views
1

Je rencontre un problème. Je veux échanger deux widgets Qt:Échange de Qt Widgets

void swap(QMainWindow **w1, QMainWindow **w2) 
{ 
    QMainWindow *w3; 

    w3 = *w1; 
    *w1 = *w2; 
    *w2 = w3; 
} 

Cependant, si je widget1 de type MainWindow1* et widget2 de type MainWindow2* et j'appelle swap(&widget1, &widget2); je reçois

/home/user/Test/manager.cpp:24: error: invalid conversion from 'MainWindow1**' to 'QMainWindow**' [-fpermissive] 
    swap(&widget1, &widget2); 
    ^

je dois noter que MainWindow1 et MainWindow2 sont deux QMainWindow classes dérivées.

Ma question est la suivante: Est-il possible de créer une fonction qui permute à l'exécution deux objets polymorphes? Comment puis-je contourner ce problème?

Merci beaucoup!

+0

Je n'ai pas utilisé Qt.Does QMainWindow class implémente la fonction d'opérateur d'affectation? Si la réponse est oui, vous pouvez. Je vous suggère de vérifier API –

+0

Notez que [std :: swap existe déjà] (http://en.cppreference.com/w/cpp/algorithm/swap) en C++ (si vous ' #include '). Vous n'êtes pas obligé de l'écrire vous-même. Mais ce que vous demandez ici va à l'encontre des principes du système de type statique de C++. Les types de toutes les variables sont fixés à la compilation ... et cela inclut les pointeurs. Si vous avez besoin de quelque chose qui peut contenir différents pointeurs, vous pouvez utiliser une union typée ... mais cela signifie probablement que votre conception est fausse. Vous pouvez juste avoir besoin d'une autre classe de base intermédiaire dérivée de QMainWindow pour tout ce que ces fenêtres ont en commun. – HostileFork

+0

@RonTang Malheureusement, aucune des classes QObject, donc QMainWindow implémentent l'opérateur d'affectation ou le constructeur de copie. C'est par conception en Qt. Donc ce n'est pas possible ... –

Répondre

2

Vous ne devriez pas passer les pointeurs MainWindow1 et MainWindow2 pour échanger comme ci-dessous.

MainWindow1* w1 = new MainWindow1(); 
MainWindow2* w2 = new MainWindow2(); 
swap(&w1, &w2); 

Si échange pourrait se produire dans ce cas, le pointeur MainWindow1 serait pointer vers un objet MainWindow2, ce qui ne va pas.

Vous devez passer des pointeurs MainWindow pour échanger comme ci-dessous.

MainWindow* w1 = new MainWindow1(); 
MainWindow* w2 = new MainWindow2(); 
swap(&w1, &w2);