Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
77 / 77 / 30
Регистрация: 21.05.2015
Сообщений: 257
1

Экспорт QObject классов и сигналы

04.12.2015, 15:02. Показов 1261. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть библиотека виджетов, возьмем один из них, реализован примерно так:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
class WIDGET_EXPORT MyComboBox : public QWidget
{
    Q_OBJECT
public:
    MyComboBox(QWidget *parent = 0);
    ~MyComboBox();
    void initValues(const QStringList &_values);
 
Q_SIGNALS:
    void presetLoaded(const QString &_text);
    ...
Все хорошо, библиотека собирается, к другим программам подключается.

Далее я пытаюсь использовать виджет примерно вот так:

C++ (Qt)
1
2
     MyComboBox *combo = new MyComboBox();
     connect(combo, SIGNAL(presetSaved(QString)), &myclass, SLOT(mySlot(QString)));
и в таком случае все хорошо, все работает, слот срабатывает.
Но вот когда я хочу делать так:
C++ (Qt)
1
2
    MyComboBox *combo = new MyComboBox();
    connect(combo, &MyComboBox::presetLoaded, &myclass, &SomeClass::mySlot);
то получаю ошибку компиляции:
main.obj:-1: ошибка: LNK2001: unresolved external symbol "public: static struct QMetaObject const MyComboBox::staticMetaObject" (?staticMetaObject@MyComboBox@@2UQMetaObject@@B)
Чтоб избавиться от ошибку, нужно хидер mycombobox.h подключить к проекту, что не всегда удобно.

Можно ли как-то избавиться от этой проблемы? Ведь для встроенный qt типов не нужно подключать хидеры в проект, чтоб использовать второй способ подключения сигналов-слотов.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.12.2015, 15:02
Ответы с готовыми решениями:

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

Как написать конструктор от двух классов QObject и QAbstractNativeEventFilter
Всем привет! Новичок:) Пытаюсь написать прогу для определения подключившегося устройства юсб. ...

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

Экспорт классов из DLL
Привет. Вот так я экспортирую обычные ф-ии: main.h #ifndef __MAIN_H__ #define __MAIN_H__ ...

8
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
06.12.2015, 11:07 2
Не ясно как без хедера вообще собиралось, скорее вы его просто не явно подключали. По этому нет, пропускать хедер нельзя.
0
77 / 77 / 30
Регистрация: 21.05.2015
Сообщений: 257
06.12.2015, 19:21  [ТС] 3
RazrFalcon, ну понятное дело что в коде программы по-любому придется писать #include "mycombobox.h". Но вот чтоб компилировался такой вариант:
C++
1
2
MyComboBox *combo = new MyComboBox();
    connect(combo, &MyComboBox::presetLoaded, &myclass, &SomeClass::mySlot);
то нужно еще и в pro-файле добавить этот хидер: HEADERS += ../mycombobox.h
0
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
07.12.2015, 11:39 4
Цитата Сообщение от sashatref Посмотреть сообщение
то нужно еще и в pro-файле добавить этот хидер
нужно

сигналы-слоты это не встроенная фича c++, поэтому она реализуется через костыль - MOC.
Ему нужно знать список всех хедеров.
0
77 / 77 / 30
Регистрация: 21.05.2015
Сообщений: 257
07.12.2015, 12:09  [ТС] 5
RazrFalcon, вопрос почему не нужно встроенные qt типы таким явным образом подключать? или это происходит неявно для разработчика?
0
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
07.12.2015, 12:31 6
Цитата Сообщение от sashatref Посмотреть сообщение
почему не нужно встроенные qt типы таким явным образом подключать
Какие типы? Как подключать?
0
77 / 77 / 30
Регистрация: 21.05.2015
Сообщений: 257
07.12.2015, 12:50  [ТС] 7
RazrFalcon, для того чтоб использовать лямбды с qt типами(QComboBox, QListWidget, QPushButton), мне достаточно подключить нужный хидер:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <QComboBox>
#include <QDebug>
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
 
    QComboBox *combo = new QComboBox();
    combo->setEditable(true);
    combo->show();
    QObject::connect(combo, &QComboBox::currentTextChanged, [](const QString &_text)
    {
        qDebug() << _text;
    });
 
    return a.exec();
}
Для того чтоб использовать лямбды с моим типом, дополнительно нужно в pro-файл писать:

HEADERS += ../mycombobox.h
Если этого не сделать, то проект не будет собираться, ругаясь:
main.obj:-1: ошибка: LNK2001: unresolved external symbol "public: static struct QMetaObject const MyComboBox::staticMetaObject" (?staticMetaObject@MyComboBox@@2UQMetaObject@@B)
На фоне этого возник вопрос, это обязательная мера, или же я неверное экспортирую свой тип и что-то где-то упустил.
0
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
07.12.2015, 13:14 8
QComboBox - это не тип, а класс.

Ну так все верно. Qt классы не нужно подключать в pro-файле - так как они уже собраны и лежат у вас на компе в виде либы. А вот ваши классы нужно собрать перед использованием, и для этого их нужно указать в pro-файле, что бы он их собрал.

Вы путаете сборку проекта и подключение внешних библиотек.
0
77 / 77 / 30
Регистрация: 21.05.2015
Сообщений: 257
07.12.2015, 14:30  [ТС] 9
RazrFalcon, так MyComboBox и лежит в библиотеке.
C++
1
2
3
4
5
6
class WIDGET_EXPORT MyComboBox : public QWidget
{
    Q_OBJECT
public:
    MyComboBox(QWidget *parent = 0);
    ....
C++
1
define WIDGET_EXPORT __declspec(dllexport)
0
07.12.2015, 14:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.12.2015, 14:30
Помогаю со студенческими работами здесь

Экспорт и импорт модулей и классов.
Privet vsem. Podskajitye gdye ya oshibayus? Es word document v nyom est modul i est class (imya...

Экспорт классов из dll библиотек (Visual Studio)
Здравствуйте! Подскажите, как такой код вставить в dll файл и загрузить его в программу: //log.h...

Что значат эти сигналы (vmware w, bios сигналы)?
Создаю машину с Kali, при запуске если стоит bios 1 длинный сигнал , если uefi 1 длинный и 1...

Наследование QObject
Здравствуйте. Столкнулся с такой проблемой: Сейчас учу слоты и сигналы и вот хочу создать класс...

QObject::fintChild
У меня есть ряд динамически создающихся объектов, в частности QLineEdit *field = new QLineEdit;...

QObject::deleteleter()
Доброго времени суток! Можете на пальцах, подробно рассказать как работает этот слот, а то уже...


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

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