Gtk widget 与 Qt Widget的相互嵌套

简述

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;
}

文章作者: 张小飞
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来源 张小飞 !
 上一篇
git配置更换全局用户名 git配置更换全局用户名
吐嘈每次在github上提交代码,都发现是默认我原来的git的那个用户名,原来写了globle,现在得在当前git目录下再多设置一下,要不然还是得用默认的用户名 git config user.name "xxx" git config u
2020-06-27 张小飞
下一篇 
ubuntu18.04编译KDE dolphin文件管理器 ubuntu18.04编译KDE dolphin文件管理器
简述首先最近在研究(填坑)文件管理器,其中Qt实现的文件管理器做的最好的就是KDE实现的dolphin.所以特意装了个Ubuntu18.04的操作系统装了KDE的环境。来编译一下dolphin。 环境ubuntu的kde环境 sudo ap
2020-06-27 张小飞
  目录