Поступаем как сказано в документации - устанавливаем фильтр событий (который event filter).
Код вот такой:
Код: Выделить всё
class MainWindowImpl : public QMainWindow // наследуем от QMainWindow
{
Q_OBJECT
QWidget centralWidget;
QLabel *label;
QTreeWidget *treeWidget;
QHBoxLayout *hBoxLayout;
MainWindowImpl();
bool eventFilter(QObject *target, QEvent *event);
};
Код: Выделить всё
MainWindowImpl::MainWindowImpl() - конструктор формы
{
hBoxLayout = new QHBoxLayout(¢ralWidget); //привязываемся к центральному виджету
treeWidget = new QTreeWidget();
treeWidget->insertTopLevelItem(0, new QTreeWidgetItem); //чтобы TreeWidget не был пустым
treeWidget->topLevelItem(0)->setText(0, "1");
treeWidget->insertTopLevelItem(1, new QTreeWidgetItem);
treeWidget->topLevelItem(1)->setText(0, "2");
label = new QLabel("Click here");
hBoxLayout->addWidget(label);
hBoxLayout->addWidget(treeWidget);
setCentralWidget(¢ralWidget);
hBoxLayout->installEventFilter(this); //устанавливаем фильтр
};
bool MainWindowImpl::eventFilter(QObject *target, QEvent *event) //наш обработчик событий
{
if (event->type() == QEvent::MouseButtonPress)
{
QMouseEvent *mouseEvent = (QMouseEvent *) event;
std::cout<<mouseEvent->pos().x()<<" "<<mouseEvent->pos().y()<<std::endl; //в консоль выводим координаты
return true; //возвращаю true, событие обработано, дальнейшая обработка не требуется
}
return false; //Событие должно быть обработано родительским виджетом
};
В результате, при клике на QLabel координаты нормально выводятся в консоль (произошел перехват события), а если кликнуть на QTreeWidget в консоль ничего не сбрасывается - т.е. событие не перехватывается. Строчки в QTreeWidget при этом правильно выделяются. Причем событие не отлавливается даже если явно указать treeWidget->installEventFilter(this). Чем можно объяснить такое поведение и как тогда правильно перехватывать события (другими словами, что делать и кто виноват)?