DtkWidget
DTK Widget module
载入中...
搜索中...
未找到
Dtk::Widget::DAnchorsBase类 参考

DAnchorsBase 提供了一种指定 QWidget 与其它 QWidget 之间的关系来确定其位置的方法. 更多...

类 Dtk::Widget::DAnchorsBase 继承关系图:
Dtk::Widget::DAnchors< T >

Public 类型

enum  AnchorError {
  NoError , Conflict , TargetInvalid , PointInvalid ,
  LoopBind
}
 设置锚定信息的过程中可能出现的错误类型 更多...
 

Public 槽

void setEnabled (bool enabled)
 设置 enabled 属性
 
bool setAnchor (const Qt::AnchorPoint &p, QWidget *target, const Qt::AnchorPoint &point)
 DAnchorsBase::target 对象设置锚定规则
 
bool setTop (const DAnchorInfo *top)
 设置 top 属性
 
bool setBottom (const DAnchorInfo *bottom)
 设置 bottom 属性
 
bool setLeft (const DAnchorInfo *left)
 设置 left 属性
 
bool setRight (const DAnchorInfo *right)
 设置 right 属性
 
bool setHorizontalCenter (const DAnchorInfo *horizontalCenter)
 设置 horizontalCenter 属性
 
bool setVerticalCenter (const DAnchorInfo *verticalCenter)
 设置 verticalCenter 属性
 
bool setFill (QWidget *fill)
 设置 fill 属性
 
bool setCenterIn (QWidget *centerIn)
 设置 centerIn 属性
 
bool setFill (DAnchorsBase *fill)
 将 fill 中的target()作为参数调用其它重载函数
 
bool setCenterIn (DAnchorsBase *centerIn)
 将 centerIn 中的target()作为参数调用其它重载函数
 
void setMargins (int margins)
 设置 margins 属性
 
void setTopMargin (int topMargin)
 设置 topMargin 属性
 
void setBottomMargin (int bottomMargin)
 设置 bottomMargin 属性
 
void setLeftMargin (int leftMargin)
 设置 leftMargin 属性
 
void setRightMargin (int rightMargin)
 设置 rightMargin 属性
 
void setHorizontalCenterOffset (int horizontalCenterOffset)
 设置 horizontalCenterOffset 属性
 
void setVerticalCenterOffset (int verticalCenterOffset)
 设置 verticalCenterOffset 属性
 
void setAlignWhenCentered (bool alignWhenCentered)
 设置 alignWhenCentered 属性
 
void setTop (int arg, Qt::AnchorPoint point)
 设置 target 控件到上
 
void setBottom (int arg, Qt::AnchorPoint point)
 设置 target 控件到下
 
void setLeft (int arg, Qt::AnchorPoint point)
 设置 target 控件到左
 
void setRight (int arg, Qt::AnchorPoint point)
 设置 target 控件到右
 
void setHorizontalCenter (int arg, Qt::AnchorPoint point)
 设置 target 控件水平
 
void setVerticalCenter (int arg, Qt::AnchorPoint point)
 设置 target 控件竖直
 
void moveTop (int arg)
 移动 target 控件的上边界到 arg 这个位置
 
void moveBottom (int arg)
 移动 target 控件的下边界到 arg 这个位置
 
void moveLeft (int arg)
 移动 target 控件的左边界到 arg 这个位置
 
void moveRight (int arg)
 移动 target 控件的右边界到 arg 这个位置
 
void moveHorizontalCenter (int arg)
 移动 target 控件的水平中线到 arg 这个位置
 
void moveVerticalCenter (int arg)
 移动 target 控件的竖直中线到 arg 这个位置
 
void moveCenter (const QPoint &arg)
 移动 target 控件的上边界到 arg 这个位置
 

信号

void enabledChanged (bool enabled)
 信号会在 enabled 属性的值改变时被发送
 
void topChanged (const DAnchorInfo *top)
 信号会在 top 属性的值改变时被发送
 
void bottomChanged (const DAnchorInfo *bottom)
 信号会在 bottom 属性的值改变时被发送
 
void leftChanged (const DAnchorInfo *left)
 信号会在 left 属性的值改变时被发送
 
void rightChanged (const DAnchorInfo *right)
 信号会在 right 属性的值改变时被发送
 
void horizontalCenterChanged (const DAnchorInfo *horizontalCenter)
 信号会在 horizontalCenter 属性的值改变时被发送
 
void verticalCenterChanged (const DAnchorInfo *verticalCenter)
 信号会在 verticalCenter 属性的值改变时被发送
 
void fillChanged (QWidget *fill)
 信号会在 fill 属性的值改变时被发送
 
void centerInChanged (QWidget *centerIn)
 信号会在 centerIn 属性的值改变时被发送
 
void marginsChanged (int margins)
 信号会在 margins 属性的值改变时被发送
 
void topMarginChanged (int topMargin)
 信号会在 topMargin 属性的值改变时被发送
 
void bottomMarginChanged (int bottomMargin)
 信号会在 bottomMargin 属性的值改变时被发送
 
void leftMarginChanged (int leftMargin)
 信号会在 leftMargin 属性的值改变时被发送
 
void rightMarginChanged (int rightMargin)
 信号会在 rightMargin 属性的值改变时被发送
 
void horizontalCenterOffsetChanged (int horizontalCenterOffset)
 信号会在 horizontalCenterOffset 属性的值改变时被发送
 
void verticalCenterOffsetChanged (int verticalCenterOffset)
 信号会在 verticalCenterOffset 属性的值改变时被发送
 
void alignWhenCenteredChanged (bool alignWhenCentered)
 信号会在 alignWhenCentered 属性的值改变时被发送
 

Public 成员函数

 DAnchorsBase (QWidget *w)
 构造 DAnchorsBase 对象,传入的 w 对象会和一个新的 DAnchorsBase 对象绑定到一起
 
 ~DAnchorsBase ()
 在析构时会判断此 DAnchorsBase 对象是否和 target 存在绑定关系,如果是则从映射表中移除绑定
 
QWidget * target () const
 返回 target 控件指针
 
DEnhancedWidgetenhancedWidget () const
 返回 target 控件的扩展对象。此对象为 QWidget 对象额外提供了和控件大小、位置相关的变化信号
 
bool enabled () const
 返回 enabled 属性
 
const DAnchorsBaseanchors () const
 返回 anchors 属性
 
const DAnchorInfotop () const
 返回 top 属性
 
const DAnchorInfobottom () const
 返回 bottom 属性
 
const DAnchorInfoleft () const
 返回 left 属性
 
const DAnchorInforight () const
 返回 right 属性
 
const DAnchorInfohorizontalCenter () const
 返回 horizontalCenter 属性
 
const DAnchorInfoverticalCenter () const
 返回 verticalCenter 属性
 
QWidget * fill () const
 返回 fill 属性
 
QWidget * centerIn () const
 返回 centerIn 属性
 
int margins () const
 返回 margins 属性
 
int topMargin () const
 返回 topMargin 属性
 
int bottomMargin () const
 返回 bottomMargin 属性
 
int leftMargin () const
 返回 leftMargin 属性
 
int rightMargin () const
 返回 rightMargin 属性
 
int horizontalCenterOffset () const
 返回 horizontalCenterOffset 属性
 
int verticalCenterOffset () const
 返回 verticalCenterOffset 属性
 
int alignWhenCentered () const
 返回 alignWhenCentered 属性
 
AnchorError errorCode () const
 锚定过程中产生的错误,在一个新的锚定函数被调用之前会清空此错误状态,每次调用锚定函数后,可以通过此函数的返回值来判断锚定设置是否成功。
 
QString errorString () const
 对 errorCode 的文本描述信息
 
bool isBinding (const DAnchorInfo *info) const
 如果此 info 设置了锚定对象,则返回 true ,否则返回 false
 

静态 Public 成员函数

static bool setAnchor (QWidget *w, const Qt::AnchorPoint &p, QWidget *target, const Qt::AnchorPoint &point)
 方便用户直接设置两个对象之间锚定关系的静态函数,调用此函数可能会隐式创建DAnchorsBase 对象。
 
static void clearAnchors (const QWidget *w)
 清除和控件 w 相关的所有锚定关系,包括锚定w或者被w锚定的任何关联。会直接 销毁 w 对应的 DAnchorsBase 对象
 
static DAnchorsBasegetAnchorBaseByWidget (const QWidget *w)
 返回与 w 绑定的 DAnchorsBase 对象
 

Protected 成员函数

void init (QWidget *w)
 初始化函数
 

属性

QWidget * target
 绑定了锚定功能的控件对象
 
bool enabled
 控制锚定功能是否开启,为 false 时仅仅表示不会根据控件各种属性的变化来 来更新它的位置,但锚定关系并没有被解除
 
const DAnchorsBaseanchors
 一个指向自己的指针
 
const DAnchorInfotop
 target 控件上边界锚线的信息
 
const DAnchorInfobottom
 target 控件下边界锚线的信息
 
const DAnchorInfoleft
 target 控件左边界锚线的信息
 
const DAnchorInforight
 target 控件右边界锚线的信息
 
const DAnchorInfohorizontalCenter
 target 控件水平锚线的信息
 
const DAnchorInfoverticalCenter
 target 控件竖直锚线的信息
 
QWidget * fill
 target 控件的填充目标对象
 
QWidget * centerIn
 target 控件的居中目标对象
 
int margins
 上下左右四条“锚线”的边距,此值的优先级低于每条“锚线”特定的 margin 值
 
int topMargin
 上“锚线”的边距,优先级高于 margins
 
int bottomMargin
 下“锚线”的边距,优先级高于 margins
 
int leftMargin
 左“锚线”的边距,优先级高于 margins
 
int rightMargin
 右“锚线”的边距,优先级高于 margins
 
int horizontalCenterOffset
 水平“锚线”的偏移量
 
int verticalCenterOffset
 竖直“锚线”的偏移量
 
bool alignWhenCentered
 设置控件创建时是否对齐
 

详细描述

DAnchorsBase 提供了一种指定 QWidget 与其它 QWidget 之间的关系来确定其位置的方法.

除了比较传统的布局方式之外,DtkWidget 还提供了一种使用锚定概念布局控件的方法( 类似于 QQuickItem 中的 anchors 属性),可以认为每个控件具有一组6个不可见的“锚 线”:left,horizontalCenter,right,top,verticalCenter和bottom,如图所示:

使用 DAnchors 可以让 QWidget 基于这些“锚线”来确定相互间的关系,如:

DAnchors<QLabel> rect1(new QLabel("rect1"));
DAnchors<QLabel> rect2(new QLabel("rect2"));
rect2.setLeft(rect1.right());
DAnchors 是一个模板类,在 DAnchorsBase 的基础上保存了一个控件指针, 将控件和锚定绑定在一起使用,相当于把“锚线”属性附加到了控件本身.
Definition danchors.h:200

这样 rect2 的左边界就会和 rect1 的右边界对齐:

另外还可以同时设置多个“锚线”:

DAnchors<QLabel> rect1(new QLabel("rect1"));
DAnchors<QLabel> rect2(new QLabel("rect2"));
rect2.setTop(rect1.bottom());
rect2.setLeft(rect1.right());

锚定布局同时在多个控件中使用,控件之间只需要满足以下条件:
控件之间为兄弟关系,或被锚定控件为父控件
锚定关系不能循环绑定

锚定的间隔和偏移

锚定系统允许设置“锚线”之间的间距,和“锚线”一一对应,每个控件都有一组4个 margin: leftMargin, rightMargin, topMargin 和 bottomMargin 以及两个 offset: horizontalCenterOffset 和 verticalCenterOffset。

下面是左margin的例子:

DAnchors<QLabel> rect1(new QLabel("rect1"));
DAnchors<QLabel> rect2(new QLabel("rect2"));
rect2.setLeftMargin(5);
rect2.setLeft(rect1.right());

rect2 的左边界相距 rect1 的右边界5个像素:

注解
margin 仅仅是对设置的锚点生效,并不是让控件本身增加了边距,如果设置了 margin,但并没有设置相应的锚点,对控件本身而已是没有任何影响的。margin 的值可以 为负数,通过值的正负来决定margin的方向(内 margin 还是外 margin)

除了基于“锚线”来设置锚定外,另外还有 setCenterIn 和 setFill 这两个比较特殊的 的实现。

判断循环锚定的方式

假设 DAnchorsBase a1, a2; a1.setRight(a2.left()); 则判断 a1 和 a2 之间 会不会存在循环绑定的逻辑为: 尝试更改 a1 右边界的值,更新后如果 a2 左边界的值产出了变化,则认为会导致循环绑 定,否则认为不存在

成员枚举类型说明

◆ AnchorError

设置锚定信息的过程中可能出现的错误类型

枚举值
NoError 

设置锚定的过程中没有任何错误发生

Conflict 

表示设置的锚定关系跟已有关系存在冲突,如 fill 和 centerIn 不能同时设置

TargetInvalid 

表示设置锚定关系时的目标控件无效

PointInvalid 

表示设置锚定关系时的“锚线”信息错误,如把 Qt::AnchorLeft 设置到了 Qt::AnchorTop 上

LoopBind 

表示设置的锚定关系和已有关系形成了循环绑定

构造及析构函数说明

◆ DAnchorsBase()

Dtk::Widget::DAnchorsBase::DAnchorsBase ( QWidget *  w)
explicit

构造 DAnchorsBase 对象,传入的 w 对象会和一个新的 DAnchorsBase 对象绑定到一起

参数
w需要使用锚定关系的控件
注解
对 w 设置的锚定关系不会随着本次构造的 DAnchorsBase 对象的销毁而消失。 此构造函数可能会隐式的构造一个新 DAnchorsBase 对象用于真正的功能实现,函数执行 时会先检查当前是否已经有和 w 对象绑定的 DAnchorsBase 对象,如果没有则会创建一 个新的 DAnchorsBase 对象与之绑定,否则使用已有的对象。隐式创建的 DAnchorsBase 对象会在对应的 QWidget 对象被销毁时自动销毁。
参见
target() clearAnchors() getAnchorBaseByWidget()

◆ ~DAnchorsBase()

Dtk::Widget::DAnchorsBase::~DAnchorsBase ( )

在析构时会判断此 DAnchorsBase 对象是否和 target 存在绑定关系,如果是则从映射表中移除绑定

警告
DAnchorsBasePrivate 对象可能是在多个 DAnchorsBase 对象之间显式共享的, 所以在销毁 DAnchorsBase 后,对应的 DAnchorsBasePrivate 对象不一定会被销毁
参见
QExplicitlySharedDataPointer

成员函数说明

◆ clearAnchors()

static void Dtk::Widget::DAnchorsBase::clearAnchors ( const QWidget *  w)
static

清除和控件 w 相关的所有锚定关系,包括锚定w或者被w锚定的任何关联。会直接 销毁 w 对应的 DAnchorsBase 对象

参数
w锚定的控件对象

◆ enhancedWidget()

DEnhancedWidget * Dtk::Widget::DAnchorsBase::enhancedWidget ( ) const

返回 target 控件的扩展对象。此对象为 QWidget 对象额外提供了和控件大小、位置相关的变化信号

返回
参见
Dtk::Widget::DEnhancedWidget

◆ errorCode()

AnchorError Dtk::Widget::DAnchorsBase::errorCode ( ) const

锚定过程中产生的错误,在一个新的锚定函数被调用之前会清空此错误状态,每次调用锚定函数后,可以通过此函数的返回值来判断锚定设置是否成功。

返回
参见
errorString()

◆ errorString()

QString Dtk::Widget::DAnchorsBase::errorString ( ) const

对 errorCode 的文本描述信息

返回
参见
errorCode

◆ getAnchorBaseByWidget()

static DAnchorsBase * Dtk::Widget::DAnchorsBase::getAnchorBaseByWidget ( const QWidget *  w)
static

返回与 w 绑定的 DAnchorsBase 对象

参数
w锚定的控件对象
返回
如果 w 没有对应的锚定对象,则返回空

◆ isBinding()

bool Dtk::Widget::DAnchorsBase::isBinding ( const DAnchorInfo info) const

如果此 info 设置了锚定对象,则返回 true ,否则返回 false

w1.setLeft(w2.right());
qDebug() << w1.isBinding(w1.left()) << w2.isBinding(w2.right());
const DAnchorInfo * right
target 控件右边界锚线的信息
Definition danchors.h:71
bool setLeft(const DAnchorInfo *left)
设置 left 属性
Definition danchors.cpp:1137
const DAnchorInfo * left
target 控件左边界锚线的信息
Definition danchors.h:70
bool isBinding(const DAnchorInfo *info) const
如果此 info 设置了锚定对象,则返回 true ,否则返回 false
Definition danchors.cpp:872

打印内容为:ture false

参数
info
返回

◆ moveBottom

void Dtk::Widget::DAnchorsBase::moveBottom ( int  arg)
slot

移动 target 控件的下边界到 arg 这个位置

参数
arg要移动到的位置

◆ moveCenter

void Dtk::Widget::DAnchorsBase::moveCenter ( const QPoint &  arg)
slot

移动 target 控件的上边界到 arg 这个位置

参数
arg要移动到的位置

◆ moveHorizontalCenter

void Dtk::Widget::DAnchorsBase::moveHorizontalCenter ( int  arg)
slot

移动 target 控件的水平中线到 arg 这个位置

参数
arg要移动到的位置

◆ moveLeft

void Dtk::Widget::DAnchorsBase::moveLeft ( int  arg)
slot

移动 target 控件的左边界到 arg 这个位置

参数
arg要移动到的位置

◆ moveRight

void Dtk::Widget::DAnchorsBase::moveRight ( int  arg)
slot

移动 target 控件的右边界到 arg 这个位置

参数
arg要移动到的位置

◆ moveTop

void Dtk::Widget::DAnchorsBase::moveTop ( int  arg)
slot

移动 target 控件的上边界到 arg 这个位置

参数
arg要移动到的位置

◆ moveVerticalCenter

void Dtk::Widget::DAnchorsBase::moveVerticalCenter ( int  arg)
slot

移动 target 控件的竖直中线到 arg 这个位置

参数
arg要移动到的位置

◆ setAnchor [1/2]

bool Dtk::Widget::DAnchorsBase::setAnchor ( const Qt::AnchorPoint &  p,
QWidget *  target,
const Qt::AnchorPoint &  point 
)
slot

DAnchorsBase::target 对象设置锚定规则

注解
可能会为目标控件隐式创建其对应的 DAnchorsBase 对象
参数
p为当前控件的哪个锚线/锚点设置锚定规则
target锚定的目标控件
point锚定的目标锚线/锚点
返回
如果设置成功,则返回 true,否则返回 false。

◆ setAnchor() [2/2]

static bool Dtk::Widget::DAnchorsBase::setAnchor ( QWidget *  w,
const Qt::AnchorPoint &  p,
QWidget *  target,
const Qt::AnchorPoint &  point 
)
static

方便用户直接设置两个对象之间锚定关系的静态函数,调用此函数可能会隐式创建DAnchorsBase 对象。

参数
w要锚定的控件对象
p要锚定的锚线/锚点
target锚定的目标对象
point锚定的目标锚线/锚点
返回
如果锚定成功,则返回 true,否则返回 false。

◆ setCenterIn

bool Dtk::Widget::DAnchorsBase::setCenterIn ( DAnchorsBase centerIn)
slot

将 centerIn 中的target()作为参数调用其它重载函数

参数
centerIn
返回

◆ setFill

bool Dtk::Widget::DAnchorsBase::setFill ( DAnchorsBase fill)
slot

将 fill 中的target()作为参数调用其它重载函数

参数
fill
返回

属性说明

◆ alignWhenCentered

bool Dtk::Widget::DAnchorsBase::alignWhenCentered
readwrite

设置控件创建时是否对齐

注解
可读可写
参见
read方法 alignWhenCentered
write方法 setAlignWhenCentered

◆ anchors

DAnchorsBase * Dtk::Widget::DAnchorsBase::anchors
read

一个指向自己的指针

注解
只读
参见
read方法 anchors

◆ bottom

DAnchorInfo * Dtk::Widget::DAnchorsBase::bottom
readwrite

target 控件下边界锚线的信息

注解
只能和 top verticalCenter bottom 绑定
对属性赋值不会更改它自身的值,而是对此锚线设置绑定关系
可读可写
参见
read方法 bottom
write方法 setBottom

◆ bottomMargin

int Dtk::Widget::DAnchorsBase::bottomMargin
readwrite

下“锚线”的边距,优先级高于 margins

注解
可读可写
参见
read方法 bottomMargin
write方法 setBottomMargin

◆ centerIn

QWidget * Dtk::Widget::DAnchorsBase::centerIn
readwrite

target 控件的居中目标对象

注解
可读可写
参见
read方法 centerIn
write方法 setCenterIn

◆ enabled

bool Dtk::Widget::DAnchorsBase::enabled
readwrite

控制锚定功能是否开启,为 false 时仅仅表示不会根据控件各种属性的变化来 来更新它的位置,但锚定关系并没有被解除

注解
可读可写
参见
read方法 enabled
write方法 setEnabled

◆ fill

QWidget * Dtk::Widget::DAnchorsBase::fill
readwrite

target 控件的填充目标对象

注解
可读可写
参见
read方法 fill
write方法 setFill

◆ horizontalCenter

DAnchorInfo * Dtk::Widget::DAnchorsBase::horizontalCenter
readwrite

target 控件水平锚线的信息

注解
只能和 left horizontalCenter right 绑定
对属性赋值不会更改它自身的值,而是对此锚线设置绑定关系
可读可写
参见
read方法 horizontalCenter
write方法 setHorizontalCenter

◆ horizontalCenterOffset

int Dtk::Widget::DAnchorsBase::horizontalCenterOffset
readwrite

水平“锚线”的偏移量

注解
可读可写
参见
read方法 horizontalCenterOffset
write方法 setHorizontalCenterOffset

◆ left

DAnchorInfo * Dtk::Widget::DAnchorsBase::left
readwrite

target 控件左边界锚线的信息

注解
只能和 left horizontalCenter right 绑定
对属性赋值不会更改它自身的值,而是对此锚线设置绑定关系
可读可写
参见
read方法 left
write方法 setLeft

◆ leftMargin

int Dtk::Widget::DAnchorsBase::leftMargin
readwrite

左“锚线”的边距,优先级高于 margins

注解
可读可写
参见
read方法 leftMargin
write方法 setLeftMargin

◆ margins

int Dtk::Widget::DAnchorsBase::margins
readwrite

上下左右四条“锚线”的边距,此值的优先级低于每条“锚线”特定的 margin 值

注解
可读可写
参见
read方法 margins
write方法 setMargins

◆ right

DAnchorInfo * Dtk::Widget::DAnchorsBase::right
readwrite

target 控件右边界锚线的信息

注解
只能和 left horizontalCenter right 绑定
对属性赋值不会更改它自身的值,而是对此锚线设置绑定关系
可读可写
参见
read方法 right
write方法 setRight

◆ rightMargin

int Dtk::Widget::DAnchorsBase::rightMargin
readwrite

右“锚线”的边距,优先级高于 margins

注解
可读可写
参见
read方法 rightMargin
write方法 setRightMargin

◆ target

QWidget Dtk::Widget::DAnchorsBase::target
read

绑定了锚定功能的控件对象

注解
只读
参见
read方法 target

◆ top

DAnchorInfo * Dtk::Widget::DAnchorsBase::top
readwrite

target 控件上边界锚线的信息

注解
只能和 top verticalCenter bottom 绑定
对属性赋值不会更改它自身的值,而是对此锚线设置绑定关系
可读可写
参见
read方法 top
write方法 setTop

◆ topMargin

int Dtk::Widget::DAnchorsBase::topMargin
readwrite

上“锚线”的边距,优先级高于 margins

注解
可读可写
参见
read方法 topMargin
write方法 setTopMargin

◆ verticalCenter

DAnchorInfo * Dtk::Widget::DAnchorsBase::verticalCenter
readwrite

target 控件竖直锚线的信息

注解
只能和 top verticalCenter bottom 绑定
对属性赋值不会更改它自身的值,而是对此锚线设置绑定关系
可读可写
参见
read方法 verticalCenter
write方法 setVerticalCenter

◆ verticalCenterOffset

int Dtk::Widget::DAnchorsBase::verticalCenterOffset
readwrite

竖直“锚线”的偏移量

注解
可读可写
参见
read方法 verticalCenterOffset
write方法 setHorizontalCenterOffset

该类的文档由以下文件生成: