我正试图以这种方式连接到D-Bus信号:
bool result = QDBusConnection::systemBus().connect(
"foo.bar", // service
"/foo/bar", // path
"foo.bar", // interface
"SignalSomething",
this,
SLOT(SignalSomethingSlot()));
if( !result )
{
// Why!?
}
QDBusConnection::connect()
返回一个布尔值,如何获取扩展错误信息?如果选中QDBusConnection::lastError()
,则不会返回任何有用信息(QDBusError::isValid()
为false
)。
答案 0 :(得分:1)
我遇到了同样的问题,结果发现我连接的插槽具有错误的参数类型。它们必须根据Qt的documentation进行匹配,并且connect()
似乎对此进行了验证,尽管没有明确提及。
警告:仅在参数匹配的情况下,信号才会传递到插槽。
我建议d-feet列出信号并检查其参数类型。 dbus-monitor
也会列出信号,路径等,但并不总是列出确切的参数类型。
一个重要的观察结果:我在特定情况下通过使用与实际信号不同的时隙参数解决了该问题!
我想连接到here提到的com.ubuntu.Upstart0_6
信号,以检测Ubuntu中的屏幕何时被锁定/解锁。 dbusmonitor
打印以下内容,d-feet
显示参数(String, Array of [String])
// dbusmonitor output
signal time=1529077633.579984 sender=:1.0 -> destination=(null destination) serial=809 path=/com/ubuntu/Upstart; interface=com.ubuntu.Upstart0_6; member=EventEmitted
string "desktop-unlock"
array [
]
因此信号应该是类型
void screenLockChangedUbuntu(QString event, QVector<QString> args) // connect() -> false
但这使connect()
返回false
。解决方案是从插槽中删除数组参数:
void screenLockChangedUbuntu(QString event) // works
我知道array参数始终为空,但是我无法解释为什么仅在删除它时才起作用。
答案 1 :(得分:0)
你可以尝试这些技巧:
1)在运行应用程序之前设置 QDBUS_DEBUG 环境变量。
export QDBUS_DEBUG=1
2)启动dbus-monitor以查看总线上发生的情况。您可能需要将全局策略设置为eavesdrop系统总线,具体取决于您的发行版。
<强>更新强>
您确定连接到系统总线成功了吗?如果失败,您应该检查system.conf
政策,并可能在system.d
中创建自己的conf。这post可能会有所帮助。
您可以先使用QDBusConnection::connectToBus连接到系统总线,然后检查QDBusConnection::isConnected是否成功。只有在此之后,您才尝试连接信号并检查是否成功。
QDBusConnection bus = QDBusConnection::connectToBus(QDBusConnection::systemBus, myConnectionName);
if (bus.isConnected())
{
if(!bus.connect( ... ))
{
// Connecting to signal failed
}
}
else
{
// Connecting to system bus failed
}