2013-06-11 4 views
0

J'essaie de faire quelque chose que je pensais que ce serait terriblement facile: Ajout de QRadioButton dans mon QWizardPage sans aucune mise en page.Ajouter QRadioButton dans QWidget sans mise en page

Le code suivant qui ajoute QRadioButton est appelée lorsque l'utilisateur clique sur le bouton Suivant (Signal currentIdChanged appelle le code):

int newPositionY = 0; 
for (vector<Events::VCS::PnPDevice>::const_iterator it=m_devices.begin(); it!=m_devices.end(); it++) 
{ 
    if (it->type == Events::VCS::HEADSET) 
    { 
     //add a radio button 
     stringstream text; 
     text << (it->name) << " " << (it->serialNumber); 
     QRadioButton* radioButton = new QRadioButton(ui.wpSINGLE_USER); 
     radioButton->setGeometry(50, 20 + newPositionY, 260, 40); 
     radioButton->setText(text.str().c_str()); 
     newPositionY = newPositionY + 40 
    } 
} 

}

J'ai ajouté ce petit morceau de code pour voir ce qui se passe avec mon QRadioButton

QList<QRadioButton*> listButton = ui.wpSINGLE_USER->findChildren<QRadioButton*>(); 
int size = listButton.size(); 
QRect rect1 = listButton[0]->rect(); 
QRect rect2 = listButton[1]->rect(); 

J'ai alors réalisé qu'il semble que le problème pourrait être QRect.

La valeur de rect1 et rect2 est erronée. rect1 = (0, 0, 259, 39) et rect2 = (0, 0, 259, 39) La valeur correcte pour rect1 doit être (50, 20, 260, 40) et n pour rect2 (50, 60, 260, 40)

Alors, quel est le problème, comment ajouter QRadioButton dans QWidget sans mise en page?

EDIT

C'est étrange, si, au lieu d'ajouter le QRadioButton dans le QWizardPage lorsque l'utilisateur clique sur le bouton suivant je les ajoute dans le contructor QWizard, cela fonctionne. Est-ce que quelqu'un peut me dire pourquoi je ne suis pas capable d'ajouter QRadioButton dans ma QWizardPage dans ma fonction de slot?

Merci

Répondre

2

QRect se comporte correctement. Vous devriez vérifier le geometry(), pas le rect().

http://doc-snapshot.qt-project.org/4.8/qwidget.html#geometry-prop

http://doc-snapshot.qt-project.org/4.8/qwidget.html#rect-prop

http://doc-snapshot.qt-project.org/4.8/application-windows.html#window-geometry

Voici quelques exemples QWizard qui méritent d'être étudiés ...

http://qt-project.org/doc/qt-4.8/dialogs-trivialwizard.html

http://qt-project.org/doc/qt-4.8/dialogs-classwizard.html

http://qt-project.org/doc/qt-4.8/dialogs-licensewizard.html

D'une manière générale ...

Utilisation de modèles, rend votre vie plus facile. Il y a une courbe d'apprentissage et le code a l'air drôle au début, mais vous serez reconnaissant de l'avoir fait à long terme. Si possible, j'évite d'utiliser Qt Designer, j'utilise des mises en page et des mises en page imbriquées pour tout positionner. Ajoutez des étirements et des entretoises et tout ce dont vous avez besoin. C'est bien. Et puis, si vous avez besoin de quelque chose à montrer ou à cacher plus tard, vous l'emboîtez dans un QWidget, et vous affichez et masquez ce widget pour l'ajuster lorsqu'il est visible.

http://qt-project.org/doc/qt-4.8/layout.html

http://qt-project.org/doc/qt-4.8/tutorials-widgets-windowlayout.html

Il est peut-être que lorsqu'un QRadioButton est ajouté sans mise en page, il n'est pas de mettre à jour votre widget.

Si vous modifiez le contenu de votre widget, vous devez publier un événement update() pour qu'il soit reflété.

http://doc-snapshot.qt-project.org/4.8/qwidget.html#update

également lorsque vous n'utilisez pas mises en page, la stratification et le positionnement peut aller un peu fou. Assurez-vous de ne pas dessiner autre chose sur l'emplacement où le bouton est ajouté.

Voici d'autres éléments à garder à l'esprit. Bien qu'il semble que vous en ayez déjà pris soin ...

Un autre problème qui peut se produire est que si vous ajoutez un QRadioButton dans une mise en page et que vous oubliez de le créer, il ne sera probablement pas ajouté tout. Parenting de QObject s est gérée bien par des mises en page, aussi.

Enfin, vous devez vous assurer que votre bouton existe pour la portée de votre widget parent. Donc, si vous le déclarez dans un slot, et qu'il a une portée locale, au moment où vous quittez le slot, il est parti. (Vous le mettez sur le tas, donc ça devrait aller). Donc, en faire une variable membre pour votre QWizardPage sous-classé, et en faire un pointeur. Qt gère bien la parenté des objets, et la suppression correctement s'ils se trouvent correctement dans l'arbre des objets.

http://qt-project.org/doc/qt-4.8/objecttrees.html

assurez-vous également regarder l'aide d'un « QGroupBox » dans votre mise en page lorsque vous utilisez QRadioButton s. Cela gère bien l'attribut exclusif.

http://doc-snapshot.qt-project.org/4.8/widgets-groupbox.html

http://doc-snapshot.qt-project.org/4.8/qradiobutton.html#details

Hope qui aide.

+0

La mise à jour ne fonctionne pas, mais l'ajout de QRadioButton à la mise en page fonctionne. Aussi +1 pour vous une réponse vraiment sympa et bien documentée. Merci. – peterphonic

Questions connexes