2010-11-29 4 views
0

Я пытаюсь создать приложение модели/представления в Qt 4.7.1. Я очень новый разработчик Qt.indexWidget() неожиданно возвращает указатель NULL

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

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

подход я преследую это

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

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

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

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

ответ

0

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

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

Потому что я неправильно понял, что взгляд предметы были виджетами я полагал, что мог:

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

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

+0

Это неверно, вы можете использовать setIndexWidget() для установки QWidget в ячейке.Он возвращает значение null, если вы не установили виджет индекса для этого индекса. – fonZ 2016-03-11 17:16:10

Смежные вопросы