gpt4 book ai didi

c++ - Gtkmm:稍后添加窗口

转载 作者:行者123 更新时间:2023-11-28 08:03:05 27 4
gpt4 key购买 nike

因为我正在编写一个在面对其他配置时表现完全不同的“通用”应用程序,所以我被迫显示 gtk 窗口,即使我在启动时还不知道它们。可能还需要同时显示多个窗口(不是模态对话框,而是独立窗口)。但是,如果可以在启动时简单地启动一个 gtk 事件循环,那就太好了。

是否有可能在循环启动后将窗口添加到循环中?虽然我发现 Gtk::Application 类似乎完全支持缩进行为,但我只能使用 Gtk::Main 类。

最佳答案

只允许有一个 Gtk::Main 对象。窗口小部件应在运行主事件循环的同一线程中创建。要解决此限制,您需要开发一种方法将窗口创建命令传递给 gtk 线程。

最简单的方法是使用 Glib::Dispatcher

struct WindowBuilder {
/**/
Glib::Dispatcher* signal_create;

void create_window() {
//From main thread...
signal_create->emit();
}
}

void create_mainWnd() {
new Ui::MainWnd();
}

//From Gtk thread...
builder->signal_create->connect(sigc::ptr_fun(create_mainWnd));

Gtk::Main::run();

Glib::Dispatcher 不接受任何参数,所以下一步是弄清楚如何在线程之间传递参数。

对于不同类型的窗口,您可以使用不同的调度器。

boost::asio::io_service 可以帮助您传递消息。

while(!exit) {
io_service.reset();
io_service.poll();
while(Gtk::Main::events_pending())
Gtk::Main::iteration();
Sleep(0);
}

关于c++ - Gtkmm:稍后添加窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10885584/

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