头像

张小飞

我有一壶酒,足以慰风尘

《GTK widget 与 Qt Widget的相互嵌套》

 6天前  •   GTK, Qt  •   , , , , ,  •   50  •   3

简述

gtk qt窗口的相互嵌套。主要是使用了Gtk中的socket跟plug的模式,与Qt中的QX11EmbedContainer。这是两个不同的UI库的相互嵌套的方法。google了下发现有个老哥写出来了,但是gtk嵌入到Qt的代码中是有点问题的,所以我改了改他的代码。最后终于完成了,毕竟我对gtk不太熟悉=。=代码很简单,这里就不做任何说明了。

代码

pro文件中添加

unix: CONFIG += link_pkgconfig
unix: PKGCONFIG += gtk+-2.0

代码

#include <gtk/gtk.h>
#include <QApplication>
#include <QMainWindow>
#include <QPushButton>
#include <QX11EmbedContainer>
#include <QX11EmbedWidget>
#include <gdk/gdkx.h>
#define MAINWINDOW_IS_QT true
#define EMBEDDED_IS_QT false
void create_qt_embed(long id)
{
    QX11EmbedWidget* plug = new QX11EmbedWidget;
    plug->embedInto(id);
    QPushButton* button = new QPushButton("My Label", plug);
    plug->show();
}
void create_gtk_plug(long id)
{
//    GtkWidget* plug = gtk_plug_new(id);
//    gtk_widget_show(plug);
//    GtkWidget* button = gtk_button_new_with_label("My Label");
//    gtk_widget_show(button);
//    GDK_WINDOW_XID(button);
//    gdk_x11_window_get_xid()
//    gtk_container_add(GTK_CONTAINER(plug), button);
}
int main(int argc, char* argv[])
{
    gtk_init(&argc, &argv);
    QApplication app(argc, argv);
    if (MAINWINDOW_IS_QT)
    {
        QMainWindow* main_window = new QMainWindow;
        QX11EmbedContainer* container = new QX11EmbedContainer;
        main_window->setCentralWidget(container);
        container->setStyleSheet("background-color:red;");
        if (EMBEDDED_IS_QT)
        {
            create_qt_embed(container->winId());
        }
        else
        {
//            gtk_widget_get_window(GTK_WIDGET(button));
            GtkWidget* window;
            GtkWidget* button;
            window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
            button = gtk_button_new ();
            gtk_widget_show (button);
            gtk_container_add (GTK_CONTAINER (window), button);
            gtk_widget_show(window);
            XID id = GDK_WINDOW_XWINDOW (GTK_WIDGET(window)->window);
            container->embedClient(id);
        }
        main_window->show();
        QApplication::exec();
    } else
    {
        GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        g_signal_connect(G_OBJECT(window), "destroy",
                         G_CALLBACK(gtk_main_quit), NULL);
        gtk_widget_show(window);
        GtkWidget* container = gtk_socket_new();
        gtk_widget_show(container);
        gtk_container_add(GTK_CONTAINER(window), container);
        if (EMBEDDED_IS_QT)
        {
            create_qt_embed(gtk_socket_get_id(GTK_SOCKET(container)));
        } else
        {
            create_gtk_plug(gtk_socket_get_id(GTK_SOCKET(container)));
        }
        gtk_main();
    }
    return 0;
}
上一篇:
没有了,已经是最新文章啦

 评论


 已有3条评论

  1. rekols 还差那么一点 Linux | 谷歌浏览器 70.0.3538.77 6天前

    学习了,大佬。

  2. rekols 还差那么一点 Linux | 谷歌浏览器 70.0.3538.77 5天前

    QX11Embed* 在 Qt5 上好像去除了。

    • 张小飞 真爱 Windows 10 | 火狐浏览器 63.0 2天前

      rekols是的,我记得有替代品