Gtk +可以和QApplication共存吗?

时间:2015-09-16 13:16:27

标签: qt gtk swi-prolog

尝试从Qt应用程序运行Gtk +时,我遇到了麻烦。

为了澄清背景,我(与Jan Wielemaker一起)写了一些Qt的东西 便携式SWI-Prolog console

事实证明它有点复杂,主要是因为SWI-Prolog有自己的线程管理,我有可能实例化多个控制台,可以运行自己的线程。 ..当然,GUI必须同步。也许我没有采取更好的实施途径 - 现在我推测 - 可以使用虚拟tty(forkpty和朋友)......

最近,一个有趣的包已经发布,PLGI,可以构建基于GObject的应用程序。

从swipl可执行文件启动时效果很好,但从swipl-win运行时崩溃。

最小的例子(显然需要PLGI,而这至少需要SWI-Prolog 7.3版,所以用?- pack_install(plgi).执行包安装)

#include <QApplication>
#include <SWI-cpp.h>
#include "mainwindow.h"
#include <QTimer>

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

    QTimer::singleShot(5000, []() {
        printf("inside\n");
        int rc = PlCall("consult('/home/carlo/lib/swipl/pack/plgi/examples/00-simple-example')");
        printf("result %d\n", rc);
    });
    printf("after\n");

    MainWindow w;
    w.show();

    return a.exec();
}

过程输出:

Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 7.3.6-17-g243e698-DIRTY)
Copyright (c) 1990-2015 University of Amsterdam, VU Amsterdam
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to redistribute it under certain conditions.
Please visit http://www.swi-prolog.org for details.

For help, use ?- help(Topic). or ?- apropos(Word).


(use_plgi:2644): GLib-GObject-WARNING **: cannot register existing type 'GdkDisplayManager'

(use_plgi:2644): GLib-CRITICAL **: g_once_init_leave: assertion 'result != 0' failed

(use_plgi:2644): GLib-GObject-CRITICAL **: g_object_new: assertion 'G_TYPE_IS_OBJECT (object_type)' failed

当然,Qt控制台应用程序可以运行:

#include <QCoreApplication>
#include <SWI-cpp.h>
#include <QTimer>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    PlEngine e(argc, argv);

    printf("before\n");
    QTimer::singleShot(1000, []() {
        printf("inside\n");
        int rc = PlCall("consult('/home/carlo/lib/swipl/pack/plgi/examples/00-simple-example')");
        printf("result %d\n", rc);
    });
    printf("after\n");

    return a.exec();
}

从我读到的关于错误的内容

(use_plgi:2644): GLib-GObject-WARNING **: cannot register existing type 'GdkDisplayManager'

似乎消息队列无法正常工作,我一直无法追查问题。有可用的提示吗?

0 个答案:

没有答案