gpt4 book ai didi

c++ - QT DBUS挂载文件系统

转载 作者:太空狗 更新时间:2023-10-29 20:44:42 25 4
gpt4 key购买 nike

我想使用 QT 和 DBUS 挂载一个文件系统。我使用这个小片段订阅了信号“DeviceAdded”:

 void DBusWatcher::deviceAdded(const QDBusObjectPath &o) {
QDBusMessage call = QDBusMessage::createMethodCall("org.freedesktop.UDisks", o.path(), "org.freedesktop.DBus.Properties", "GetAll");

QList<QVariant> args;
args.append("org.freedesktop.UDisks.Device");
call.setArguments(args);

QDBusPendingReply<QVariantMap> reply = DBusConnection::systemBus().asyncCall(call);
reply.waitForFinished();

QVariantMap map = reply.value();

// ...
}

效果很好。我的问题是,我该如何安装这个东西?我所拥有的只是这样的东西——它根本不起作用——而且没有错误。

QDBusMessage call = QDBusMessage::createMethodCall("org.freedesktop.UDisks", "dont know what to put here!", "org.freedesktop.UDisks.Device", "FilesystemMount");

现在,我应该对 QDBusConnection::systemBus() 使用什么操作:call、asyncCall、callWithCallback?必须将什么作为第二个参数放入 createMethodCall?什么都不管用!真令人沮丧!

最佳答案

OK,折腾了至少2天终于搞定了!我研究了 razer-qt 源代码,我研究了 kdelibs 源代码,但不知何故,他们所有的 dbus 东西都不起作用。所以这是我非常满意的片段:

void DBusWatcher::deviceAdded(const QDBusObjectPath &o) {
QDBusMessage call = QDBusMessage::createMethodCall("org.freedesktop.UDisks", o.path(), "org.freedesktop.DBus.Properties", "GetAll");

QList<QVariant> args;
args.append("org.freedesktop.UDisks.Device");
call.setArguments(args);

QDBusPendingReply<QVariantMap> reply = QDBusConnection::systemBus().asyncCall(call);
reply.waitForFinished();

QVariantMap map = reply.value();
// now do what you want with the map ;)
// You will find all available information to the device attached
}

// a class wide pointer to the systembus
// initialized within the constructor of the class
// and deleted in the destructor
dbus = new QDBusInterface(
"org.freedesktop.UDisks",
"here comes the path from the QDBusObjectPath.path() object",
"org.freedesktop.UDisks.Device",
QDBusConnection::systemBus(),
this
);

void DbusAction::mountFilesystem() {
if(dbus->isValid()) {

QList<QVariant> args;
args << QVariant(QString()) << QVariant(QStringList());

QDBusMessage msg = dbus->callWithArgumentList(QDBus::AutoDetect, "FilesystemMount", args);
if(msg.type() == QDBusMessage::ReplyMessage) {
QString path = msg.arguments().at(0).toString();
if(!path.isEmpty()) {
emit deviceMounted(path);
} else {
qDebug() << "sorry, but the path returned is empty";
}
} else {
qDebug() << msg.errorMessage();
}
}
}

我正在使用 Openbox 和最新的 Udisk(2) 在 x64-ArchLinux 上运行。也许有人也可以使用它。

关于c++ - QT DBUS挂载文件系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12448736/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com