2

我想使用一个注册到处理 SimpleAction 的小部件的 SimpleActionGroup。但无论如何,以我的自定义前缀为目标的每个按钮都是灰色的,无法点击。但是,针对操作前缀“app”和“win”的按钮按预期工作。

带有两个按钮的应用程序

这是我的代码中定义我的自定义前缀的部分。

// Create action group for view
let view_action_group = gio::SimpleActionGroup::new();
view.insert_action_group("view", &view_action_group);

// SimpleAction for view
let view_action = gio::SimpleAction::new("test", None);
view_action.connect_activate(|_, _| println!("view.test"));
view_action_group.add_action(&view_action);

在这里,我用前缀“app”响应 SimpleActions

// SimpleAction for app
let app_action = gio::SimpleAction::new("test", None);
app_action.connect_activate(|_, _| println!("app.test"));
app.add_action(&app_action);

SimpleAction 本身应该没问题,因为如果我使用 GTK Inspector 启动应用程序,我可以激活它。

GTK Inspector 调用动作

那么我错过了什么,第二个按钮没有变灰并响应我的 SimpleAction?

这是完整的代码:

extern crate gtk;
extern crate gio;

use std::env::args;
use gtk::{GtkApplicationExt, GtkWindowExt, ContainerExt, WidgetExt, HeaderBarExt, ActionableExt};
use gio::{SimpleActionExt, ActionMapExt, ApplicationExt, ApplicationExtManual};

struct Window {
    pub window: gtk::Window,
}

impl Window {
    pub fn new() -> Self {
        // Create Widgets and window
        let header_bar = gtk::HeaderBar::new();
        let window = gtk::Window::new(gtk::WindowType::Toplevel);
        let view = gtk::Box::new(gtk::Orientation::Horizontal, 5);
        let app_button = gtk::Button::new_with_label("App-Action-Button");
        let view_button = gtk::Button::new_with_label("View-Action-Button");

        // Create Action Group for view
        let view_action_group = gio::SimpleActionGroup::new();
        view.insert_action_group("view", &view_action_group);

        // SimpleAction for view
        let view_action = gio::SimpleAction::new("test", None);
        view_action.connect_activate(|_, _| println!("view.test"));
        view_action_group.add_action(&view_action);

        // Set Action for Buttons
        app_button.set_action_name("app.test");
        view_button.set_action_name("view.test");

        // Configure HeaderBar and add Buttons to it
        header_bar.set_show_close_button(true);
        header_bar.pack_start(&app_button);
        header_bar.pack_start(&view_button);

        // Window Stuff
        window.set_titlebar(&header_bar);
        window.add(&view);
        window.show_all();

        Self { window }
    }
}

struct App {
    app: gtk::Application
}

impl App {
    pub fn new () -> Self {

        // Create app and window
        let app = gtk::Application::new(Some("com.example.test"), gio::ApplicationFlags::FLAGS_NONE).unwrap();
        let window = Window::new();

        // SimpleAction for app
        let app_action = gio::SimpleAction::new("test", None);
        app_action.connect_activate(|_, _| println!("app.test"));
        app.add_action(&app_action);

        // add Signal
        let cloned_window = window.window.clone();
        app.connect_activate(move |app| app.add_window(&cloned_window));

        Self { app }
    }

    pub fn run(&self, args: &[String]) {
        self.app.run(args);
    }

}


fn main() {
    let app = App::new();
    app.run(&args().collect::<Vec<_>>());
}
4

0 回答 0