Russian Qt Forum
Сентябрь 30, 2024, 14:39 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTreeWidget и QEvent::MouseButtonDblClick  (Прочитано 3984 раз)
neosapient
Гость
« : Май 27, 2009, 15:40 »

Есть дерево на основе QTreeWidget.
Когда пользователь производил двойной клик по ячейке этого дерева, приходил сигнал itemDoubleClicked()

Теперь мне понадобилось перехватывать клики по пустой области под деревом.
(Как это правильно организовать ?)
Я пошел по пути перехвата события QEvent::MouseButtonDblClick
Написал класс QxMouseButtonClick, в котором реализован метод eventFilter(...)
Данный класс про инсталлировал на то самое дерево (конкретно на tree->viewport()->installEventFilter(mouseDblClick)Подмигивающий.
Увы, перехватываются все двойные клики, как по пустому пространству под деревом, так и по листьям дерева (второе не желательно). Подскажите, как правильно будет реализовать метод eventFilter(...), либо вообще следует пойти по другому пути?

Код:
class QxMouseButtonClick : public QObject
{
    Q_OBJECT
public:
QxMouseButtonClick(QObject *parent=NULL);
protected:
    bool eventFilter(QObject *obj, QEvent *event);
};

QxMouseButtonClick ::QxMouseButtonClick (QObject *parent):
QObject(parent)
{
dialog = (QxMainDialog*)parent;
}

bool QxMouseButtonClick ::eventFilter(QObject *obj, QEvent *event)
{
    if (event->type() == QEvent::MouseButtonDblClick) {
        QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
        qDebug("Mouse Button Dbl Click");
if(obj==dialog->tree->viewport()){
qDebug("for my tree"); // <-- ловлю все
}
        return true;
    } else {
        // standard event processing
        return QObject::eventFilter(obj, event);
    }
}

QxMainDialog::QxMainDialog{
//...
mouseDblClick = new QxMouseButtonClick (this);
tree->viewport()->installEventFilter(mouseDblClick);
}
Записан
EhTemka
Гость
« Ответ #1 : Июнь 01, 2009, 12:15 »

попробуй вставить вызов функции QModelIndex QAbstractItemView::indexAt ( const QPoint & point ) const, и проверять индекс на валидность

Код
C++ (Qt)
 
...
if(obj==dialog->tree->viewport()){
       qDebug("for my tree"); // <-- ловлю все
 
       QModelIndex index = dialog->tree->indexAt(mouseEvent->pos());
       if( ! index.isValid() ) {
              qDebug("free space"); // <-- двойной клик по пустому пространству дерева
 
       }
 
}
...
 
Записан
neosapient
Гость
« Ответ #2 : Июнь 11, 2009, 17:55 »

Спасибо, всё получилось.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.08 секунд. Запросов: 21.