Форум программистов, компьютерный форум CyberForum.ru

Qt

Войти
Регистрация
Восстановить пароль
 
DevAlone
233 / 210 / 47
Регистрация: 02.08.2016
Сообщений: 865
Завершенные тесты: 4
#1

Как добавить событие виджету без создания подклассов - C++ Qt

03.01.2017, 16:50. Просмотров 279. Ответов 6
Метки нет (Все метки)

Допустим есть у нас какой-нибудь виджет на форме, созданной в qt creator, можно ли не создавая подкласс добавить ему, допустим mouseMoveEvent. Или всегда нужно делать новый класс виджета и переопределять в нём mouseMoveEvent(QMouseEvent * event)?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.01.2017, 16:50     Как добавить событие виджету без создания подклассов
Посмотрите здесь:

Как из функции обраться к виджету, а точнее к label? - C++ Qt
Проект создавал полностью пустой. Вот .pro файл: SOURCES += \ main.cpp HEADERS += \ window.h QT += gui declarative

Как подключить к виджету консоль, чтобы там вводить данные? - C++ Qt
как подключить к виджету консоль, чтобы в там вводить данные?

Как в проект без Qt добавить поддержку Qt ? - C++ Qt
Здравствуйте! Если ход событий такой: создаю в Visual Studio проект Win32, простое оконное приложение. В студии есть AddIn От Qt. ...

Обратиться к виджету по имени - C++ Qt
нашёл в интернете что это делается как то так: QObject *find->findChild<QObject*>("Button"); и сразу ошибка expected initializer before...

Обращение к динамически созданному виджету - C++ Qt
Добрый день! При подаче сигнала с другой формы, на моей форме создался виджет void camselectdialog2::create_treeview() { ...

Передача события другому виджету - C++ Qt
Есть фрейм, который после отображения захватывает управления мышью (grabMouse()) и создаеться другой виджет на которой есть кнопки, нужно...

Симуляция клика мыши по виджету - C++ Qt
Есть форма, на ней кнопка, нужно симулировать нажатие левой кнопкой мыши на нее. Ниже код, не работает, просто ничего не...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dmitriy_M
1340 / 1221 / 111
Регистрация: 20.03.2009
Сообщений: 4,375
Записей в блоге: 11
03.01.2017, 17:58     Как добавить событие виджету без создания подклассов #2
QObject::eventFilter
Цитата Сообщение от DevAlone Посмотреть сообщение
Или всегда нужно делать новый класс виджета и переопределять
Повторное использование через наследование, это один из основных принципов ООП.
DevAlone
233 / 210 / 47
Регистрация: 02.08.2016
Сообщений: 865
Завершенные тесты: 4
03.01.2017, 18:14  [ТС]     Как добавить событие виджету без создания подклассов #3
Спасибо. А нет чего то в духе:
C++ (Qt)
1
2
3
4
5
6
void onLineEdit1MouseMove(QEvent* event)
{
// do something
}
 
lineEdit1->addEventListener(event_type, onLineEdit1MouseMove);
Dmitriy_M
1340 / 1221 / 111
Регистрация: 20.03.2009
Сообщений: 4,375
Записей в блоге: 11
03.01.2017, 18:55     Как добавить событие виджету без создания подклассов #4
Нет.
Avazart
7101 / 5278 / 267
Регистрация: 10.12.2010
Сообщений: 23,283
Записей в блоге: 17
05.01.2017, 18:55     Как добавить событие виджету без создания подклассов #5
DevAlone, В ООП стиле:


C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
class Filter : public QObject
{
    Q_OBJECT
     // ...
 
protected:
    bool eventFilter(QObject *obj, QEvent *event)
    {
      // ...
    }
};

C++ (Qt)
1
2
Filter* filter = new  Filter(/* ... */); 
lineEdit1->installEventFilter(filter);

http://doc.qt.io/qt-5/qobject.html#installEventFilter
Ilot
Модератор
Эксперт С++
1789 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
12.01.2017, 08:59     Как добавить событие виджету без создания подклассов #6
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Нет.
Но почему же нет? Вы же сами указали использование фильтров.
Вот пример как я сам прикручиваю контекстное меню в виджету без наследования:
Где-то в проекте:
C++ (Qt)
1
2
3
QMenu * t_menu_estimate = new QMenu(this);
//Создаем меню...
mv_list_view_estimates_folders->installEventFilter(new oContextMenuFilter(t_menu_estimate, mv_list_view_estimates_folders));
Сам фильтр:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#ifndef CCONTEXTMENUFILTER_H
#define CCONTEXTMENUFILTER_H
 
#include <QObject>
#include <QEvent>
#include <QMenu>
 
class oContextMenuFilter : public QObject
{
    Q_OBJECT
public:
    explicit oContextMenuFilter(QMenu * menu, QObject *parent = 0);
    virtual bool eventFilter(QObject * pobj, QEvent * event);
private:
    QMenu * mv_menu;
};
 
#endif // CCONTEXTMENUFILTER_H
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <QContextMenuEvent>
#include "oContextMenuFilter.h"
 
oContextMenuFilter::oContextMenuFilter(QMenu *menu, QObject *parent) :
    QObject(parent),
    mv_menu(menu)
{
}
 
bool oContextMenuFilter::eventFilter(QObject *, QEvent * event) {
    if(event->type() == QEvent::ContextMenu) {
        QContextMenuEvent * t_context_menu_event = static_cast<QContextMenuEvent*>(event);
        mv_menu->move(t_context_menu_event->globalPos());
        mv_menu->show();
        return true;
    }
 
    return false;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.01.2017, 11:42     Как добавить событие виджету без создания подклассов
Еще ссылки по теме:

Передача виджету значения lineedit - C++ Qt
void resolusion::on_go_clicked() { dalee = new maingui(); dalee-&gt;resize(ui-&gt;lineEdit,ui.linedit_2); dalee-&gt;show(); } ...

QSIgnalMapper map по виджету который послал сигнал - C++ Qt
Доброго времени суток. Не могу подсоединить к слоту через QSIgnalMapper сигналы от двух QLineEdit так, что бы в слот передавался указатель...

Кодировка в при передаче текста виджету через setText() - C++ Qt
Динамически создается объект (QWidget) При его создании динамически добавляется текст функцией setText(). Текст добавляется на русском. ...

Как у QTreeview поймать событие клика по пустой области (не по Item)? - C++ Qt
Добрый день! Требуется при нажатии пользователем в пустой области QTreeView не по Item, снять выделение Item и на основании того, что...

Как правильно запостить событие клика по рабочему столу(корневому окну) - C++ Qt
Мне нужно написать приложение которое парсит пиксель жкрана при клике по любой позиции, ОС OpenSuse. Есть расширенный класс корневого...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Dmitriy_M
1340 / 1221 / 111
Регистрация: 20.03.2009
Сообщений: 4,375
Записей в блоге: 11
12.01.2017, 11:42     Как добавить событие виджету без создания подклассов #7
Цитата Сообщение от Ilot Посмотреть сообщение
Но почему же нет?
Потому, что нужно наследоваться от QObject, для реализации фильтра. Без этого наследования сделать невозможно.
Yandex
Объявления
12.01.2017, 11:42     Как добавить событие виджету без создания подклассов
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru