首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GTK DBus等价于QDBusConnection

GTK DBus等价于QDBusConnection
EN

Stack Overflow用户
提问于 2022-03-28 20:50:23
回答 1查看 96关注 0票数 0

我正在使用GTK 4和Rust,我正在寻找相当于QDBusConnection的东西。具体来说,我想连接到org.freedesktop.UDisks2,当一个驱动器被添加或删除时有一个信号触发。在Qt中,我可以做以下工作:

代码语言:javascript
复制
QDBusConnection::systemBus().connect("org.freedesktop.UDisks2", "/org/freedesktop/UDisks2", "org.freedesktop.DBus.ObjectManager", "InterfacesAdded", this, SLOT(my_func(QDBusObjectPath,InterfacesAndProperties)));

如何使用GTK完成这一任务?任何语言都很好,因为我可以使它适应锈蚀(Gtk-rs)。

EN

回答 1

Stack Overflow用户

发布于 2022-03-29 08:22:50

这个最小的示例程序应该在调试输出中获得信号:

代码语言:javascript
复制
use gio::prelude::*;

fn main() {
    let dbus = gio::bus_get_sync(gio::BusType::System, gio::Cancellable::NONE).unwrap();
    let udisks2 = gio::DBusProxy::new_sync(
        &dbus,
        gio::DBusProxyFlags::NONE,
        None,
        Some("org.freedesktop.UDisks2"),
        "/org/freedesktop/UDisks2",
        "org.freedesktop.DBus.ObjectManager",
        gio::Cancellable::NONE
    ).unwrap();
    udisks2.connect("g-signal", true, |x| {
        dbg!(x);
        let signal_name: &str = x[2].get().unwrap();
        println!("signal '{signal_name}'");
        let args: glib::Variant = x[3].get().unwrap();
        let n = args.n_children();
        for i in 0..n {
            let v = args.child_value(i);
            println!("    {i}: {v}");
        }
        None
    });

    glib::MainLoop::new(None, false).run();
}

关于gio::DBusProxy的有趣之处在于,所有的dbus信号都是通过同一个g-signal glib信号来通知的。

在这个信号中,args参数是一个带有4个参数的&[glib::Value]

  1. DBusProxy值本身。
  2. 字符串具有对等总线名称,
  3. 字符串具有信号名。
  4. A元组变量具有信号参数。H 214G 215
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71653605

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档