一般来说,当我重新实现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&)会告诉我正确的索引和文本。但是,我需要区分按钮。
答案 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
,但在您的情况下,它可能会有所不同)。