图标点击Qt QTreeWidget

时间:2009-06-30 08:17:40

标签: c++ qt

我的Qt表单中有一个treewidget。它显示了一个文件树,显示了一个代表它们的图标及其名称。

我使用treeItem->setIcon(0, *icon)treeItem->setText(0, text)输入了这些内容。

我将两个值都输入到同一列(0)的原因是因为否则图标不会停留在文本旁边,而是始终粘在左边,即使文本向右缩进(因为它是一个另一个项目的孩子)。

问题是,现在我无法判断用户是否点击了图标或文本本身,我需要单独处理这些内容。

所以,当单击treewidget中的对象时,无论如何获取更多信息而不仅仅是treeitem和column, 或者有没有办法将它们放在单独的列上,仍然有正常的行为图标和文本应该有?

感谢。

2 个答案:

答案 0 :(得分:1)

如果您只是使用clicked()或itemClicked()信号,我认为没有直接获取更多信息的方法。您可能必须创建一个继承QTreeWidget的自定义类,并重新实现其中一个虚拟鼠标事件函数。

mouseMoveEvent ( QMouseEvent * )
mousePressEvent ( QMouseEvent * )
mouseReleaseEvent ( QMouseEvent * )

这不是我推荐的,除非你真的知道你在做什么,并且真的需要这样做。

但是,我不记得在任何地方看到列表小部件,其中单击图标的处理方式与单击同一列中的文本不同。因此,如果您正在寻找“正常行为图标和文本应该具有的”,您可能应该寻找另一种解决方案。

答案 1 :(得分:1)

我找到了以下解决此问题的方法:

void MyTreeWidget::mousePressEvent( QMouseEvent* aEvent )
{
    QTreeWidget::mousePressEvent( aEvent );

    const QPoint clickedPosition    = aEvent->pos();
    const QRect itemRectangle       = visualItemRect( itemAt( clickedPosition ) );
    const int iconOffset            = itemRectangle.height() - iconSize().height();

    QRect iconRectangle;
    iconRectangle.setTopLeft( itemRectangle.topLeft() + QPoint( iconOffset, iconOffset ) );
    iconRectangle.setWidth( iconSize().width() );
    iconRectangle.setHeight( iconSize().height() );

    if ( iconRectangle.contains( clickedPosition ) )
    {
        qDebug() << "ICON clicked";
        // Emit an icon clicked SIGNAL.
    }
}