Skip to content

Instantly share code, notes, and snippets.

@Mufanc
Created August 11, 2024 04:48
Show Gist options
  • Save Mufanc/19a171276c430c483b7cf61835c0db5f to your computer and use it in GitHub Desktop.
Save Mufanc/19a171276c430c483b7cf61835c0db5f to your computer and use it in GitHub Desktop.
在 GTK 窗口中嵌入 QT 控件
#include <QApplication>
#include <QWidget>
#include <QLabel>
#include <QVBoxLayout>
#include <QWindow>
#include <QTimer>
#include <QPushButton>
#ifdef signals
#define SIGNALS_BACKUP signals
#undef signals
#endif
#include <gtk/gtk.h>
#include <gtk/gtkx.h>
#ifdef SAVE_SIGNALS
#define signals SIGNALS_BACKUP
#undef SIGNALS_BACKUP
#endif
// clang++ -o demo demo.cpp $(pkg-config --cflags --libs Qt5Widgets) $(pkg-config --cflags --libs gtk+-3.0)
int main() {
int argc = 0;
char **argv = { nullptr };
// initialize
gtk_init(&argc, &argv);
QApplication app(argc, argv);
GtkWidget *gwin = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(gwin), "GTK");
g_signal_connect(G_OBJECT(gwin), "destroy", G_CALLBACK(gtk_main_quit), nullptr);
// create gtk socket
GtkWidget *socket = gtk_socket_new();
gtk_widget_show(socket);
gtk_container_add(GTK_CONTAINER(gwin), socket);
gtk_widget_realize(socket);
// create QWidget
QWidget *container = new QWidget();
QVBoxLayout *layout = new QVBoxLayout;
QPushButton *button = new QPushButton("This is a Qt5 button");
layout->addWidget(button);
container->setLayout(layout);
// embed into gtk window
gtk_socket_add_id(GTK_SOCKET(socket), container->winId());
container->show();
// display
gtk_widget_show(gwin);
gtk_main();
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment