Russian Qt Forum

Qt => Общие вопросы => Тема начата: qlewer от Ноябрь 23, 2020, 18:36



Название: отловить перемещение мыши по дереву
Отправлено: qlewer от Ноябрь 23, 2020, 18:36
не нашёл стандартного способа отловить перемещение и даже нажатие мыши на qtreewidget. в сети указывают, что необходимо переопределить qtreewdget. создал класс mytree, кинул на форму, правым кликом преобразовал в MyTree. класс MyTree.h:
Код:
#ifndef MYTREE_H
#define MYTREE_H
#include <QTreeWidget>
namespace Ui {
class MyTree;
}
class MyTree : public QTreeWidget
{
    Q_OBJECT
private slots:
    void updateTime()
    {
        qDebug()<<12;
    }
public:
    MyTree(QWidget *parent = 0) : QTreeWidget(parent) {
        setMouseTracking(true);
    }
    //    void mouseMoveEvent(QMouseEvent *) {
    //    }
    //void mousePressEvent(QMouseEvent *);{
    //}
    //    void mouseReleaseEvent(QMouseEvent *){
    //    }
    }
};
#endif
если раскоментировать, например, mousePressEvent, то я смогу обрабатывать действия по нажатию, но сигнал о том, что произошло нажатие, даже не отправится в дерево( что я делаю не так?


Название: Re: отловить перемещение мыши по дереву
Отправлено: tux от Ноябрь 23, 2020, 19:15
installEventFilter(this);


Название: Re: отловить перемещение мыши по дереву
Отправлено: qlewer от Ноябрь 23, 2020, 19:34
можете чуть подробнее? у меня есть EventFilter в основном классе программы, там я и обрабатываю события дерева. те, что могу


Название: Re: отловить перемещение мыши по дереву
Отправлено: tux от Ноябрь 23, 2020, 20:05
    MyTree(QWidget *parent = 0) : QTreeWidget(parent) {
        installEventFilter(this);
        setMouseTracking(true);
    }


Название: Re: отловить перемещение мыши по дереву
Отправлено: tux от Ноябрь 23, 2020, 20:07
можете чуть подробнее? у меня есть EventFilter в основном классе программы, там я и обрабатываю события дерева. те, что могу
Либо не обрабатываете правильно, либо обрабатываете не то. Сложно по куску кода увидеть всё целиком.


Название: Re: отловить перемещение мыши по дереву
Отправлено: qlewer от Ноябрь 23, 2020, 20:24
я ведь отправил весь код? после
Код:
installEventFilter(this);
нужно писать     
Код:
bool eventFilter(QObject* object, QEvent* event)
    {
        if (event->type() == QEvent::MouseButtonPress)
        {
            qDebug()<<555;
        }
        return false;
    }
да? но ни в классе переобъявленного дерева, ни в основном классе это событие не ловится.
Код:
    virtual void mousePressEvent(QMouseEvent *){}
работает, но тогда до дерева не доходят нажатия, словно жму в пустоту


Название: Re: отловить перемещение мыши по дереву
Отправлено: tux от Ноябрь 23, 2020, 20:51
У вас совершенно непонятно, что и как вы делаете. Обработчик то один, то несколько. В плане перехвата событий, QTreeWidget не отличается от любого другого класса.
Лучше всего сделать простейший пример проблемы (только полный), тогда можно уже конкретнее говорить. Лично я, так и делал, когда изучал Qt. Это проще и быстрее.


Название: Re: отловить перемещение мыши по дереву
Отправлено: qlewer от Ноябрь 23, 2020, 21:15
вот пустой проект с этой проблемой. на дереве ничего не нажимается. eventfilter никак не работает


Название: Re: отловить перемещение мыши по дереву
Отправлено: tux от Ноябрь 23, 2020, 22:09
Просто поменяйте
installEventFilter(this);
на
QApplication::instance()->installEventFilter(this);
и всё заработает.


Название: Re: отловить перемещение мыши по дереву
Отправлено: qlewer от Ноябрь 23, 2020, 22:57
я получаю нажатия от QWidgetWindow(0x4487a0, name = "MainWindowWindow") и от QWidget(0xebb588, name = "qt_scrollarea_viewport"), но не от дерева(


Название: Re: отловить перемещение мыши по дереву
Отправлено: kambala от Ноябрь 24, 2020, 00:00
повесь фильтр на treeWidget->viewport() (qt_scrollarea_viewport наверное он и есть)


Название: Re: отловить перемещение мыши по дереву
Отправлено: qlewer от Ноябрь 24, 2020, 09:46
выходит, никакие переопределения классов не нужны. создал пустой проект, добавил
Код:
ui->treeWidget->setMouseTracking(true);
     ui->treeWidget->viewport()->installEventFilter(this);
и всё работает. зачем тогда везде советуют переопределение, мне осталось непонятно. спасибо, добрый человек


Название: Re: отловить перемещение мыши по дереву
Отправлено: tux от Ноябрь 24, 2020, 10:28
зачем тогда везде советуют переопределение, мне осталось непонятно
Просто задачи разные бывают. Не всегда ведь можно простым фильтром обойтись.