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

Qt

Войти
Регистрация
Восстановить пароль
 
DevAlone
279 / 230 / 48
Регистрация: 02.08.2016
Сообщений: 944
Завершенные тесты: 4
#1

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

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

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

Как из функции обраться к виджету, а точнее к 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#
Можно ли как то добавить строковый параметр внутрь exe? например я запускаю exe на одном компьютере пишу в консольке или в форме какой то...

Как отловить событие создания файла в папке - C#
Пользователь, к примеру, пытается создать в папке новый файл, или скопировать туда существующий. В зависимости от определенных условий мне...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Dmitriy_M
1342 / 1223 / 112
Регистрация: 20.03.2009
Сообщений: 4,408
Записей в блоге: 11
03.01.2017, 17:58 #2
QObject::eventFilter
Цитата Сообщение от DevAlone Посмотреть сообщение
Или всегда нужно делать новый класс виджета и переопределять
Повторное использование через наследование, это один из основных принципов ООП.
DevAlone
279 / 230 / 48
Регистрация: 02.08.2016
Сообщений: 944
Завершенные тесты: 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
1342 / 1223 / 112
Регистрация: 20.03.2009
Сообщений: 4,408
Записей в блоге: 11
03.01.2017, 18:55 #4
Нет.
Avazart
Эксперт С++
7151 / 5328 / 277
Регистрация: 10.12.2010
Сообщений: 23,576
Записей в блоге: 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
Модератор
Эксперт С++
1809 / 1166 / 227
Регистрация: 16.05.2013
Сообщений: 3,071
Записей в блоге: 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;
}
Dmitriy_M
1342 / 1223 / 112
Регистрация: 20.03.2009
Сообщений: 4,408
Записей в блоге: 11
12.01.2017, 11:42 #7
Цитата Сообщение от Ilot Посмотреть сообщение
Но почему же нет?
Потому, что нужно наследоваться от QObject, для реализации фильтра. Без этого наследования сделать невозможно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.01.2017, 11:42
Привет! Вот еще темы с ответами:

Как добавить событие в календарь - Программирование Android
Такой вопрос. Как добавить событие в календарь ? Видел в одном приложении что можно.

VC++ 6.0 (MFC) Dialog, : public CDialog - Как иниц-ть событие создания окна диалога? - Visual C++
Visual C++ 6.0 SP5 MFC - простой диало созданный встроенным мастером в общем мне нужно как диалог со всеми кнопками вырисовался...

Как добавить событие при keyup? - JavaScript
Собственно делаю так, но не получается &lt;input type='text' keyup=&quot;saveHours();&quot;&gt; function saveHours(){ alert('key'); } ...

Как добавить событие Onclick из кода. - C# ASP.NET
ListItem lb1 = new ListItem(); lb1.Attributes.Add(&quot;onclick&quot;, @&quot;$('#article-sample').hide(); $('#event-sample').show();&quot;); а...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
12.01.2017, 11:42
Ответ Создать тему
Опции темы

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