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

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

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

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

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

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

谢谢。

【问题讨论】:

    标签: c++ qt


    【解决方案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 时,它​​工作得很好。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-08
      • 2012-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多