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 に答える