【问题标题】:Qt - Expand QTreeView on single click?Qt - 单击即可展开 QTreeView?
【发布时间】:2010-12-06 21:16:58
【问题描述】:

虽然双击 QTreeView 的文本会展开子项,但单击不会。不过,CSS 中定义的图标(并放置在文本的左侧)只需单击一下即可展开子项。如何使文本的单击(或触摸事件)展开子项?

    bookTreeView->setModel(standardModel);
    bookTreeView->setEditTriggers(QAbstractItemView::NoEditTriggers);
    bookTreeView->setWordWrap(true);
    bookTreeView->sizeHint();
    //bookTreeView->mousePressEvent(QMouseEvent());
    bookTreeView->setTextElideMode(Qt::ElideNone);
    bookTreeView->setExpandsOnDoubleClick(true);
    bookTreeView->setUniformRowHeights(true);
    bookTreeView->setHeaderHidden(true);
    bookTreeView->setStyleSheet("QTreeView { font-size: 27px; show-decoration-selected: 0; } QTreeView::branch:has-siblings:!adjoins-item { border-image: none; } QTreeView::branch:has-siblings:adjoins-item { border-image: none; } QTreeView::branch:!has-children:!has-siblings:adjoins-item { border-image: none;} QTreeView::branch:has-children:!has-siblings:closed, QTreeView::branch:closed:has-children:has-siblings { border-image: none; image: url(':images/images/right_arrow.png'); } QTreeView::branch:open:has-children:!has-siblings, QTreeView::branch:open:has-children:has-siblings  { border-image: none; image: url(':images/images/down_arrow.png'); } ");

【问题讨论】:

  • 请注意,这通常是不受欢迎的行为。能够选择视图而无需展开视图通常是首选
  • 我不知道为什么我认为它对于移动应用程序来说是不可取的——我不希望通过单击展开所有子项,只希望那些与我单击的父项相关的子项。双击对于移动应用来说似乎无关紧要!

标签: c++ qt mobile qt4


【解决方案1】:

类似的东西

QObject::connect(
    tree, SIGNAL(clicked(const QModelIndex &)), 
    tree, SLOT(expand(const QModelIndex &))
);

clickedsignal 可能无法满足您的需求。您还可以查看currentChanged 信号,这可能是您想要的。我从未在移动环境中使用过 Qt :)

【讨论】:

  • 这非常接近!当我单击父级时,它会展开。但是,当我单击另一个父级时,它会通过我的自定义插槽运行,该插槽处理子级点击并且不显示子级。我会试一试。谢谢!
【解决方案2】:

同样的 Grund 答案,但如果它已经打开,我会在点击时添加关闭。

QObject::connect(
    tree, SIGNAL(clicked(const QModelIndex &)), 
    this, SLOT(expandItem(const QModelIndex &))
);

void MainWindow::expandItem(const QModelIndex &index)
{
    tree->isExpanded(index)? tree->collapse(index) : tree->expand(index);
}

在 mainwindow.h 中:

private slots:
void expandItem(const QModelIndex &index)

【讨论】:

    【解决方案3】:

    您是否尝试关闭双击展开?

    bookTreeView->setExpandsOnDoubleClick(false);
    

    【讨论】:

    • 是的,只是关闭双击展开。
    【解决方案4】:
    ui.tree_view->setExpandsOnDoubleClick(false);
    QObject::connect(ui.tree_view, &QTreeView::clicked, [this]() {
        if (ui.tree_view->isExpanded(ui.tree_view->currentIndex())) {
            ui.tree_view->collapse(ui.tree_view->currentIndex());
        }else{
            ui.tree_view->expand(ui.tree_view->currentIndex());
        }
    });
    

    在 Qt 的 Visual Studio 版本上测试。
    单击即可打开和关闭的另一种方法。
    此方法不需要额外的函数,因为它使用 lambda。
    将此放置在您的构造函数中以运行。
    注意:我将双击时的展开设置为 false,因为从逻辑上讲,当单击展开时,两次单击将撤消第一次所做的展开。
    该选项使流程更顺畅、更一致。

    【讨论】:

      猜你喜欢
      • 2012-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多