【问题标题】:Right to left Flickable从右到左轻弹
【发布时间】:2019-12-02 07:44:11
【问题描述】:

当我将一个子元素添加到 Flickable 时,它会将其锚定在整个控件的左侧,但我希望 flickable 的子元素锚定在整个控件的右侧(我认为当 flickable 内部有任何内容时,它的 flickableItemimplicitWidth影响整个控件的宽度,这就是为什么我不能使用anchors.right = parent.right),Flickable 中没有layoutDirection 属性,LayoutMirroring 不能在 flickable 中工作,我如何强制 Flickable 从其主体的右边距绘制孩子?
这是我的轻弹控件:

// ScrollableItem.qml

Flickable{
    id:root
    contentWidth: pane.implicitWidth
    contentHeight: pane.implicitHeight
    boundsBehavior: Flickable.StopAtBounds
    flickableDirection: Flickable.AutoFlickIfNeeded
    default property alias content : pane.contentItem

    Pane{
        id:pane
    }
    ScrollIndicator.vertical: ScrollIndicator{

    }
    ScrollIndicator.horizontal: ScrollIndicator{

    }
}

我是这样使用它的:

ScrollableItem{
   width : parent.width
   height : parent.height
   RowLayout{
      spacing: 500
      layoutDirection: Qt.RightToLeft
      Button{
      }
      Button{
      }
      Button{
      }
   }
}

Qml 不关心 width : parent.widthScrollableItem 并且如果我在控件内部设置宽度它不会轻弹,我也尝试在孩子中使用 anchors.right 但没有用。有没有办法强制可轻弹的孩子从屏幕右侧流出?

更新:让我用图片给你看

你看到窗格锚定在哪里了吗?将窗格锚定到右侧是不可能的,并且没有布局方向,窗格的宽度取决于子宽度,这是一个 rowLayout,因此如果窗格宽度低于可滑动宽度,它将始终绘制在我想要绘制的可滑动的左边缘flickable 的右边缘

【问题讨论】:

  • 文档说 注意:由于实现细节,放置在 Flickable 内的项目不能锚定到 Flickable。而是使用 parent,它指的是 Flickable 的 contentItem。内容项的大小由 contentWidth 和 contentHeight 决定。
  • 你能详细解释一下你想要达到的目标吗? Flickable 并没有真正流动任何东西。您是否希望内容默认在其右端滚动?你试过玩内容位置吗?
  • @ymoreau 这张图片够详细吗?
  • 更清楚了,谢谢。

标签: qt qml right-to-left flickable


【解决方案1】:

实际上,Flickable 在逻辑上不应该具有锚定功能。 所以你需要明确地将Flickable 向右移动:

// ScrollableItem.qml
Flickable{
    id:root
    contentWidth: pane.implicitWidth
    contentHeight: pane.implicitHeight
    boundsBehavior: Flickable.StopAtBounds
    flickableDirection: Flickable.AutoFlickIfNeeded
    default property alias content : pane.contentItem
    leftMargin: pane.contentWidth >= root.width ? 0 : root.width - pane.contentWidth
    contentX:  pane.mirrored ? pane.width : 0;
    property var lastWidth : 0

    Pane{
        id:pane
    }

    onWidthChanged: {
        contentX += lastWidth-width
        lastWidth = width;
    }

    ScrollIndicator.vertical: ScrollIndicator{}
    ScrollIndicator.horizontal: ScrollIndicator{}
}

我是这样使用它的:

    ScrollableItem{
       width : parent.width
       height : parent.height

       LayoutMirroring.enabled: true
       LayoutMirroring.childrenInherit: true

       RowLayout{
          spacing: 500
          layoutDirection: Qt.RightToLeft
          Button{
          }
          Button{
          }
          Button{
          }
       }
    }

这对我来说效果很好。当pane 的宽度小于Flickable 时,应将剩余空间添加到leftMargin 以保持内容在右侧。

【讨论】:

  • 这个答案确实比我的好,但是在调整应用程序大小时存在问题,当您调整大小时,内容会转到 flickable 的左侧
  • 是的,我注意到了这个问题。我们会找到办法的。我应该在调整大小时设置 contentX。这应该可以解决问题。让我看看
  • 它对我不起作用。您的编辑会在某个时间点停止闪烁。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 2022-01-13
  • 2017-07-22
  • 2016-05-02
相关资源
最近更新 更多