gpt4 book ai didi

c++ - 如何连接 wxWidgets、GTK2 小部件和 X11 窗口?

转载 作者:太空宇宙 更新时间:2023-11-04 10:33:14 24 4
gpt4 key购买 nike

我从文档 (example) 中的各种 wxWidgets 类引用中了解到,用于构建 GUI 的 wxWidgets 基本上继承自 wxWindow。我从the source of wxWidgets/window.cpp的评论中看到每个 wxWindow 都有一个指向某个 GtkWidget 的指针,它存储在 wxWidget 对象的 m_widget 成员中。从相同的源代码注释中,我还看到 m_wxwindowwxWindow 类的成员,并且可能包含指向 wxPizza 对象的指针wxWindow 的情况,它有一个用于绘图和子项的客户区。

我正在开发一个需要这种功能的应用程序。我正在扩展一个 wxWidgets 类来创建我自己的小部件,它需要包含一个可绘制的 X11 窗口,但我不确定如何将它们全部连接起来,而且我在使用文档找到解决方案时遇到了麻烦。

当我创建自定义小部件时(在 Create 方法中),我可以看到 m_widgetm_wxwindow 都是 NULL,所以从这个和我上面提到的,我收集到这些是我应该创建以形成我的客户区的 GtkWidget 对象。首先,我尝试了这个:

m_widget = gtk_window_new(GTK_WINDOW_TOPLEVEL);

哪种效果好,但不是我想要的效果。我能够从 GtkWidget 获取 XID,并且 X11 窗口的行为符合预期。但这会在我的主 wxWidgets 应用程序窗口之外创建一个新窗口。我想要的是这个确切的功能,除了嵌入在我的主 wxWidgets 应用程序窗口中。我的自定义类已添加到 wxBoxSizer 中,如下所示:

sizer->Add(my_widget, 1, wxEXPAND | wxALL, 0);

其中 sizer 是一个 wxBoxSizermy_widget 是我的自定义小部件。

然后我尝试创建 m_widget 作为几种不同类型的 GtkWidget 但这些都导致在尝试使用 gtk_widget_realize 时出现运行时错误并尝试获取 XID

// These don't work
m_widget = gtk_drawing_area_new();
m_widget = gtk_vbox_new(false, 0);

这些是我在尝试上述操作时收到的错误消息:

Gtk: IA__gtk_widget_realize: assertion 'GTK_WIDGET_ANCHORED (widget) || GTK_IS_INVISIBLE (widget)' failed
Gdk: gdkdrawable-x11.c:952 drawable is not a pixmap or window
Check failed: xwindow.

所以我这是一个多部分问题:

  • 什么是合适的 GtkWidget 类型来实现这一点?我需要能够获取可绘制的 X11 窗口 ID (XID) 并将其嵌入到父窗口小部件 (wxBoxSizer) 中。
  • 我需要同时使用 m_widgetm_wxwindow 吗?我该如何设置这些?
  • 除了调用 sizer->Add() 之外,我是否需要做任何事情才能将它与我的 wxBoxSizer 连接起来?

谢谢!

更新:抱歉我忘了说,这是针对 GTK2 的。感谢@andlabs 指出这一点。

更新 2: @VZ。建议我澄清我想做什么。

我正在使用需要访问 X11 窗口的库,但不会创建该窗口本身。当我初始化库时,我需要向它传递一个 X11 窗口句柄 (XID)。然后库将绘制到该窗口中。我想在我的 wxWidgets 应用程序中创建这个窗口。我正在尝试扩展一个 wxWidgets 类,以便我能够将这些 X11 窗口添加到基于我应用程序中的 wxSizer 的小部件。

我知道 gtk_window_new() 不是我要找的,因为它创建了一个新的顶级窗口,而我想要一个嵌入到我的 wxWidgets 应用程序中的窗口。这只是我一路尝试的东西。

最佳答案

了解您到底想做什么真的很有帮助。您谈到了 GtkWidgets,但随后显示了 gtk_window_new() 调用,它创建了一个新的(顶级)窗口,这是完全不同的,只能由 表示wxTopLevelWindow 在 wx 级别。

您需要在 wxWidgets 应用程序中包装现有的 GtkWidget 吗?如果是这样,您应该只使用 wxNativeWindow .即使您不使用它的最新版本,您仍然可以轻松地重用/复制它的代码。

是否需要包装现有的XWindow?那么它就更难了,因为你不能用 wxGTK 轻松地做到这一点。您可以使用 wxX11,但此端口状态不佳,因此它可能不是最好的主意,除非您的需求非常有限。最好的方法可能是先将 X 窗口包装在 GtkWidget 中,然后再按上述步骤进行。


更新后,您似乎只需要一个现有窗口的 XID。这比嵌入 GTK+ 小部件更简单,因为您可以使用 wxWindow::GetHandle() 获取 GtkWidget,然后使用 gtk_widget_get_window() 来获取它的 GdkWindow,最后使用 GDK_WINDOW_XID() 获取 XID。

关于c++ - 如何连接 wxWidgets、GTK2 小部件和 X11 窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38816135/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com