2013-06-30 5 views
0

J'apprends le QT5 pour m'amuser, et j'apprends à peindre des widgets pour un jeu 2D. J'ai regardé à travers de nombreux tutoriels et de la documentation, et je veux obtenir des informations sur les recherches à effectuer ici. D'après ce que j'ai appris, il semble que la peinture ne peut être effectuée que dans la fonction paintEvent. J'essaie de comprendre comment faire pour que je puisse conditionnellement peindre quelque chose sur un widget en fonction de la saisie au clavier. Par exemple, je veux le faire imprimer "alpha" si j'appuie sur a, et "beta" si j'appuie sur b.QT peinture au widget

Évidemment, je pourrais faire cela par une variable de chaîne globale, mais que feraient d'autres façons? Je suis à la recherche de la bonne façon QT pour faire cela, des suggestions? Comment implémenteriez-vous le psudocode suivant?

void paintEvent(QPaintEvent*) 
{ 
    QPainter painter(this); 

    //painter.drawText(QPoint(100,100), "example"); 

} 


void keyPressEvent(QKeyEvent *k) 
{ 
    QString temp = k->text(); 

    if(temp == "a") 
     //paint "alpha" 
    if(temp == "b") 
     //paint "beta" 
} 

Merci d'avance!

Répondre

1

Vous devez utiliser QGraphicsScene. C'est plus haut niveau que paintEvent, il a beaucoup de capacités pratiques et devrait être utilisé si vous voulez peindre quelque chose qui n'est pas entièrement trivial. Par exemple, dans votre cas, vous devez stocker la variable QGraphicsTextItem* text_item en tant que membre de la classe. Dans l'initialisation, vous effectuez les opérations suivantes:

text_item = scene->addText("initial text"); 

Lorsque vous avez décidé de changer le texte, il suffit d'utiliser cet objet:

text_item->setPlainText("new_text"); 

Graphics voir cadre sera repeindre zone appropriée pour vous.

Ceci n'est pas un exemple complet. Vous devez ajouter une vue à votre widget et initialiser une scène pour obtenir ce travail. Veuillez vous référer à la page Graphics View Framework pour plus de détails.

0

Vous êtes à peu près là. Vous utiliseriez une variable membre, pas une variable globale. J'écrire votre méthode keypress comme ceci:

class MyWidget : public QWidget { 
    protected: 
     void paintEvent(QPaintEvent*); 
     void keyPressEvent(QKeyEvent*); 
    private: 
     QString mText; 
}; 

... 

void MyWidget::keyPressEvent(QKeyEvent *k) { 
    if(k->key() == Qt::Key_A) 
     mText = "alpha"; 
    else if(k->key() == Qt::Key_B) 
     mText = "beta"; 

    update(); 
} 

L'utilisation key() va être beaucoup plus sûr que les comparaisons de chaînes magiques.

+0

Vraiment? Cela a du sens, mais cela semble un peu trop superficiel. Qu'en est-il de l'utilisation d'un QPixmap? Dois-je stocker activement dans les variables tout ce que je veux peindre dans paintEvent? – Nathan

+0

Je ne suis pas sûr de ce que QPixmap va faire pour vous dans cet exemple. Et oui, vous devez maintenir l'état séparément de votre événement de peinture. Il sera appelé plusieurs fois automatiquement par le système de peinture de Qt et vous aurez besoin de connaître l'état de votre widget à un moment donné, pas seulement au moment de la frappe. – Chris

+0

Cela semble plutôt inefficace. Est-il possible que la zone de peinture reste statique entre les appels à paintEvent? – Nathan