Шаги по воспроизведению (Qt Creator с qmake, Qt6.5.3 с MSVC2019(2022)):
- Создайте родительский проект с именем «P».
- Создайте три подпроекта с именами «M», «C» и «U», где «M» будет исполняемой записью, «C» — промежуточным проектом, а «M» — обеспечивающим Компоненты пользовательского интерфейса (зависимости: M зависит от C и U, а C зависит от U).
- В «U» создайте класс под названием MyWidget. Класс содержит структуру пользовательского интерфейса, и этот класс экспортируется с помощью Q_DECL_EXPORT.
- И в «M», и в «U» включите MyWidget и импортируйте его с помощью Q_DECL_IMPORT.
Программа отлично работает при использовании непосредственно в «M». Однако когда «M» вызывает «C» (который создает прокси-класс в «C» для обработки создания MyWidget и предоставляет его логику «M»), программа аварийно завершает работу.
Если этот объект создается только в проекте «C», произойдет сбой дважды:
Код: Выделить всё
new MyQWidget;
new MyQWidget;//crushed.
Код: Выделить всё
class EXPORT MyWidget : public QWidget {
MyUiStruct ui;
//just empty body in cpp source.
explicit MyWidget(QWidget* parent = nullptr);
~MyWidget() noexcept;
... No need more code, do nothing in cpp source code.
}
Код: Выделить всё
struct MyUiStruct {
private:
const MyPathInfo pathInfo;
... No need more code.
}
Код: Выделить всё
struct MyPathInfo {
QString proHuiDir;
QString huiFileName;
QString path;
#if defined(QT_DEBUG) && defined(_USE_CODE_EDITOR)
QString huiDir;
QString sourceCodeDir;
QString classFileName;
#endif
MyPathInfo () {
#ifdef __PRO_HUI_DIR
proHuiDir = __PRO_HUI_DIR;
#else
proHuiDir = ":/h_ui";
#endif
huiFileName = "my_ui_file.hui";
#if defined(QT_DEBUG) && defined(_USE_CODE_EDITOR)
classFileName = "MyUi";
#endif
path = proHuiDir + "/" + huiFileName + ".hui";
}
#if defined(QT_DEBUG) && defined(_USE_CODE_EDITOR)
void setHuiDir(const QString& dir) {
huiDir = dir;
path = huiDir + "/" + huiFileName + ".hui";
}
void setCodeDir(const QString& dir) {
sourceCodeDir = dir;
}
#endif
};
Подробнее здесь: https://stackoverflow.com/questions/792 ... ssues-with