其他分享
首页 > 其他分享> > 图形视图(21):【类】QGraphicsAnchorLayout[官翻]

图形视图(21):【类】QGraphicsAnchorLayout[官翻]

作者:互联网

文章目录

QGraphicsAnchorLayout 类

QGraphicsAnchorLayout类提供了一个布局,可以将小部件锚定在图形视图中。

Header:#include < QGraphicsAnchorLayout >
qmake:QT += widgets
Inherits:QGraphicsLayout
Inherited By:
Since:Qt 4.6

详述

锚点布局允许开发人员指定小部件应该如何相对于彼此以及布局本身放置。该规范是通过调用addAnchor()、addAnchors()或addCornerAnchors()向布局中添加锚来实现的。

可以使用anchor()函数访问布局中的现有锚。被锚定的项目会自动添加到布局中,如果项目被移除,所有的锚定也会被自动移除。

Using an anchor layout to align simple colored widgets.

锚点总是设置在物品的边缘之间,这里的“中心”也被认为是边缘。考虑下面的例子:

 layout->addAnchor(b, Qt::AnchorLeft, a, Qt::AnchorRight);
 layout->addAnchor(b, Qt::AnchorTop, a, Qt::AnchorBottom);

在这里,项目a的右边缘锚定在项目b的左边缘上,项目a的下边缘锚定在项目b的上边缘上,结果项目b将被放置在项目b的右边和下面的对角线上。

addCornerAnchors()函数提供了一种更简单的方法来锚定两个小部件的角落,而不是上面代码中所示的对addAnchor()的两个单独调用。在这里,我们看到了小部件如何被锚定到外围布局的左上角:

layout->addCornerAnchors(a, Qt::TopLeftCorner, layout, Qt::TopLeftCorner);

如果要使用锚点来匹配小部件的宽度或高度,则可以使用addAnchors()函数。与其他用于指定锚点的函数一样,它也可以用于将小部件锚定到布局上。

 layout->addCornerAnchors(a, Qt::TopLeftCorner, layout, Qt::TopLeftCorner);

如果要使用锚点来匹配小部件的宽度或高度,则可以使用addAnchors()函数。与其他用于指定锚点的函数一样,它也可以用于将小部件锚定到布局上。

锚布局中的大小提示和大小策略

QGraphicsAnchorLayout尊重每个项目的大小提示和大小策略。注意,QSizePolicy的一些属性是不受尊重的。

锚布局中的间距

布局可以在项目之间分配一些空间。 如果未明确指定间距,则实际的空间量通常为0。

但是,如果第一边缘与第二边缘相反(例如,第一小部件的右边缘锚定到第二小部件的左边缘),则将通过像素度量从样式中查询锚的大小 :用于水平锚点的PM_LayoutHorizontalSpacing和用于垂直锚点的PM_LayoutVerticalSpacing。
如果间距为负,则项目将在某种程度上重叠。

已知的问题

QGraphicsAnchorLayout当前不支持某些功能。 这种情况将来可能会改变,因此,如果要避免将来的任何行为退化,请避免使用这些功能:

另请参见QGraphicsLinearLayout,QGraphicsGridLayout和QGraphicsLayout。

公共函数

构造和析构

  1. QGraphicsAnchorLayout(QGraphicsLayoutItem *parent = nullptr)
  2. virtual ~QGraphicsAnchorLayout()

锚点

  1. QGraphicsAnchor * addAnchor(QGraphicsLayoutItem *firstItem, Qt::AnchorPoint firstEdge, QGraphicsLayoutItem *secondItem, Qt::AnchorPoint secondEdge)

    在项目firstItem的边缘firstEdge和项目secondItem的边缘secondEdge之间创建一个锚点。

    锚的间距从样式中选取。布局边缘和项目边缘之间的锚点的大小为0。如果边缘之间已经存在一个锚点,则新的锚点将替换旧的锚点。如果firstItem和secondItem不属于布局,则它们会自动添加到布局中。这意味着count() 最多可以增加2。

    锚点将获得的间距取决于锚点的类型。例如,从一个项目的右边缘到另一个项目的左边缘的锚(反之亦然)将使用默认的水平间距。底部锚固到顶部锚固也具有相同的行为(但它们将使用默认的垂直间距)。对于所有其他锚点组合,间距将为0。所有锚点功能将遵循此规则。也可以使用QGraphicsAnchor :: setSpacing() 方法手动设置间距。

    调用此函数,其中firstItem或secondItem是布局的祖先,具有未定义的行为。

  2. void addAnchors(QGraphicsLayoutItem *firstItem, QGraphicsLayoutItem *secondItem, Qt::Orientations orientations = Qt::Horizontal | Qt::Vertical)

  3. void addCornerAnchors(QGraphicsLayoutItem *firstItem, Qt::Corner firstCorner, QGraphicsLayoutItem *secondItem, Qt::Corner secondCorner)

  4. QGraphicsAnchor * anchor(QGraphicsLayoutItem *firstItem, Qt::AnchorPoint firstEdge, QGraphicsLayoutItem *secondItem, Qt::AnchorPoint secondEdge)

enum Qt::AnchorPoint

指定可以锚定的布局项的一面。这由QGraphicsAnchorLayout使用。

ConstantValueDescription
Qt::AnchorLeft0布局项的左侧。
Qt::AnchorHorizontalCenter1位于布局项左右两边中间的“虚拟”边。
Qt::AnchorRight2布局项的右侧。
Qt::AnchorTop3布局项的顶部。
Qt::AnchorVerticalCenter4在布局项的顶部和底部之间居中的“虚拟”边。
Qt::AnchorBottom5布局项的底部。

间距

  1. qreal horizontalSpacing() const
    void setHorizontalSpacing(qreal spacing)
  2. qreal verticalSpacing() const
    void setVerticalSpacing(qreal spacing)
  3. void setSpacing(qreal spacing)

重写的公共函数

  1. virtual int count() const override
  2. virtual void invalidate() override
  3. virtual QGraphicsLayoutItem * itemAt(int index) const override
  4. virtual void removeAt(int index) override
  5. virtual void setGeometry(const QRectF &geom) override

重写的受保护的函数

  1. virtual QSizeF sizeHint(Qt::SizeHint which, const QSizeF &constraint = QSizeF()) const override

演示代码

#include <QtWidgets>

class Widget : public QGraphicsWidget
{
public:
    Widget(const QColor &color, const QColor &textColor, const QString &caption,
           QGraphicsItem *parent = nullptr)
        : QGraphicsWidget(parent)
        , caption(caption)
        , color(color)
        , textColor(textColor)
    {    }

    void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget * = nullptr) override
    {
        QFont font;
        font.setPixelSize(0.75 * qMin(boundingRect().width(), boundingRect().height()));

        painter->fillRect(boundingRect(), color);
        painter->save();
        painter->setFont(font);
        painter->setPen(textColor);
        painter->drawText(boundingRect(), Qt::AlignCenter, caption);
        painter->restore();
    }
private:
    QString caption;
    QColor color;
    QColor textColor;
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QGraphicsScene scene(0,0,600,400);

    Widget *a = new Widget(Qt::blue, Qt::white, "a");
    a->setPreferredSize(100, 100);
    Widget *b = new Widget(Qt::green, Qt::black, "b");
    b->setPreferredSize(100, 100);
    Widget *c = new Widget(Qt::red, Qt::black, "c");
    c->setPreferredSize(100, 100);

    QGraphicsAnchorLayout *layout = new QGraphicsAnchorLayout;

    layout->addCornerAnchors(a, Qt::TopLeftCorner, layout, Qt::TopLeftCorner);

    layout->addAnchor(b, Qt::AnchorLeft, a, Qt::AnchorRight);
    layout->addAnchor(b, Qt::AnchorTop, a, Qt::AnchorBottom);

    layout->addAnchor(b, Qt::AnchorBottom, c, Qt::AnchorTop);

    layout->addAnchors(b, c, Qt::Horizontal);

    layout->addCornerAnchors(c, Qt::BottomRightCorner, layout, Qt::BottomRightCorner);

    auto w = new QGraphicsWidget(nullptr, Qt::Window | Qt::CustomizeWindowHint | Qt::WindowTitleHint);
    w->setPos(20, 50);
    w->setMinimumSize(100, 100);
    w->setPreferredSize(320, 240);
    w->setLayout(layout);
    w->setWindowTitle(QApplication::translate("simpleanchorlayout", "QGraphicsAnchorLayout in use"));
    scene.addItem(w);

    QGraphicsView view;
    view.setScene(&scene);
    view.setWindowTitle(QApplication::translate("simpleanchorlayout", "Simple Anchor Layout"));

    view.show();

    return app.exec();
}

标签:layout,Qt,布局,视图,官翻,锚点,const,QGraphicsAnchorLayout
来源: https://blog.csdn.net/hitzsf/article/details/114495254