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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: отловить перемещение мыши по дереву  (Прочитано 7745 раз)
qlewer
Новичок

Offline Offline

Сообщений: 41


Просмотр профиля
« : Ноябрь 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, то я смогу обрабатывать действия по нажатию, но сигнал о том, что произошло нажатие, даже не отправится в дерево( что я делаю не так?
Записан
tux
Global Moderator
Бывалый
*****
Offline Offline

Сообщений: 404



Просмотр профиля
« Ответ #1 : Ноябрь 23, 2020, 19:15 »

installEventFilter(this);
Записан

qlewer
Новичок

Offline Offline

Сообщений: 41


Просмотр профиля
« Ответ #2 : Ноябрь 23, 2020, 19:34 »

можете чуть подробнее? у меня есть EventFilter в основном классе программы, там я и обрабатываю события дерева. те, что могу
« Последнее редактирование: Ноябрь 23, 2020, 20:06 от qlewer » Записан
tux
Global Moderator
Бывалый
*****
Offline Offline

Сообщений: 404



Просмотр профиля
« Ответ #3 : Ноябрь 23, 2020, 20:05 »

    MyTree(QWidget *parent = 0) : QTreeWidget(parent) {
        installEventFilter(this);
        setMouseTracking(true);
    }
Записан

tux
Global Moderator
Бывалый
*****
Offline Offline

Сообщений: 404



Просмотр профиля
« Ответ #4 : Ноябрь 23, 2020, 20:07 »

можете чуть подробнее? у меня есть EventFilter в основном классе программы, там я и обрабатываю события дерева. те, что могу
Либо не обрабатываете правильно, либо обрабатываете не то. Сложно по куску кода увидеть всё целиком.
Записан

qlewer
Новичок

Offline Offline

Сообщений: 41


Просмотр профиля
« Ответ #5 : Ноябрь 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 *){}
работает, но тогда до дерева не доходят нажатия, словно жму в пустоту
Записан
tux
Global Moderator
Бывалый
*****
Offline Offline

Сообщений: 404



Просмотр профиля
« Ответ #6 : Ноябрь 23, 2020, 20:51 »

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

qlewer
Новичок

Offline Offline

Сообщений: 41


Просмотр профиля
« Ответ #7 : Ноябрь 23, 2020, 21:15 »

вот пустой проект с этой проблемой. на дереве ничего не нажимается. eventfilter никак не работает
Записан
tux
Global Moderator
Бывалый
*****
Offline Offline

Сообщений: 404



Просмотр профиля
« Ответ #8 : Ноябрь 23, 2020, 22:09 »

Просто поменяйте
installEventFilter(this);
на
QApplication::instance()->installEventFilter(this);
и всё заработает.
Записан

qlewer
Новичок

Offline Offline

Сообщений: 41


Просмотр профиля
« Ответ #9 : Ноябрь 23, 2020, 22:57 »

я получаю нажатия от QWidgetWindow(0x4487a0, name = "MainWindowWindow") и от QWidget(0xebb588, name = "qt_scrollarea_viewport"), но не от дерева(
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #10 : Ноябрь 24, 2020, 00:00 »

повесь фильтр на treeWidget->viewport() (qt_scrollarea_viewport наверное он и есть)
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
qlewer
Новичок

Offline Offline

Сообщений: 41


Просмотр профиля
« Ответ #11 : Ноябрь 24, 2020, 09:46 »

выходит, никакие переопределения классов не нужны. создал пустой проект, добавил
Код:
ui->treeWidget->setMouseTracking(true);
     ui->treeWidget->viewport()->installEventFilter(this);
и всё работает. зачем тогда везде советуют переопределение, мне осталось непонятно. спасибо, добрый человек
Записан
tux
Global Moderator
Бывалый
*****
Offline Offline

Сообщений: 404



Просмотр профиля
« Ответ #12 : Ноябрь 24, 2020, 10:28 »

зачем тогда везде советуют переопределение, мне осталось непонятно
Просто задачи разные бывают. Не всегда ведь можно простым фильтром обойтись.
Записан

Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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