Maison > interface Web > js tutoriel > le corps du texte

Mise à l'échelle de QGraphicsItem

一个新手
Libérer: 2017-09-22 10:19:24
original
2078 Les gens l'ont consulté


Mise à l'échelle de QGraphicsItem

QgarphicsItem est un élément du système de vue Qt. QGraphicsItem lui-même ne prend pas en charge le glissement de la souris pour zoomer. Cet article décrit comment modifier la taille de l'élément en modifiant les événements de la souris. (La version Qt utilisée dans cet article est Qt4.8)

La fonction implémentée par le code ci-dessous est : maintenez la touche Maj enfoncée et faites glisser avec la souris pour modifier la taille de la Boîte.

Définir la classe Box

class Box:public QGraphicsItem
{
    Q_DECLARE_TR_FUNCTIONS(Box)public:    
    Box();
    ...protected:    
    void mousePressEvent(QGraphicsSceneMouseEvent *event);    
    void mouseMoveEvent(QGraphicsSceneMouseEvent *event);    
    void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
};
Copier après la connexion
Box::Box()
{
    setFlags(QGraphicsItem::ItemIsSelectable|
             QGraphicsItem::ItemIsMovable|
             QGraphicsItem::ItemSendsGeometryChanges|
             QGraphicsItem::ItemIsFocusable);       //接受键盘事件
    mBoundingRect = QRectF(0,0,100,100);
    mBoundingRect.translate(-mBoundingRect.center());
}
Copier après la connexion

Les deux morceaux de code ci-dessus sont la définition de la classe Box et l'implémentation du constructeur. Le plus important est la surcharge de. les trois fonctions de la souris, et SetFlag permet à la Box d'accepter les événements du clavier.

Surcharge mousePressEvent

void Box::mousePressEvent(QGraphicsSceneMouseEvent *event)
{    if(event->modifiers()&Qt::ShiftModifier)
    {
        resizing = true;             //resizing变量在鼠标点击时变为true                                                    //在放开时变为false
        setCursor(Qt::SizeAllCursor);//鼠标样式变为十字
    }    else
        QGraphicsItem::mousePressEvent(event);
}
Copier après la connexion

Surcharge mouseMoveEvent

void Box::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{    if(resizing)
    {
        QRectF rect(mBoundingRect);        
        if(event->pos().x()<rect.x())
            rect.setBottomLeft(event->pos());        else
            rect.setBottomRight(event->pos());
        mBoundingRect=rect;
        mBoundingRect.translate(-mBoundingRect.center());
        scene()->update();
    }    else
        QGraphicsItem::mouseMoveEvent(event);
}
Copier après la connexion

Ici, mettez simplement à jour les coins inférieur gauche et supérieur droit de la boîte pour qu'ils correspondent à la position de la souris. Une meilleure approche serait de gérer les coordonnées x et y séparément.

Surcharge mouseReleaseEvent

void Box::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{    if(resizing)
    {
        resizing = false;
        setCursor(Qt::ArrowCursor);
    }    else
        QGraphicsItem::mouseReleaseEvent(event);
}
Copier après la connexion

Lorsque l'utilisateur relâche la souris pendant le processus de redimensionnement, le redimensionnement devient vrai et le style de la souris redevient une flèche.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal