QHeaderView :: mousePressEvent(需要弄清楚列/索引)

时间:2012-10-23 01:07:01

标签: qt qheaderview

一般来说,当我重新实现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,列()为-1。显然,我将一个空字符串传递给handle_right_click(),它会启动一个菜单。该菜单不知道哪个列称为它,并且随后会发生混乱。

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

1 个答案:

答案 0 :(得分:4)

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