【问题标题】:Triggering timer when ListView item is selected选择 ListView 项目时触发计时器
【发布时间】:2020-08-05 05:55:59
【问题描述】:

我正在尝试触发列表视图中的元素时触发计时器。我通过使用代码定义“运行”计时器来做到这一点(用户定义在哪里):

running: <containingItem>.ListView.isCurrentItem ? true : false

如果我不这样做,列表中的每个元素都会触发其开启计时器,因此计时器应该只针对选定的列表视图元素关闭。当我在列表视图的组件中执行此操作时,它可以工作 - 只有与所选项目关联的计时器触发,其余的则不触发。当我尝试在 ListView (以及所有包含对象)之外执行此操作时,它不起作用。我似乎无法以任何方式调用“ListView.isCurrentItem”命令。我在这里错过了什么?

我的代码是这样设置的:

Column {
  id: lv1
  ListView {
    id: lv2
    model: myModel
  }
  Component {
    id: lv3
    Item {
      id: lv4
      Rect {
        Timer {
          id: timer1
          running: (lv4.ListView.isCurrentItem) ? true : false //this works correctly
        }
      }
    }
  }
}

Rect {
  Timer {
    id: timer2
    running: (lv1.lv3.lv4.ListView.isCurrentItem ? true : false //this doesn't work correctly
  }
}

当我运行此代码时,我收到一个错误:无法读取未定义的属性 'lv4'

【问题讨论】:

  • 你能发布你的实际代码吗? error: Cannot read property 'lv4' of undefined 在这里没有真正意义,并且 ListView 的 delegate 没有设置。我知道你的错误是什么,但没有代码就无法真正解释清楚
  • 我假设 lv4 打算成为您的 ListView 的代表?

标签: qt listview timer qml


【解决方案1】:

ListView.isCurrentItem附加属性,只能从它附加到的内部对象中引用。这就是为什么你不能从timer2 调用它的原因。

您可以在此处阅读更多信息:https://doc.qt.io/qt-5/qtqml-syntax-objectattributes.html#attached-properties-and-attached-signal-handlers

【讨论】:

    【解决方案2】:

    您不能将组件 (lv3) 的 id 用作委托的实例。它只是一个对象的定义,而不是它的一个实例。

    我不太清楚您的目标是什么,但如果您只需要在选择列表中的项目时停止计时器,那么您应该可以这样做:

    ListView {
        onCurrentIndexChanged: timer2.stop()
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-17
      • 1970-01-01
      • 2019-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多