2010-08-08 8 views
0

J'ai donc deux formulaires dans mon projet: MainWindow et Options Form (OptForm; QWidget); Maintenant, je crée (en faisant simplement glisser vers un formulaire) un QPushButton dans MainWindow pour ouvrir OptForm, et en passant des variables, que OptForm peut changer.C++/Qt: passage des variables à modifier dans la classe

void MainWindow::openOpt() //Slot; QPushButton calls(?) it 
{ 
    OptForm w (this->variable1,this->variable2, this); 
    w.show(); 
} 

constructeur OptForm est:

OptForm::OptForm(bool & variable1, bool & variable2, QWidget *parent) 
    : QWidget (parent) 
{ 
    variable1Pointer = &variable1; 
    variable2Pointer = &variable2; 
    ui.setupUi(this); 
} 

options.h a:

class OptForm : public QWidget 
{ 
    Q_OBJECT 

public: 
    OptForm(bool & variable1, bool & variable2, QWidget *parent) 

    //Pointers for encrypt and verbose 
    bool * variable1Pointer; 
    bool * variable2Pointer; 

public slots: 

    void change_variable1(); 
    void change_variable2(); 

private: 
    Ui::OptForm ui; 
}; 

Maintenant, void change_variable1(); et void change_variable2(); change booléens à true ou false.

Maintenant, dans ces fonctions ont une ligne que je this->*variable1Pointer = true;

Et j'obtiens l'erreur du compilateur: '((OptForm*)this)->OptForm::variable1Pointer' cannot be used as a member pointer, since it is of type 'bool*' Comment puis-je obtenir les choses? (FIXE, MERCI)

Autre chose dont j'ai besoin, c'est de laisser savoir à MainWindow, quand OptForm est fermé, de vérifier si les options ont changé. Alors, où dois-je placer ce code? Dans openOpt, ou créer un emplacement, qui sera exécuté (?), Lorsque OptForm se ferme? Comment puis-je envoyer un signal à MainWindow alors?

Merci d'avance. (Je suppose que j'ai foiré les choses assez bien)


Ok, erreur du compilateur fixe, mais maintenant, quand je presse cette fenêtre de bouton appers et se ferme immédiatement:/

+0

Est-ce supposé être un dialogue modal? – strager

+0

Non, QWidget avec quelques trucs dedans. –

+0

@EdgeLuxe, Comment le formulaire est-il montré? À partir du code que vous avez donné, le formulaire est détruit à la fin de 'MainWindow :: openOpt' en raison de RAII. – strager

Répondre

0

En ce moment, votre widget est détruit après avoir été créé (show() ne bloque pas et votre widget est créé sur la pile, c'est pourquoi vous ne voyez rien. Si vous voulez bloquer jusqu'à ce que la fenêtre est fermé et traiter ensuite le résultat, vous pouvez utiliser QDialog et appeler QDialog :: exec():

OptDialog w (this->variable1,this->variable2, this); //must inherit from QDialog instead of QWidget 
if (w.exec() == QDialog::Accepted) { // blocks until the user closes the dialog 
    //process input 
} 

une autre option: créer la boîte de dialogue sur le tas, connectez le signal finished() à un autre emplacement et appeler ouvert ( Notez également que si vous créez des widgets ou des boîtes de dialogue sur le tas, ils ne sont pas supprimés avant que leurs boîtes de dialogue parent ne soient supprimées (jamais si vous ne définissez pas de parent), sauf si vous supprimez-les manuellement ou appelez setAttribute (Qt :: WA_DeleteOnClose) sur eux. Et: ne pas passer les pointeurs, utiliser les setters/getters et appliquer les changements si l'utilisateur accepte la boîte de dialogue. Par exemple, si vous opérez sur un objet "settings":

OptDialog w (this->variable1,this->variable2, this); 
w.setSomeBoolOption(settings.someBoolOption()); 
w.setAnotherBoolOption(settings.anotherBoolOption()); 
if (w.exec() == QDialog::Accepted) { //user accepted, apply changes to settings: 
    settings.setSomeBoolOption(w.someBoolOption()); 
    settings.setAnotherBoolOption(w.anotherBoolOption()); 
} 
1

On peut supposer que vous voulez dire Relly;

* (this->variable1Pointer) = true; 

que vous pouvez réduire à:

* variable1Pointer = true; 

bien que la conception de cette classe semble tort de me - les classes ne devraient normalement pas être en train de modifier les choses qui ne sont pas eux-mêmes membres de la classe.

1

Il est pas très clair ce que vous exactement essayez de faire, mais simplement regarder l'erreur de syntaxe, il faut quelque chose comme ce

*(this->variable1Pointer) = true 
1

Quelques suggestions:

  • Utiliser des références au lieu de pointeurs, ils sont généralement très similaires aux pointeurs utilisés, mais un peu plus sûr et plus facile. Il suffit d'écrire bool & variable1Ref et vous pouvez l'utiliser comme variable.
  • Utilisez initiliazer liste dans le constructeur
  • données et mélange sa présentation dans une classe OptForm est une mauvaise idée. Cela peut convenir aux petites applications, mais les choses se gâchent facilement lorsque l'application se développe. Utilisez une classe de stockage de données (Model) et une classe pour l'afficher (View).
+0

Vous * devez * utiliser une liste d'initialisation si vous utilisez des références de toute façon. – strager

+0

Um, les références en tant que membres du groupe sont pleines de problèmes - cela ressemble à un mauvais conseil pour moi. –

+0

L'application n'est pas grande, donc je suppose qu'une classe devrait aller bien. De toute façon, je n'ai pas d'autres options possibles pour l'utilisateur à choisir - seulement 2 booléens. Voici la liste d'initialisation. Qu'est-ce qui ne va pas? 'OptForm :: OptForm (bool & expertR, bool & verboseR, parent QWidget *): QWidget (parent), bool & variable1Ref (variable1), bool & variable2Ref (variable2)' Qu'est-ce qui ne va pas? –

Questions connexes