使用 PowerManager 的 QtDBus 简单示例
QtDBus Simply Example With PowerManager
我正在尝试使用 QtDbus 与我系统中 PowerManager
提供的接口进行通信。我的目标很简单。我将编写代码,使用 DBus 接口使我的系统休眠。
因此,我安装了 d-feet 应用程序以查看我的系统上有哪些 interfaces DBus 可用,以及我所看到的:
如我们所见,我有几个接口和方法可供选择。我的选择是Hibernate(),来自接口org.freedesktop.PowerManagment
为了这个目标,我准备了一些非常简单的代码来理解机制。我当然使用了 Qt 库:
#include <QtCore/QCoreApplication>
#include <QtCore/QDebug>
#include <QtCore/QStringList>
#include <QtDBus/QtDBus>
#include <QDBusInterface>
int main(int argc, char **argv)
{
QCoreApplication app(argc, argv);
if (!QDBusConnection::sessionBus().isConnected()) {
fprintf(stderr, "Cannot connect to the D-Bus session bus.\n"
"To start it, run:\n"
"\teval `dbus-launch --auto-syntax`\n");
return 1;
}
QDBusInterface iface("org.freedesktop.PowerManagement" ,"/" , "" , QDBusConnection::sessionBus());
if(iface.isValid())
{
qDebug() << "Is good";
QDBusReply<QString> reply = iface.call("Methods" , "Hibernate");
if(reply.isValid())
{
qDebug() << "Hibernate by by " << qPrintable(reply.value());
}
qDebug() << "some error " << qPrintable(reply.error().message());
}
return 0;
}
不幸的是,我的终端出现错误:
Is good
some error Method "Methods" with signature "s" on interface "(null)" doesn't exist
请告诉我这段代码有什么问题?我确定我忘记了函数 QDBusInterface::call() 中的一些参数,但是什么?
创建接口时必须指定正确的 interface, path, service
。所以这就是为什么你的 iface
对象应该像这样创建:
QDBusInterface iface("org.freedesktop.PowerManagement", // from list on left
"/org/freedesktop/PowerManagement", // from first line of screenshot
"org.freedesktop.PowerManagement", // from above Methods
QDBusConnection::sessionBus());
此外,调用方法时需要使用它的名称和参数(如果有的话):
iface.call("Hibernate");
而Hibernate()
没有输出参数,所以你必须使用QDBusReply<void>
而且你不能检查.value()
QDBusReply<void> reply = iface.call("Hibernate");
if(reply.isValid())
{
// reply.value() is not valid here
}
我正在尝试使用 QtDbus 与我系统中 PowerManager
提供的接口进行通信。我的目标很简单。我将编写代码,使用 DBus 接口使我的系统休眠。
因此,我安装了 d-feet 应用程序以查看我的系统上有哪些 interfaces DBus 可用,以及我所看到的:
如我们所见,我有几个接口和方法可供选择。我的选择是Hibernate(),来自接口org.freedesktop.PowerManagment
为了这个目标,我准备了一些非常简单的代码来理解机制。我当然使用了 Qt 库:
#include <QtCore/QCoreApplication>
#include <QtCore/QDebug>
#include <QtCore/QStringList>
#include <QtDBus/QtDBus>
#include <QDBusInterface>
int main(int argc, char **argv)
{
QCoreApplication app(argc, argv);
if (!QDBusConnection::sessionBus().isConnected()) {
fprintf(stderr, "Cannot connect to the D-Bus session bus.\n"
"To start it, run:\n"
"\teval `dbus-launch --auto-syntax`\n");
return 1;
}
QDBusInterface iface("org.freedesktop.PowerManagement" ,"/" , "" , QDBusConnection::sessionBus());
if(iface.isValid())
{
qDebug() << "Is good";
QDBusReply<QString> reply = iface.call("Methods" , "Hibernate");
if(reply.isValid())
{
qDebug() << "Hibernate by by " << qPrintable(reply.value());
}
qDebug() << "some error " << qPrintable(reply.error().message());
}
return 0;
}
不幸的是,我的终端出现错误:
Is good
some error Method "Methods" with signature "s" on interface "(null)" doesn't exist
请告诉我这段代码有什么问题?我确定我忘记了函数 QDBusInterface::call() 中的一些参数,但是什么?
创建接口时必须指定正确的 interface, path, service
。所以这就是为什么你的 iface
对象应该像这样创建:
QDBusInterface iface("org.freedesktop.PowerManagement", // from list on left
"/org/freedesktop/PowerManagement", // from first line of screenshot
"org.freedesktop.PowerManagement", // from above Methods
QDBusConnection::sessionBus());
此外,调用方法时需要使用它的名称和参数(如果有的话):
iface.call("Hibernate");
而Hibernate()
没有输出参数,所以你必须使用QDBusReply<void>
而且你不能检查.value()
QDBusReply<void> reply = iface.call("Hibernate");
if(reply.isValid())
{
// reply.value() is not valid here
}