c++ - 在 Gtkmm 中打开多个不同的窗口
问题描述
我才刚刚开始学习如何使用 gtkmm,我正在尝试创建一个可以同时打开多个窗口的应用程序(想想,主窗口和控制面板)。
我决定在 Glade 中创建布局,如果这与这个问题有任何关系的话。
我展示两个瓶子的方法或多或少是这样的:
Gtk::Window* main_window = nullptr;
Gtk::Window* servsettings = nullptr;
int main(int argc, char* argv[]) {
auto app = ...
auto builder = ... // these are exluded for brevity
builder->add_from_file("../src/design.glade");
builder->get_widget("main", main_window);
builder->get_widget("servsettings", servsettings);
app->run(*servsettings);
app->run(*main_window);
}
而不是打开两个窗口,而是打开servsettings
,然后在我关闭它时出现段错误。
现在忘记了段错误(我对此感到非常困惑,)我想我可以明白它为什么只打开servsettings
- 我认为这是因为我正在运行应用程序,然后该调用仅在窗口消失时退出?
问题是,我想不出任何其他方法来做到这一点。我尝试了多线程,但决定最好先在这里询问。
在有人建议之前,这个答案对我没有帮助。这是因为他们有一个基于范围的问题。我不。
解决方案
使用Gtk::Application::add_window(Gtk::Window&)。
如果由 Gtk::Application 管理的所有窗口都关闭(隐藏)或从应用程序中删除,则对 run() 的调用将返回。
#include <gtkmm.h>
Gtk::Window* window1, *window2;
int main()
{
auto app = Gtk::Application::create();
Gtk::Button button1("Quit"), button2("Quit");
window1 = new Gtk::Window();
window2 = new Gtk::Window();
button1.signal_clicked().connect(sigc::mem_fun(window1, &Gtk::Window::close));
button2.signal_clicked().connect(sigc::mem_fun(window2, &Gtk::Window::close));
window1->set_default_size(200, 200);
window1->add(button1);
window1->show_all();
window2->set_default_size(200, 200);
window2->add(button2);
window2->show_all();
app->signal_startup().connect([&]{
app->add_window(*window2);
});
return app->run(*window1);
}
推荐阅读
- python - 在输入 CNN 之前将图像标准化为浮点 0~1、浮点 -1~1 和整数 0~255 有什么区别?
- php - 为什么 pcntl_fork() 没有在 Laravel 控制器中定义?
- sql - 从每个唯一的 Skill_id 中找到一个随机 Set_id
- python-3.x - ValueError:形状(5,14)和(16,)未对齐:14(dim 1)!= 16(dim 0)
- xcode - OSX - Unidentified Developer 和捆绑格式不明确(可能是应用程序或框架)
- java - Android/MySQL:如何根据 MySQL 的值检查单选按钮
- node.js - 当令牌过期时,是否可以将用户重定向回自定义授权器 api-gateway auth0 登录?
- opencart - 打开购物车网站服务器响应时间大
- scala - 在某些数据集上进行映射操作期间收集 HashSet 的有效方法
- c# - 依赖环境的命名空间