2017-09-26 5 views
0

J'ai commencé à programmer une application gui personnalisée. Mais j'ai besoin de savoir comment connecter le bouton avec une méthode.
Par exemple j'ai:
Comment connecter des boutons avec des méthodes qui seront appelées cliquer

class Button 
{ 
private: 
    string Text; 
    /*etc*/ 
public: 
    string GetLabel(); 
    void SetLabel(string label); 
    void Connect(/*method name as param*/) 
    { 
     //TODO -this is that thing i need help here 
     /*this is method for connecting button with method, which will be 
      called on click, which im asking for help*/ 
    } 
}; 

class Window 
{ 
private: 
    int sizeX,sizeY; 
public: 
    void Put(Button * button,int _hpos,int _vpos); 
    void Show(); 
    /*etc */ 
}; 

class MyWindow : public Window 
{ 
public: 
    MyWindow() 
    { 
     InitializeComponents(); 
    } 
    void Run() 
    { 
     this -> Put(btn1,10,10); //put button in window at position 10,10 
     this -> Show(); 
    } 
private: 
    Button * btn1; 
    void InitializeComponents() 
    { 
     btn1 = new Button(); 
     btn1 -> Connect(on_btn1_click); //select which method will be called when user click this button, which I dont know how to do so pls help 
    } 
    void on_btn1_click() //this method is called when user click the button 
    { 
     //do something if user clicked btn1 
    } 

}; 

int main() 
{ 
    MyWindow * win1 = new MyWindow(); 
    win1 -> Run(); 
    return 0; 
} 

Donc, il y a la méthode privée à l'intérieur MyWindow classe qui sera appelée lorsque l'utilisateur clique sur le bouton (btn1). Method Connect() sélectionne la méthode qui sera utilisée pour l'appel lorsque l'utilisateur clique sur le bouton.

+1

Quelle structure graphique utilisez-vous? Quelle plate-forme ou quel système d'exploitation utilisez-vous? –

+0

Ceci est basé sur des malédictions. Je voulais rendre les malédictions plus utilisables, donc j'essayais de créer un cadre oop. – T0maas

Répondre

0

Vous pouvez vérifier si la souris est sur un objet bouton/interface utilisateur, Si c'est que déclencher une commande/un événement.

const Button& GetObjectBelowMouse(int xMousePos, int yMousePos) // This would be equavalent to your Connect type 
{ 
    // all buttons would be your container of buttons/GUI objects. 
    for(const auto& button : allButtons) 
    { 
     // top,bottom,left,right would be the bounding rectangle that encapsulates the coordinates of the object 
     if((xMousePos > button.left && xMousePos < button.right) && (yMousePos > button.bottom && yMousePos < buttom.top)) 
     { 
      return button; 
     } 
    } 
    // in this case we have a different constructor that creates a "empty" button that has no function 
    return Button(NO_OBJECT); 
} 

// the usage would be something like 

int main() 
{ 
    /* 
     .. create button, set it's possition, etc 
    */ 

    // Option 1 
    if(GetObjectBelowMouse(mouse.x, mouse.y).type != NO_OBJECT) 
    { 
     // Do whatever you want, you know that the user has clicked a valid object 
     button.Foo(); 
    } 

    // Option 2 
    GetObjectBelowMouse(mouse.x, mouse.y).Foo(); // You know that every button has a foo object, and that NO_OBJECT has a foo that does nothing, so you don't need to compare if it is NO_OBJECT or not. 
} 
+0

J'ai trouvé quelque chose dans le framework Qt. Il existe une méthode appelée QObject :: connect. Cela fonctionne parfaitement pour moi, mais il y a un problème. Qt utilise une grosse ammout de * .so, donc j'ai décidé de ne pas utiliser Qt. J'ai donc besoin d'aide pour créer une alternative à QObject :: connect(). – T0maas