Qt Débutant QPainter et QRect
Comment pourrais-je aller sur le dessin d'un rectangle?
J'ai essayé de deux façons différentes;
void MyWidget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
painter.setPen(Qt::black);
QRect rect = QRect(290, 20, 70, 40);
painter.drawText(rect, Qt::AlignCenter,
"Data");
painter.drawRect(rect);
}
Qui fonctionne très bien (même si le paramètre n'est pas nommé ni utilisé), mais je ne veux pas utiliser le QPaintEvent * je n'ai aucune utilité pour elle.
Alors, j'ai essayé simplement en renommant ma fonction;
void MyWidget::draw()
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
painter.setPen(Qt::black);
QRect rect = QRect(290, 20, 70, 40);
painter.drawText(rect, Qt::AlignCenter,
"Data");
painter.drawRect(rect);
}
Cela ne veut pas afficher quoi que ce soit (et encore, il a pas d'erreurs).
Pourquoi ne serait-il pas travailler si je n'utilise pas QPaintEvent * ??
Pourquoi attendez-vous un nom aléatoire et fonction d'être appelé à faire quelque chose? Votre première méthode est très bien. Ne pas nommer les paramètres que vous n'avez pas besoin (encore) est à la fois juridique et idiomatiques C++.
Ok, serait-il possible d'obtenir la première méthode fonctionne si je n'avais pas le paramètre, encore conservé le reste la même?
Non, ce paramètre est nécessaire que vous utilisiez ou non. Je ne comprends pas pourquoi vous voulez l'enlever, il ne vous coûte rien de l'ignorer.
Il provoque des problèmes pour moi plus tard dans mon code, j'ai d'autres paramètres passés à savoir const QString &data. Est-il un autre moyen pour dessiner un rectangle, en s'éloignant de l'aide de paramètres d'événement? Merci pour vos réponses.
La signature pour les fonctions d'événement est fixe, vous ne pouvez pas les changer (sauf peut-être pour ajouter des paramètres avec des valeurs par défaut, mais je ne le ferais pas, même si ça fonctionne). Vous devez décrire votre problème plus en détail dans votre question, il semble que vous essayez de faire quelque chose "le mauvais chemin".
Ok, serait-il possible d'obtenir la première méthode fonctionne si je n'avais pas le paramètre, encore conservé le reste la même?
Non, ce paramètre est nécessaire que vous utilisiez ou non. Je ne comprends pas pourquoi vous voulez l'enlever, il ne vous coûte rien de l'ignorer.
Il provoque des problèmes pour moi plus tard dans mon code, j'ai d'autres paramètres passés à savoir const QString &data. Est-il un autre moyen pour dessiner un rectangle, en s'éloignant de l'aide de paramètres d'événement? Merci pour vos réponses.
La signature pour les fonctions d'événement est fixe, vous ne pouvez pas les changer (sauf peut-être pour ajouter des paramètres avec des valeurs par défaut, mais je ne le ferais pas, même si ça fonctionne). Vous devez décrire votre problème plus en détail dans votre question, il semble que vous essayez de faire quelque chose "le mauvais chemin".
OriginalL'auteur Ash | 2012-12-31
Vous devez vous connecter pour publier un commentaire.
L'événement paint est la méthode qui est appelée par le système de peinture quand un widget doit être redessiné. C'est pourquoi tout simplement le nom de votre propre méthode ne fonctionne pas. Il n'est jamais appelée par le système de peinture.
Vous devez vraiment être à l'aide de la
QPaintEvent
. Il vous donne le rect qui doit être établi. Ce rect sera en fonction de la taille du widget, donc au lieu d'utiliser explicitement un rectangle dans votre événement de peinture, définissez votre widget à la bonne taille. Une peinture événement sera généré si votre widget jamais déplacer, redimensionner, etc.Maintenant, si vous souhaitez séparer votre peinture logique dans une autre méthode, c'est très bien. Mais vous devez l'avoir appelé, à partir de l'événement de peinture:
Si vous souhaitez désactiver complètement la peinture des événements comme vous l'avez dit, et que vous souhaitez uniquement créer un statique rectangle à l'écran, une façon consiste à dessiner une fois à un pixmap et l'afficher dans un QLabel:
Bien que votre première solution de look élégant, votre solution vraiment juste se traduit par la région hérité de l'événement, et augmente tout simplement un appel sur la pile, l'utilisateur doit configurer votre "données" en dehors de la fonction, donc je pense que ce double appel, aucun être utile. Désolé d'être en désaccord avec votre première solution. Votre deuxième solution facile, semble bon.
OriginalL'auteur jdi
Toutes les données que votre
paintEvent()
besoins qui doivent être accessibles dans les champs de la classe conteneur, dans votre cas, champs privés deMyWidget
. Ces champs peuvent être exposés à des clients deMyWidget
via des "poseurs", qui permettrait de définir les valeurs de données avant d'appelerupdate()
surMyWidget
qui déclenche un appel àpaintEvent()
.OriginalL'auteur Arnold Spence
Cette liste de lecture contient les meilleurs tutoriels Qt , partir tutoriel 74 serait utile pour vous (Qpainter et QPen), tutoriel 75 est de savoir comment dessiner des rectangles à l'aide de QRect.
OriginalL'auteur Ahmed Kato
Ainsi @Mat dit: le "événement" est la bonne façon de lancer un peintre.
QPainter ne peut être évoquée après un QPaintEvent événement, qui porte le coffre de la région où l'objet peut être tirée.
De sorte que vous devez trouver une autre stratégie pour le transport de vos données, à l'aide
Je vous propose une méthode simple, qui peut être ajusté à de nombreux cas.
widget.cpp
widget.h
window.cpp
fenêtre.h
main.cpp
Comme vous pouvez le voir dans le code est exécuté d'une minuterie, en dehors de l'objet "widget"
toutes les 10ms envoie un redessiner le widget de redessiner un "rect" avec une taille différente et toutes les 20 cycles (200ms) modifie le texte "bonjour" pour "le monde"
Dans cet exemple vous pouvez voir que, de toute façon besoin de remplacer le QPainterDevice architecture.
Vous pouvez également remarquer que le "événement" au sein de la "paintEvent" de se taire et de ne pas utilisé directement, mais il est essentiel à l'exécution d'une séquence de QPainter.
Bonne et heureuse année! Merci pour votre aide 🙂
OriginalL'auteur RTOSkit
Substitution de la paintEvent() fonction d'un widget vous permet de personnaliser le widget et cette fonction est appelée périodiquement afin de redessiner le widget. Par conséquent, tous les dessins doivent être effectuées dans cette fonction. Cependant primordial paintEvent() peut causer certains problèmes de performances. Je préfère à l'aide d'un QGraphicsScene et QGraphicsView, puis je voudrais ajouter un rectangle pour la scène qui est la façon la plus courante de faire ce genre de dessin trucs. Veuillez vérifier les GraphicsView Cadre
http://qt-project.org/doc/qt-4.8/graphicsview.html
OriginalL'auteur fatma.ekici