本文主要是介绍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;
}
这篇关于Gtk widget 与 Qt Widget的相互嵌套的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!