2011-11-03 4 views
3

J'essaye d'écrire un ensemble de widget personnalisé en tant que plugin Qt Designer. Certaines propriétés sont identiques pour tous mes widgets, donc je veux créer une classe de base. Mais il y a un problème avec l'héritage multiple, quand la classe de base hérite de QObject (à cause de la macro Q_PROPERTY pour rendre ses propriétés éditables dans Qt Designer) et que le widget personnalisé doit être un enfant de QWidget. Mais j'ai trouvé la propriété dynamique de Qt donc la classe de base obtient le pointeur du widget et définit la propriété dynamique.Qt Designer plugin personnalisé et propriétés dynamiques

class BaseClass { 
    QWidget *widget; 
    BaseClass(QWidget *widget) { 
    this->widget = widget; 
    this->widget->setProperty("Some", 0.0); 
    } 
    void setSome(double some) { 
    this->widget->setProperty("Some", some); 
    } 
... 

Ceci est correct. Je peux définir la propriété dynamique et les voir et les éditer dans Qt Designer, tout va bien. MAIS quand je veux lire de la propriété quelque chose ne va pas. Lorsque j'utilise:

this->widget->property("Some").value<double>(); 

Qt Designer ne démarre pas (?!).

Et quand j'utilise ce plus d'une fois

QVariant var = this->widget->property("Some"); 
return var.toDouble(); 

Ce problème est le même! Qt Designer ne parvient pas à démarrer sans message ou autre indice. J'utilise Qt 4.7.4 avec son concepteur. Le même proble est dans le concepteur Qt Creators (testé sur 2.0.0, 2.0.1).

Ai-je tort ou c'est le problème de Qt?

Merci pour vos suggestions!

+0

Vous définissez la valeur bool et la lecture comme double - cela ne fonctionnera probablement pas. – larsmoa

+0

Oups désolé, c'est une erreur ... Merci. Je lis et j'écris le bon type, c'est réécrire "épeler" Je vais le corriger ... – tomicious

+0

Il est corrigé maintenant ... Merci encore – tomicious

Répondre

2

Qwidget transmis au constructeur lors de la création une autre QWidget, est en fait le parent, donc si vous utilisez quelque chose comme

Derived::Derived(QWidget* parent):Base(parent){ 

} 

Vous définissez cette propriété à la société mère au lieu de l'enfant. Comme Qt est destiné à être utilisé en utilisant un héritage simple en référence à QObjects, créez une classe de base avec les fonctions qui définiront Q_PROPERTY et ajouter des macros pour définir les propriétés requises.

Espérons que ça aide.

+0

Ou, vous pourriez passer au lieu de parent, (QWidget *) ceci à la constructeur de classe de base –

+0

Merci pour votre réponse. Ouais je fais ça. Par exemple quand j'ai un bouton personnalisé, le constructeur ressemble à Button (parent QWidget *): QAbstractButton (parent), BaseClass (this) {...} – tomicious

Questions connexes