Как установить обработчик на правую кнопку мыши на заголовке таблицы?
От: shestero  
Дата: 27.11.12 21:21
Оценка:
С трудом нашёл решение через 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. По координатам как-то некрасиво вычислять
Re: Как установить обработчик на правую кнопку мыши на заголовке таблицы?
От: ncyellow  
Дата: 04.12.12 06:32
Оценка:
ИМХО проще наследоваться от QHeaderView, а там переопределить функции которые тебе нужны

virtual void mousePressEvent ( QMouseEvent * e )
virtual void mouseReleaseEvent ( QMouseEvent * e )

после надо скормить кастомный заголовок таблице

void QTableView::setHorizontalHeader ( QHeaderView * header )
Re: Как установить обработчик на правую кнопку мыши на заголовке таблицы?
От: ncyellow  
Дата: 04.12.12 06:35
Оценка:
кстати вот функция заголовка для вычисления индекса

int QHeaderView::logicalIndexAt ( const QPoint & pos ) const
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.