图标点击 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的主要内容,如果未能解决你的问题,请参考以下文章