Вставить виджет GTK в окно Qt
Мне нужно разработать приложение для Windows, Linux и Mac. Чтобы не писать все окна самостоятельно, я решил использовать Qt5 (вместо wxWidgets, потому что последний не содержит предварительно скомпилированных двоичных файлов). У меня есть GTK Widget (от Cef), который мне сейчас нужно встроить, но, к сожалению, понятия не имею, как.
Кажется, там было QX11EmbedContainer
в предыдущих версиях Qt, но его больше нет, и я не уверен, что это работает, когда есть переход на Weyland.
2 ответа
Вы можете попробовать QT WebKit, если вам нужен только браузер для встраивания
http://qt-project.org/doc/qt-5.0/qtwebkit/qtwebkit-index.html
QMainWindow* main_window = new QMainWindow;
QX11EmbedContainer* container = new QX11EmbedContainer;
main_window->setCentralWidget(container);
//gtk code
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);
вы можете использовать класс QX11EmbedContainer на Qt4.
Прошло 7 лет, но я уже сталкивался с этим раньше. Вот что я нашел 1:
Я нашел способ правильно встроить CEF в окно Qt: вставить его в пустой QWindow вместо QWidget. Однако есть некоторые предостережения:
Чтобы добавить окно CEF в макет QWidget, вам нужно будет использовать QWidget::createWindowContainer()
Пустое окно QWindow ничего не отображает - даже фона. Таким образом, вам может потребоваться использовать QBackingStore, чтобы он отображал что-то, когда CEF не встроен - см. Пример Raster Window для некоторой справки.
Возможно, вам потребуется использовать winId из перед добавлением QWindow в макет виджета.
Я настоятельно рекомендую всем, кто все еще пытается это сделать, взглянуть на всю цепочку 1. QtWebkit больше не является приемлемым решением, в то время как CEF - в основном.