Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: neosapient от Май 27, 2009, 15:40



Название: QTreeWidget и QEvent::MouseButtonDblClick
Отправлено: 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);
}


Название: Re: QTreeWidget и QEvent::MouseButtonDblClick
Отправлено: EhTemka от Июнь 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"); // <-- двойной клик по пустому пространству дерева
 
       }
 
}
...
 


Название: Re: QTreeWidget и QEvent::MouseButtonDblClick
Отправлено: neosapient от Июнь 11, 2009, 17:55
Спасибо, всё получилось.