Comment puis-je copier l'objet dans Qt?
J'utilise Qt et avoir de vrais problèmes de base. J'ai créé mon propre widget MyTest qui ont une variable obj
. J'ai besoin de cette variable obj
à partir d'un objet à l'extérieur de la fenêtre, de sorte que la variable est copiée pas seulement un pointeur vers un autre objet. Je reçois un message d'erreur et ne peut pas comprendre comment le faire ce truc de base. C'est le code que j'utilise:
MyTest.h:
class MyTest : public QWidget
{
Q_OBJECT
public:
void setObj(QObject &inobj);
QObject obj;
....
}
MyTest.cpp:
void MyTest::setObj(QObject &inobj) {
obj = inobj; //HERE I get the error message: "illegal access from 'QObject' to protected/private member 'QObject::operator=(const QObject &)'"
}
main.cpp:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QObject *ob = new QObject();
MyTest w;
w.setObj(*ob);
}
OriginalL'auteur Martin | 2010-04-16
Vous devez vous connecter pour publier un commentaire.
Il semble que le constructeur de copie et l'opérateur d'affectation sont désactivés. De cette.
Pas de constructeur de copie ou de l'opérateur d'affectation
QObject a ni un constructeur de copie, ni un opérateur d'affectation. C'est par la conception. En fait, ils sont déclarés, mais dans une section privée avec la macro Q_DISABLE_COPY(). En fait, toutes les classes de Qt dérivée de QObject (directe ou indirecte) d'utiliser cette macro pour déclarer leur constructeur de copie et l'opérateur d'affectation pour être privé. Le raisonnement est trouvé dans la discussion sur L'identité vs Valeur sur le Modèle Objet De Qt page.
La conséquence principale est que vous devez utiliser des pointeurs de QObject (ou à votre sous-classe QObject) où vous pourriez être tenté d'utiliser votre sous-classe QObject comme une valeur. Par exemple, sans un constructeur de copie, vous ne pouvez pas utiliser une sous-classe de QObject, comme la valeur à stocker dans l'une des classes de conteneurs. Vous devez stocker des pointeurs.
OriginalL'auteur
Aaron est correcte sur l'utilisation de l'opérateur d'affectation.
La seule façon que je suis conscient de faire une copie d'un objet, si vous avez vraiment de, est d'utiliser la Sérialisation comme décrit dans QDataStream Classe. Ce serait faire une copie de l'objet.
Ou avez-vous considéré l'emballage de la classe comme un QSharedPointer pointeur que vous pouvez en toute sécurité passer autour. Ce serait une ombre de référence ou de copie de l'objet.
OriginalL'auteur