0

我已使用此链接开始,[ https://stackoverflow.com/a/11056698/5609063][1]

我正在尝试创建一个在内部创建其 GUI 并自行清理的对象。

如果我想强制关闭,我也可以调用 quit() 来关闭 gui,或者我可以坐在 .exec 调用上,直到主窗口关闭。

FooObj.h

class FooObj
{
public:
    FooObj(FooObj *obj);
    ~FooObj();
private:
    GUIApp *guiApp;
    FooObj *m_fooObj;
}

FooObj.c

FooObj::FooObj()
{ 
    guiApp = new GUIApp(this);
}

FooObj::~FooObj()
{
    delete guiApp;
}

GUIApp.h

class GUIApp
{
public:
    GUIApp(FooObj *obj);
    ~GUIApp();

private:
    std::thread m_appThread;
    void m_RunApp();
}

GUIApp.c

GUIApp::GUIApp(obj)
{
    m_fooObj = obj;
    m_appThread = std::thread ([this] {m_RunApp();});
}

GUIApp::~GUIApp()
{
    if(m_appThread.joinable())
        m_appThread.join();
}

void GUIApp::m_RunApp()
{
    int argc = 1;
    auto a = new QApplication(argc, NULL);
    auto win = new FooObjGUI(m_fooObj);
    win->show();
    a->exec();
    return;
}

在 GUIApp 中,有一个对 FooObjGUI 的调用,它使用 FooObj 到一个 gui 设置来处理我想要显示的所有数据以及我向用户公开的操作。

我的目的是让这段代码的用户不必担心 qt 并让它自己清理。

当我创建单个 FooObj 时,此代码在 dll 或 exe 中运行良好。我无法创建第二个 FooObj,因为我无法创建第二个 QApplication。我尝试了几个想法,在一个单独的线程中启动 a->exec(),但是没有处理事件并且 gui 处于空闲状态。

有没有办法在单个 dll 中跨多个线程调用 QApplication?是否有解决方法让 FooObj 使用相同的 QApplication 并且不阻止 dll 的执行?我目前唯一的解决方法是使用 2 个 dll 副本,但这不是一个好的长期解决方案。

4

0 回答 0