1

一般来说,当我重新实现 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 );
}

QMouseEvent 中的 x() 和 y() 很好。但是,它会创建一个无效索引,其中 row() 为 -1,column() 为 -1。显然,我将一个空字符串传递给 handle_right_click() 以启动菜单。该菜单不会知道是哪一列调用了它,混乱将进一步接踵而至。

我知道 clicked( const QModelIndex& ) 只会告诉我正确的索引和文本。但是,我需要区分按钮。

4

1 回答 1

3

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,但在您的情况下它可能会有所不同)。

于 2012-10-23T02:21:45.787 回答