【问题标题】:How to know exactly when a user expands a QTreeView item?如何准确知道用户何时展开 QTreeView 项目?
【发布时间】:2012-10-30 23:40:27
【问题描述】:

当用户点击 QTreeView 中的展开箭头时,有没有办法准确知道展开操作何时开始?

对于他双击的情况,我可以捕捉到双击事件。

我尝试从 QTreeView 重新实现此插槽 void expand(const QModelIndex &index);,但它似乎不起作用。

QTreeView中有一个叫void expanded(const QModelIndex &index);的信号,但是好像是在展开之后才发送的。

我正在使用 QT 4.8.2

【问题讨论】:

  • 在用户尝试展开它到实际展开之前,您要做什么。
  • @Chris 我想将项目标签从 ITEMNAME 更改为 ITEMNAME(Loading)
  • 如果你有一个插槽连接到扩展信号,你应该能够做到这一点。您的插槽将在重绘 GUI 之前执行。
  • 在展开后设置“正在加载”文本会有什么不同?最终结果将是相同的。扩展索引和“加载”后缀
  • @KamilKlimek 这不是我的电话 :( 如果是我不在乎

标签: c++ qt qtreeview qt4.8


【解决方案1】:

这是我为获得所需功能所做的:

我像这样从 QTreeView 重新实现了 mousePressEvent

void MyTreeView::mousePressEvent(QMouseEvent *event)
{
    QModelIndex clickedIndex = indexAt(event->pos());
    if(clickedIndex.isValid())
    {
        QRect vrect = visualRect(clickedIndex);
        int itemIdentation = vrect.x() - visualRect(rootIndex()).x();
        if(event->pos().x() < itemIdentation)
        {
            if(!isExpanded(clickedIndex))
            {
             //do stuff
            }
        }
    }
}

我检查鼠标按下是否留在项目的文本标签上(意思是展开箭头)

这与双击事件相结合为我提供了我所需要的。

【讨论】:

  • 8年后仍然没有更好的解决方案。拥有可折叠的索引项并尝试在索引单击时展开/折叠,并且展开/折叠指示器不能与您的任何其他解决方案一起使用。 QTreeView 中的折叠/展开槽覆盖不能像上面提到的那样工作。
【解决方案2】:

您可以通过实现更改事件的方法来尝试这样做:

  void YourTreeView::changeEvent(QEvent *e)
  {
    QFrame::changeEvent(e);

    switch (e->type()) {
    case QEvent::QGraphicsSceneResizeEvent
        //do want you want to do
        break;
    default:
        break;
    }
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-13
    • 2018-05-15
    • 1970-01-01
    • 1970-01-01
    • 2014-06-03
    • 1970-01-01
    • 2012-02-11
    • 2011-12-02
    相关资源
    最近更新 更多