indexWidget()意外返回NULL指针

时间:2010-11-29 16:32:28

标签: qt

我正在尝试在Qt 4.7.1中创建模型/视图应用程序。我是一个非常新的Qt开发人员。

我正在尝试做的总结:

我有一个树视图,它被组织成一个行和列的矩形表。一列项目包含一个按钮。默认情况下,此按钮是透明的并禁用。当鼠标悬停在其行上时,给定按钮将变为可见并启用。

我追求的方法是

  1. 找到鼠标悬停在其上的单元格的模型索引,
  2. 获取指向与窗口小部件关联的窗口小部件的指针,
  3. 使用此指针操纵所述窗口小部件中按钮的可见性。
  4. 我无法获得指向窗口小部件的有效指针。

    我当前的代码如下所示:

    void HistoryTreeView::mouseMoveEvent(QMouseEvent *event)
    {
       QAbstractItemModel *m(model());
    
       // Only do something when a model is set.
       if (m)
       {
          QModelIndex index = indexAt(event->pos());
          if (index.isValid())
          {
             // if the mouse has moved to another row
             if (index.row() != m_currentRow)
             {
               m_currentRow = index.row();
    
               QMessageBox::information( this, "HistoryTreeView", QString("index(%1)").arg(index.row()));
    
               QWidget * item = indexWidget(index);
               Q_ASSERT(item != NULL  );
            }
         }
         else  // model is invalid
         {
             m_currentRow = -1;
         }
      }
    
      QTreeView::mouseMoveEvent(event);
    }
    

    症状:

    我期望对indexWidget()的调用返回鼠标结束的小部件的有效指针。相反,它意外地返回一个NULL指针。

    评论:

    名为'index'的变量按预期运行,因为QMessageBox显示正确的行值。因此,我认为我为indexWidget()提供的值没有任何问题。

    这只是调试代码。它缺少像代码那样选择保存按钮的列。

1 个答案:

答案 0 :(得分:0)

好的,这是我理解错误的本质。

我错误地理解视图中的每个项目都是自己的小部件。我现在明白视图本身是一个小部件,但视图中的各个项本身不是小部件。

因为我误解了视图项目是小工具我认为可以:

  1. 从模型中的给定元素获取索引
  2. 使用indexWidget()获取与模型元素
  3. 关联的视图项的Widget *
  4. 然后使用此指针操纵视图项,就像它是一个小部件一样。
  5. indexWidget()只返回一个NULL,因为视图项不是小部件。