gtkmm xml ui 例子(from string)

文章目录

前言

  • glade生成的xml格式不被gtkmm4支持, 需要作修改

来看一个从字符串中生成UI的例子

cpp 复制代码
#include <gtkmm/application.h>
#include <gtkmm.h>
#include <iostream>
using namespace std;

class ExampleWindow : public Gtk::Window
{
public:
    ExampleWindow();
    virtual ~ExampleWindow() {};
    void on_action_file_new()
    {
        cout << "New" << endl;
    };
    void on_action_file_open() {};
    void on_action_file_quit() {};

    Gtk::Box m_Box;
};
ExampleWindow::ExampleWindow()
{
    auto m_refBuilder = Gtk::Builder::create();

    Glib::ustring ui_info =
        "<interface>"
        "  <menu id='menubar'>"
        "    <submenu>"
        "      <attribute name='label' translatable='yes'>_File</attribute>"
        "      <section>"
        "        <item>"
        "          <attribute name='label' translatable='yes'>_New</attribute>"
        "          <attribute name='action'>example.new</attribute>"
        "        </item>"
        "      </section>"
        "      <section>"
        "        <item>"
        "          <attribute name='label' translatable='yes'>_Quit</attribute>"
        "          <attribute name='action'>example.quit</attribute>"
        "        </item>"
        "      </section>"
        "    </submenu>"
        "    <submenu>"
        "      <attribute name='label' translatable='yes'>_Edit</attribute>"
        "      <item>"
        "        <attribute name='label' translatable='yes'>_Copy</attribute>"
        "        <attribute name='action'>example.copy</attribute>"
        "      </item>"
        "      <item>"
        "        <attribute name='label' translatable='yes'>_Paste</attribute>"
        "        <attribute name='action'>example.paste</attribute>"
        "      </item>"
        "    </submenu>"
        "  </menu>"
        "</interface>";
    //绑定行动的对应动作 实际绑定
    auto m_refActionGroup = Gio::SimpleActionGroup::create();
    m_refActionGroup->add_action("new", sigc::mem_fun(*this, &ExampleWindow::on_action_file_new));
    m_refActionGroup->add_action("open", sigc::mem_fun(*this, &ExampleWindow::on_action_file_open));
    m_refActionGroup->add_action("quit", sigc::mem_fun(*this, &ExampleWindow::on_action_file_quit));
    insert_action_group("example", m_refActionGroup);//行动组example 实体诞生

    m_refBuilder->add_from_string(ui_info);
    //m_refBuilder->add_from_file("K:\\CPlusPlus\\cgcc\\Xml_UI.xml");

    auto gmenu = m_refBuilder->get_object<Gio::Menu>("menubar");
    auto pMenuBar = Gtk::make_managed<Gtk::PopoverMenuBar>(gmenu);
    m_Box.append(*pMenuBar);
    set_child(m_Box);

    pMenuBar->set_visible(true);
    m_Box.set_visible(true);
}
int main(int argc, char* argv[])
{
    auto app = Gtk::Application::create("org.gtkmm.example");
    //app快捷键 键位设置对应行动 预先设置
    app->set_accel_for_action("example.new", "<Primary>n");//表示Ctrl+N
    app->set_accel_for_action("example.quit", "<Primary>q");//表示Ctrl+Q
    app->set_accel_for_action("example.copy", "<Primary>c");//表示Ctrl+C
    app->set_accel_for_action("example.paste", "<Primary>v");//表示Ctrl+V
    //Shows the window and returns when it is closed.
    return app->make_window_and_run<ExampleWindow>(argc, argv);
}

可以把那些字符串放入一个xml文件

然后
m_refBuilder->add_from_file("K:\CPlusPlus\cgcc\Xml_UI.xml");
代替上面的add_from_string.

相关推荐
传奇开心果编程14 小时前
【SwiftUI娓娓道来】第3课:让界面活起来——交互与动画指南
学习·macos·ui·ios·swiftui·swift
zhchyun200815 小时前
【Unity UI 进阶】仿 Element UI 打造企业级 Unity UI 组件库(10)
ui·unity·游戏引擎
传奇开心果编程15 小时前
【Jetpack Compose进阶学与练】第14课:系列收尾复习总结;Compose项目常见坑点汇总;学习路线与后续学习方向
android·学习·ui·kotlin·android jetpack
kiros_wang18 小时前
渐变/阴影/滤镜⾼阶⽤法:统⼀项⽬UI、精简冗余组件
ui·harmonyos
沫璃染墨1 天前
《Qt从零入门系列(十一):Qt事件机制详解——从QEvent到鼠标、键盘与定时器事件》
c++·qt·ui·硬件工程·交互·个人开发·qt5
rhett. li1 天前
用 AI 写 C++ 桌面 UI:TRAE + nim_duilib 实战指南
c++·人工智能·ui
传奇开心果编程1 天前
【Flutter入门练中学】第3课:滚动与列表
android·学习·flutter·ui·ios
兰亭妙微UI设计公司1 天前
兰亭妙微B 端交互设计:横向 & 纵向步骤条完整使用指南
ui
Java后端的Ai之路2 天前
SSE 接口设计 vs Agent UI:四个开源项目,把「模型吐词」和「界面更新」拆开后,我看懂了差距
ui·开源·sse·agui·agentui
传奇开心果编程2 天前
【Flutter入门练中学】第8课:动画与过渡
android·学习·flutter·ui·ios