#gtk #macro #macro-derive

gtk_widget_macro

派生宏帮助您处理 Gtk 小部件

2 个版本

0.1.1 2023 年 4 月 21 日
0.1.0 2023 年 4 月 21 日

#1639 in Rust 模式

每月 21 次下载

MIT 许可证

5KB

gtk_widget_macro

Latest version Documentation MIT

派生宏帮助您处理 Gtk 小部件。

工作原理

gtk_widget_macro 导出名为 GtkWidget 的派生宏。

GtkWidget 被添加到一个结构体中时,它为该结构体定义了一个 Struct::from_builder(&gtk::Builder) -> Struct 函数。

当调用此函数时,它收集结构体的所有字段,并使用每个字段的名称作为参数传递给 gtk::Builder.object(glib::gstring::IntoGStr)。检索到的对象将被分配给相应的字段。如果未找到具有给定名称的对象,则进程会崩溃。此外,还会向结构体中添加一个与字段名称完全相同的新方法。该方法将返回该对象的引用。

此宏不受 Gtk 版本的限制。您可以使用任何您喜欢的 Gtk 版本。如果有某些版本无法正常工作,请报告一个错误。

示例

use gtk::{prelude::*, Application, ApplicationWindow, Builder, Button};
// Imports the macro.
use gtk_widget_macro::GtkWidget;

// Adds the macro to the struct.
#[derive(GtkWidget)]
struct Widgets {
    button_example: Button,
    window: ApplicationWindow,
}

fn build_ui(app: &Application) {
    let builder = Builder::from_string(include_str!("main.ui"));

    // Calls `from_builder` to construct the struct.
    let widgets = Widgets::from_builder(builder);

    // Retrieves the gtk::Button with object id `button_example`.
    let button_example = widgets.button_example();
    button_example.connect_clicked(|_| {
        println!("Button clicked.");
    });

    // Retrieves the gtk::ApplicationWindow with object id `window`.
    let window = widgets.window();
    window.set_application(Some(app));
    window.present(); // Needs to be changed to `show_all` if Gtk3 is used.
}

fn main() {
    let app = Application::builder().application_id("org.example.Example").build();

    app.connect_activate(build_ui);

    app.run();
}

依赖关系

~285–740KB
~18K SLoC