QHeaderView :: mousePressEvent (необходимо выяснить столбец / индекс)

Обычно я могу заставить это работать без проблем, когда я повторно реализую QTableView :: mousePressEvent (QMouseEvent *). Однако выполнение этого в QHeaderView у меня не работает. Код прост.

void my_header_t::mousePressEvent( QMouseEvent* event )
{
    if ( !event ) {
    return;
}

if ( event->button() == Qt::RightButton ) {

    QPoint point( event->x(), event->y() );
    QModelIndex index   = indexAt( point );

    printf( "%s data %s %d,%d %s (point: %d,%d )\n",
        ts().c_str(), index.data().toString().toStdString().c_str(),
        index.row(), index.column(), index.isValid() ? "True" : "False",
        event->x(), event->y() );

    handle_right_click( index.data().toString() );

} else {
    QHeaderView::mousePressEvent( event );
}

x () и y () из QMouseEvent в порядке. Однако он создает недопустимый индекс с row () равным -1 и column () равным -1. Очевидно, я передаю в handle_right_click () пустую строку, которая запускает меню. Это меню не будет знать, в каком столбце оно было названо, и в дальнейшем начнется хаос.

Я знаю, что нажатие (const QModelIndex &) просто сообщит мне правильный индекс с текстом. Однако мне нужно различать кнопки.


person kiss-o-matic    schedule 23.10.2012    source источник


Ответы (1)


QHeaderView предоставляет альтернативную функцию logicalIndexAt для определения индекса интересующего вас элемента заголовка. Используя приведенный выше код:

void my_header_t::mousePressEvent( QMouseEvent* event )
{
   if ( !event ) {
      return;
   }

   if ( event->button() == Qt::RightButton ) {
      int index = logicalIndexAt( event->pos() );

      handle_right_click(model()->headerData(index, Qt::Horizontal).toString());

   } else {
      QHeaderView::mousePressEvent( event );
   }
}

Обратите внимание, что ориентация заголовка должна быть передана методу headerData (в данном случае я просто предположил, что это Qt::Horizontal, но в вашем случае это может быть что-то другое).

person RA.    schedule 23.10.2012
comment
Потрясающе - вот и все. Я знал о logicalIndexAt ... не уверен, почему не пробовал. Только предостережение для кого-то еще, ссылающегося на это: QHeaderView не имеет доступа ни к какой модели () по умолчанию. Поскольку я наследую, я устанавливаю и сохраняю модель (в данном случае QSortFilterProxyModel) из родительского QTableView. Еще раз спасибо. - person kiss-o-matic; 23.10.2012