Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 25.02.2018
Сообщений: 9
1

Как написать конструктор от двух классов QObject и QAbstractNativeEventFilter

25.02.2018, 15:16. Показов 1665. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет! Новичок
Пытаюсь написать прогу для определения подключившегося устройства юсб.

Создал свой класс:
C++ (Qt)
1
2
3
4
5
6
7
class MyEventFilter : public QAbstractNativeEventFilter
{
public:
    MyEventFilter();
 
    bool nativeEventFilter(const QByteArray &eventType, void *message, long *result) Q_DECL_OVERRIDE;
};
Описание класса:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
MyEventFilter::MyEventFilter() : QAbstractNativeEventFilter()
{
    qDebug("init class MyEventFilter");
}
 
bool MyEventFilter::nativeEventFilter(const QByteArray &eventType, void *message, long *result)
{
    if(eventType == "windows_generic_MSG")
    {
        MSG* ev = static_cast<MSG *>(message);
        if (ev->message == WM_DEVICECHANGE)
        {
            if((ev->wParam == DBT_DEVICEARRIVAL) || (ev->wParam == DBT_DEVICEREMOVEPENDING) || (ev->wParam == DBT_DEVICEREMOVECOMPLETE) || (ev->wParam == DBT_CONFIGCHANGED))
            {   
                qDebug()<<"new device";
                return true;
            } //if((ev->wParam
        } // if(ev->message
    }//if(eventType
    return false;
}
Затем устанавливаем фильтр на главное окно
C++ (Qt)
1
2
3
4
5
6
7
8
9
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    a.installNativeEventFilter(w.myEventFilter);
    w.show();
 
    return a.exec();
}
Вроде все работает, события перехватываются.

Теперь мне необходимо добавить в мой класс макрос Q_OBJECT, чтобы использовать сигналы. Для этого пытаюcь наследоваться еще от класс QObject
C++ (Qt)
1
2
3
4
5
6
7
8
class MyEventFilter : public QObject, public QAbstractNativeEventFilter
{
    Q_OBJECT
public:
    MyEventFilter();
 
    bool nativeEventFilter(const QByteArray &eventType, void *message, long *result) Q_DECL_OVERRIDE;
};
Но компилятор ругается на конструктор, он остался такой же:
C++ (Qt)
1
2
3
4
MyEventFilter::MyEventFilter() : QAbstractNativeEventFilter()
{
    qDebug("init class MyEventFilter");
}
Вот ошибки
E:\...\myeventfilter.cpp:5: ошибка: undefined reference to `vtable for MyEventFilter'
Наверное надо как-то переписать конструктор, пробовал уже по-разному ничего не получается. Пробовал создавать промежуточный класс, который наследует QObject и MyEventFilter, но тоже ничего не получается. Подскажите по возможности! Спасибо!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.02.2018, 15:16
Ответы с готовыми решениями:

Конструктор копирования у QObject
Как копировать объекты наследники QObject (как свои, так и qt-шные)? При переопределении...

Наследование классов и QObject
У меня есть три класс и вот такое наследование WindowTemplate: public QObject MainWindow:...

Экспорт QObject классов и сигналы
Есть библиотека виджетов, возьмем один из них, реализован примерно так: class WIDGET_EXPORT...

Выполнение "non QObject" классов в отдельном потоке
Есть класс qObjClass_1, унаследованный от QObject. Данный класс имеет включенные в него простые (не...

10
7796 / 6562 / 2985
Регистрация: 14.04.2014
Сообщений: 28,700
25.02.2018, 15:18 2
Для чего QAbstractNativeEventFilter?
0
0 / 0 / 0
Регистрация: 25.02.2018
Сообщений: 9
25.02.2018, 15:26  [ТС] 3
Цитата Сообщение от nmcf Посмотреть сообщение
Для чего QAbstractNativeEventFilter?
для перехвата определенных сообщений. Забыл указать, есть еще код для настройки сообщений, т.е. перехватываются сообщения от устройств с определенным гуидом.
0
7796 / 6562 / 2985
Регистрация: 14.04.2014
Сообщений: 28,700
25.02.2018, 15:29 4
Ну тогда объяви его потомком QObject.
0
0 / 0 / 0
Регистрация: 25.02.2018
Сообщений: 9
25.02.2018, 15:32  [ТС] 5
Цитата Сообщение от nmcf Посмотреть сообщение
его потомком QObject
Пока в этом не силен, как раз попросил помощи.
И второй момент, этот класс наследуется из ядра, наверное из него нельзя сделать потомка? Сильно не пинайте, пока плаваю в этом-)
0
7796 / 6562 / 2985
Регистрация: 14.04.2014
Сообщений: 28,700
25.02.2018, 16:29 6
Из какого ядра?

Если нужен QObject, ну и строй тогда иерархию от него: QObject -> QAbstractNativeEventFilter -> MyEventFilter.

Нужна ли вообще эта иерархия? Некоторые слишком увлекаются лишними классами.
0
0 / 0 / 0
Регистрация: 25.02.2018
Сообщений: 9
25.02.2018, 17:15  [ТС] 7
Цитата Сообщение от nmcf Посмотреть сообщение
Из какого ядра?
Как раз этого пока и не понимаю-) QAbstractNativeEventFilter не наследуется от QObject.
Соответсвенно как построить иерархию
Цитата Сообщение от nmcf Посмотреть сообщение
QObject -> QAbstractNativeEventFilter -> MyEventFilter
не знаю.
Цитата Сообщение от nmcf Посмотреть сообщение
Нужна ли вообще эта иерархия?
Моя цель из моего класса отправлять сигналы, как это сделать не знаю, поэтому и создал тему.
Может вы поможете написать иерархию и конструктор, чтобы компилировалось-) Пока у меня не получается.

Добавлено через 21 минуту
Цитата Сообщение от buratina Посмотреть сообщение
undefined reference to `vtable for MyEventFilter'
погуглил, нашел описание этой ошибки на другом форуме
пишут
хз, на моей практике такая ошибка возникает когда Q_OBJECT забыл добавить, затем вставляешь, но qmake заново не делаешь ))
сделал qmake и все скомпилировалось-)
nmcf, спасибо!

Но все равно, если кто подскажет как написать конструктор, указав все наследования для данного случая
C++ (Qt)
1
2
3
4
class MyEventFilter : public QObject, public QAbstractNativeEventFilter
{
    ...
};
было бы хорошо, пока не совсем понимаю наследование.

Спасибо!
0
7796 / 6562 / 2985
Регистрация: 14.04.2014
Сообщений: 28,700
25.02.2018, 17:19 8
А, я не внимательно прочитал. Это же стандартный класс. Тебе не нужен никакой QObject. Не предусмотрено там такого. Используй функции типа postEvent().
1
0 / 0 / 0
Регистрация: 25.02.2018
Сообщений: 9
25.02.2018, 17:51  [ТС] 9
Цитата Сообщение от nmcf Посмотреть сообщение
Используй функции типа postEvent()
Ок, спасибо, почитаю.
Но ведь возможно же наследование от двух классов? От QObjecta мне нужны только сигналы.
И если возможно, не подскажете, почему в данном случае нельзя использовать сигналы?
0
7796 / 6562 / 2985
Регистрация: 14.04.2014
Сообщений: 28,700
25.02.2018, 18:15 10
В языке наследование от двух возможно. Такие примеры есть среди элементов QGraphicsScene.
А этот механизм native-событий уже стандартизирован и работает на низком уровне.
1
0 / 0 / 0
Регистрация: 25.02.2018
Сообщений: 9
25.02.2018, 19:02  [ТС] 11
Первую часть ответа понял, вторую не особо-) Вернусь к этому когда придет понимание.
Спасибо!
0
25.02.2018, 19:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.02.2018, 19:02
Помогаю со студенческими работами здесь

Создать класс. Написать конструктор по умолчанию, конструктор с параметрами. Перегрузить операции «меньше» и «равно»
Помогите пожалуйста, хоть с одним из заданий. 1. Создать класс. Написать конструктор по...

Как написать конструктор
public class MyClass&lt;T&gt; { } К этому классу

Как написать конструктор!?
Всем привет! В классе UTM вылезают ошибки, предполагаю, что из-за неправильного конструктора,...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru