QQuickWindow в общей библиотеке автоматически закрывается при отображении в QApplication

Я разрабатываю общую библиотеку интерфейса с помощью qt. У меня проблемы с эффектом нажатия на QPushbutton, когда я нажимаю на сенсорный экран (этот эффект появляется один раз при 10 кликах).

Поэтому я создаю базовое приложение qml с одной кнопкой, и эффект нажатия появляется все время. Я включаю часть qml в свою библиотеку и загружаю ее в QQuickWidget, и у меня такая же проблема с нажатым эффектом.

Поэтому я хочу использовать только qml. Мое основное приложение - это QApplication, и я загружаю в него свою библиотеку, в которую я загружаю файл qml с помощью QQmlApplication Engine. Затем я показываю это с помощью QQuickWindow.

Когда я запускаю свое приложение, я вижу, что окно открыто, но оно автоматически закрывается. Я думаю, что мое QApplication не обнаруживает QML, и цикл рендеринга не запускается.

У меня Windows с QT5.5.1 (MSVC2013, 32 бит)

pro файл основного приложения

QT += core xml widgets qml quick

TARGET = COM_INT
CONFIG += console
CONFIG -= app_bundle

TEMPLATE = app


SOURCES += main.cpp \
    comint.cpp
HEADERS += \
    comint.h \

INCLUDEPATH += "$$(My_Workspace)/Modules_Generique/IHM_Soft"
Release{
    LIBS += "$$(My_Workspace_build)/IHM_Soft/release/IHM_Soft.lib"
}

Debug{
    LIBS += "$$(My_Workspace_build)/IHM_Soft/debug/IHM_Soft.lib"
}

Основное приложение (exe) main.cpp

#include <QApplication>
#include <QQmlApplicationEngine>

#include "comint.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    ComInt com;
    com.initialize();

    return a.exec();
}

Класс ComInt: Исходный файл comint.cpp

#include "comint.h"
#include "ihmsoft.h"

ComInt::ComInt()
{
}

void ComInt::initialize()
{
    this->m_pIHMSoft = new IHMSoft();
}

заголовочный файл comint.h

#ifndef COMINT_H
#define COMINT_H

class IHMSoft;

class ComInt
{
public:
    ComInt();
    void initialize();
private:
    IHMSoft *m_pIHMSoft;
};

#endif // COMINT_H

pro файл общей библиотеки

QT       += xml widgets core qml quick quickwidgets
CONFIG  += c++11

TARGET = IHM_Soft
TEMPLATE = lib

DEFINES += IHM_SOFT_LIBRARY

SOURCES +=  ihmsoft.cpp
HEADERS +=  ihmsoft.h\
        ihm_soft_global.h

RESOURCES += \
    rsc.qrc

Общая библиотека: исходный файл ihm_soft.cpp

#include "ihmsoft.h"
#include <QQmlApplicationEngine>
#include <QQuickWindow>

IHMSoft::IHMSoft(){

    qputenv("QT_QUICK_CONTROLS_STYLE", "Base");
    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/IHM_Soft.qml")));
    QList<QObject*> root = engine.rootObjects();
    QQuickWindow *window = qobject_cast<QQuickWindow*>(root.at(0));
    window->show();
}

заголовочный файл ihm_soft.h

#ifndef IHM_SOFT_H
#define IHM_SOFT_H

#include "ihm_soft_global.h"

class IHM_SOFT_SHARED_EXPORT IHM_Soft
{

public:
    IHM_Soft();
};

#endif // IHM_SOFT_H

Глобальный файл ihm_soft_global.h

#ifndef IHM_SOFT_GLOBAL_H
#define IHM_SOFT_GLOBAL_H

#include <QtCore/qglobal.h>

#if defined(IHM_SOFT_LIBRARY)
#  define IHM_SOFT_SHARED_EXPORT Q_DECL_EXPORT
#else
#  define IHM_SOFT_SHARED_EXPORT Q_DECL_IMPORT
#endif

#endif // IHM_SOFT_GLOBAL_H

Qml-файл

import QtQuick 2.0
import QtQuick.Controls 1.4

import QtQuick.Window 2.0



ApplicationWindow {
    visible: true
    width: 500
    height: 500

    Button {
        visible: true
        iconSource: "resources/t_on_off.png"
    }
}

Редактировать: извините, код основного приложения был тестовым приложением, которое не включает lib.


person user3548107    schedule 26.04.2019    source источник
comment
предоставьте минимальный воспроизводимый пример, как вы загружаете библиотеку?   -  person eyllanesc    schedule 26.04.2019
comment
Как код из main относится к lib? Во всяком случае, я вижу 2 случая QQmlApplicationEngine, которые не должны происходить   -  person folibis    schedule 26.04.2019
comment
У меня был некоторый код, который позволяет проверить проблему.   -  person user3548107    schedule 26.04.2019


Ответы (1)


Переменная удаляется, когда ее область действия заканчивается, в вашем случае engine — это локальная переменная, которая удаляется, когда IHMSoft завершает сборку, поэтому вы видите, что окно закрывается. Решение состоит в том, чтобы сделать его членом класса:

*.h

#ifndef IHM_SOFT_H
#define IHM_SOFT_H

#include "ihm_soft_global.h"
#include <QQmlApplicationEngine>

class IHM_SOFT_SHARED_EXPORT IHM_Soft
{

public:
    IHM_Soft();
private:
    QQmlApplicationEngine engine; // member
};

#endif // IHM_SOFT_H

*.cpp

#include "ihmsoft.h"

IHMSoft::IHMSoft(){
    qputenv("QT_QUICK_CONTROLS_STYLE", "Base");
    engine.load(QUrl(QStringLiteral("qrc:/IHM_Soft.qml")));
}
person eyllanesc    schedule 26.04.2019