Qt / Windows: cra sh при соединении сигнала и слота в конструкторе объекта с глобальной областью действия - PullRequest
0 голосов
/ 22 апреля 2020

Следующая программа обработает sh, когда я скомпилирую и запусту ее в Qt Creator на Windows:

TestObject.h:

#include <QObject>

class TestObject : public QObject {
    Q_OBJECT
public:
    TestObject(QObject *parent = nullptr);
signals:
    void signal();
public slots:
    void slot();
};

TestObject. cpp:

#include "TestObject.h"

TestObject::TestObject(QObject *parent) : QObject(parent) {
    connect(this, &TestObject::signal, this, &TestObject::slot);
}

void TestObject::slot() {}

TestObject global;

int main(int argc, char *argv[]) {
    TestObject local;
    return 0;
}

Если я удалю либо вызов connect в конструкторе TestObject, либо TestObject globalVar;, тогда cra sh не будет. Что-то не так с вызовом connect в конструкторе глобальной области действия. Локальная переменная в main() не вызывает никаких проблем.

Я пытался скомпилировать против Qt 5.9.9, 5.11.2 и 5.14.2, и у них у всех один и тот же cra sh.

Если я скомпилирую ту же программу на macOS, нет cra * sh.

Есть ли что-то, что я делаю неправильно, или какой-то способ обойти эту проблему?

1 Ответ

2 голосов
/ 22 апреля 2020

Из документации ...

Как правило, создание объектов QObject перед QApplication не поддерживается и может привести к странным сбоям при выходе в зависимости от платформы. Это означает, что stati c экземпляры QObject также не поддерживаются. Правильно структурированное одно или многопоточное приложение должно сделать QApplication первым созданным и последним уничтоженным QObject.

То, что у вас есть, в настоящее время не поддерживается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...