С трудом нашёл решение через eventFilter, но оно у меня почему-то не работает:
QAbstractButton *btn = findChild<QAbstractButton *>();
if (btn!=NULL) btn->installEventFilter(this); // это для рисования текста в нулевой ячейке заголовков - работает
horizontalHeader()->installEventFilter(this);
...............
bool RequestTableWidget::eventFilter(QObject* o, QEvent* e)
{
if (e!=NULL)
{
if (e->type() == QEvent::Paint)
{
QAbstractButton* btn = qobject_cast<QAbstractButton*>(o);
if (btn)
{
// paint by hand (borrowed from QTableCornerButton)
...........................
return true; // eat event
}
}
if ( e->type()==QEvent::MouseButtonPress ) // && o==horizontalHeader()
{
QMouseEvent *mEvent = (QMouseEvent*) e;
if ( mEvent->button() == Qt::RightButton ) // right button?
{
qDebug() << "right button click"; // не работает
HideColumnsDialog dlg;
dlg.exec();
return true; // eat event
}
}
}
return false;
}
Да и не оно удобно — не даёт сразу ссылку на кликнутый item. По координатам как-то некрасиво вычислять
ИМХО проще наследоваться от QHeaderView, а там переопределить функции которые тебе нужны
virtual void mousePressEvent ( QMouseEvent * e )
virtual void mouseReleaseEvent ( QMouseEvent * e )
после надо скормить кастомный заголовок таблице
void QTableView::setHorizontalHeader ( QHeaderView * header )