图标点击 Qt QTreeWidget

Posted

技术标签:

【中文标题】图标点击 Qt QTreeWidget【英文标题】:Icon click on Qt QTreeWidget 【发布时间】:2009-06-30 08:17:39 【问题描述】:

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

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

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

问题是,现在我无法判断用户点击的是图标还是文字本身,我需要分别处理这些。

那么,当单击 treewidget 中的对象时,是否可以获得比 treeitem 和 column 更多的信息, 或者有什么方法可以将它们放在单独的列上,并且仍然具有正常的行为图标和文本应该有?

谢谢。

【问题讨论】:

【参考方案1】:

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

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

我不建议这样做,除非你真的知道自己在做什么,并且真的需要这样做。

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

【讨论】:

【参考方案2】:

我为这个问题找到了以下解决方案:

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.
    

【讨论】:

这对我不起作用,因为 iconSize() 返回 [-1, -1],即使我的图标是 [16, 16]。当我硬编码图标大小而不是使用 iconSize 时,它​​工作得很好。

以上是关于图标点击 Qt QTreeWidget的主要内容,如果未能解决你的问题,请参考以下文章

Qt:将点击的信号映射到另一个按钮

QT:标题栏隐藏图标和隐藏后移动窗口

qt 怎么禁用关闭按钮

QT如何放大图标的大小

Qt4是不是实现了窗口图标的拖放?

QT添加工具栏