在主函数(库)之外实例化 QApplication

Posted

技术标签:

【中文标题】在主函数(库)之外实例化 QApplication【英文标题】:Instantialize QApplication outside main function (library) 【发布时间】:2013-11-28 13:15:35 【问题描述】:

我有一个 c++ 库,我计划向它添加一个可选功能(由宏启用)以显示一些额外的调试信息。这个想法是创建并打开一个用 Qt 制作的窗口来显示一些数据。我的问题是我无法访问主函数(它是一个库),所以我无法创建 Qt 需要的 QApplication 对象。我试过创建这样的全局对象:

static int argc = 1;
static char argv[1][6] = "myapp";
static QApplication app(argc, (char**)argv);

它可以工作,但在退出时崩溃(~QApplication())。

另一种选择是在堆上分配对象并使用新的 API 方法来初始化/完成库。但我根本不想更改 API。

当我第一次需要打开一个窗口并泄漏它时,另一个会在堆上分配。但这似乎不是一个好主意。

有什么想法吗?

我正在使用 Qt 5.1 和 GCC 4.8,面向 Windows 和 Linux。

【问题讨论】:

QApplication::instance() 将允许您访问 main 中定义的一个(如果有的话)作为 QCoreApplication 重点是我不想强迫图书馆的用户添加他们的主要内容(甚至包括 Qt)。 您将需要一个线程用于事件循环,当应用程序停止时需要停止该线程 【参考方案1】:

Another option would be allocate the object on heap and have new API methods to initialize/finalize the library. But I don't want to change the API at all. - 好吧,不要泄漏它,有一个全局堆分配对象,并在有人附加到库时创建它,并在附件分离时销毁。是的,关于线程的观点也是 100% 正确的,因为附加/分离只是来自调用线程并且你不能阻止它,你很可能想要产生一个新线程,在那里分配 QApplication ,甚至可能在线程本地堆栈中,并在那里调用run()

【讨论】:

以上是关于在主函数(库)之外实例化 QApplication的主要内容,如果未能解决你的问题,请参考以下文章

QT 在主类之外声明 Mainwindow

PyQt4 不可见 C++ 实例化的 QApplication

为啥我不能在主函数之外定义一个类的对象(继承了另一个类)?

PyQt5如何在主UI中实例化多个UI

完全删除 QApplication 实例并在另一个线程中重新创建它

当我在主函数之外初始化结构成员时,为啥这个 c 程序会出错?