Heim  >  Artikel  >  Web-Frontend  >  QGraphicsItem-Skalierung

QGraphicsItem-Skalierung

一个新手
一个新手Original
2017-09-22 10:19:242084Durchsuche


Skalierung von QGraphicsItem

QgarphicsItem ist ein Element im Qt-Ansichtssystem. QGraphicsItem selbst unterstützt das Ziehen mit der Maus zum Zoomen nicht. In diesem Artikel wird beschrieben, wie Sie die Größe des Elements durch Ändern von Mausereignissen ändern. (Die in diesem Artikel verwendete Qt-Version ist Qt4.8)

Die durch den folgenden Code implementierte Funktion ist: Halten Sie die Umschalttaste gedrückt und ziehen Sie mit der Maus, um die Größe der Box zu ändern.

Definieren Sie die Box-Klasse

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

Die beiden oben genannten Codeteile sind die Definition der Box-Klasse und die Implementierung des Konstruktors. Das Wichtigste ist die Überladung die drei Mausfunktionen und SetFlag ermöglicht der Box, Tastaturereignisse zu akzeptieren.

MousePressEvent überladen

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

MouseMoveEvent überladen

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);
}

Aktualisieren Sie hier einfach die untere linke und obere rechte Ecke der Box, damit sie mit der Mausposition übereinstimmen. Ein besserer Ansatz wäre, die x- und y-Koordinaten getrennt zu behandeln.

MouseReleaseEvent überladen

void Box::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{    if(resizing)
    {
        resizing = false;
        setCursor(Qt::ArrowCursor);
    }    else
        QGraphicsItem::mouseReleaseEvent(event);
}

Wenn der Benutzer die Maus während des Größenänderungsvorgangs loslässt, wird die Größenänderung in „True“ geändert und der Mausstil wird wieder in einen Pfeil geändert.

Das obige ist der detaillierte Inhalt vonQGraphicsItem-Skalierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn