我的Qt表单中有一个treewidget。它显示了一个文件树,显示了一个代表它们的图标及其名称。
我使用treeItem->setIcon(0, *icon)
和treeItem->setText(0, text)
输入了这些内容。
我将两个值都输入到同一列(0)的原因是因为否则图标不会停留在文本旁边,而是始终粘在左边,即使文本向右缩进(因为它是一个另一个项目的孩子)。
问题是,现在我无法判断用户是否点击了图标或文本本身,我需要单独处理这些内容。
所以,当单击treewidget中的对象时,无论如何获取更多信息而不仅仅是treeitem和column, 或者有没有办法将它们放在单独的列上,仍然有正常的行为图标和文本应该有?
感谢。
答案 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.
}
}