indexWidget () неожиданно возвращает нулевой указатель - PullRequest
0 голосов
/ 29 ноября 2010

Я пытаюсь создать приложение модель / представление в Qt 4.7.1. Я очень новый разработчик Qt.

Резюме того, что я пытаюсь сделать:

У меня есть древовидная структура, которая организована в виде прямоугольной таблицы строк и столбцов. Один столбец элементов содержит кнопку. По умолчанию эта кнопка должна быть прозрачной и отключенной. Данная кнопка должна стать видимой и включенной, когда мышь наводит курсор на ее ряд.

Я придерживаюсь подхода к

  1. найти модельный индекс для ячейки, над которой находится мышь, и
  2. получить указатель на виджет, связанный с виджетом, и
  3. с помощью этого указателя манипулирует видимостью кнопки в указанном виджете.

Я не могу получить действительный указатель на виджет.

мой текущий код выглядит так:

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 () вернет действительный указатель на виджет, на котором находится мышь. Вместо этого он неожиданно возвращает нулевой указатель.

Комментарий:

Переменная с именем index работает так, как я ожидал, потому что QMessageBox показывает правильное значение строки. Следовательно, я не думаю, что что-то не так со значением, которое я предоставляю indexWidget ().

Это просто отладочный код. В нем отсутствуют такие вещи, как код, который выбирает столбец с кнопками.

1 Ответ

0 голосов
/ 01 декабря 2010

ОК, вот природа моей ошибки, насколько я понимаю.

Я неправильно понял, что каждый элемент в представлении - это собственный виджет.Теперь я понимаю, что само представление является виджетом, но отдельные элементы в представлении сами по себе не являются виджетами.

Поскольку я неправильно понял, что элементы представления являются виджетами, я считаю, что они могут:

  1. получить индекс из заданного элемента в модели,
  2. использовать indexWidget (), чтобы получить виджет * для элемента представления, связанного с элементом модели
  3. , а затем использовать этот указательманипулировать элементом представления, как если бы он был виджетом.

indexWidget () просто возвратил NULL, поскольку элементы представления не являются виджетами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...