如何在C++程序中创建KDE托盘通知?

6
我有一个使用Qt的C++程序,我想创建一个带有进度条的托盘通知。我认为Qt可以显示文本通知,但不能显示进度条 - 这是KDE特有的。我找不到任何在C++中管理KDE托盘通知的示例。有什么建议吗?
附:这就是我的意思:enter image description here

你想要类似于带有进度条的工具提示吗? - Nejat
@Nejat:好的。给我一点时间,我会添加一个本地 KDE 应用程序的截图。 - Violet Giraffe
也许这就是我需要的。不确定。看起来使用起来相当困难:http://api.kde.org/4.0-api/kdelibs-apidocs/kdeui/html/classKNotification.html#_details - Violet Giraffe
3个回答

5
我也曾经想过同样的问题,并花了一些时间进行调查。以下是结果:
介绍
进度条是 KDE 的一个特殊功能,与 libnotify 没有任何关联。它由一个名为 kuiserver 的组件提供,旨在显示文件传输的进度,但也可以用于其他事情。
两种方法
KJob
第一种方法是使用 KDE API 中的 KUiServerJobTrackerKJob 来与 kuiserver 通信。我自己没有尝试过,但我猜你应该继承 KJob,并将你的子类的实例传递给 KUiServerJobTracker。
dbus
您也可以直接通过dbus与kuiserver交流,这就是我尝试的方法。我使用qdbusviewer探索了kuiserver提供的API。我想展示与命令行工具qdbus的交互示例,但我无法让它正常工作。如果您打算这样做,可能应该使用QDBus库。

对我们有趣的是org.kde.kuiserver服务中的/JobViewServer路径。我们要调用的方法是org.kde.JobViewServer.requestView,它为此作业创建一个新的dbus路径,并返回它。例如,我只是使用虚拟参数调用了requestView,并得到了ObjectPath: /JobViewServer/JobView_29的返回值。同时,在托盘中开始旋转进度指示器:

现在,我可以使用该路径的内容。在这里,qdbus可用,所以以下是方法列表:

$ qdbus org.kde.kuiserver /JobViewServer/JobView_29
signal void org.kde.JobViewV2.cancelRequested()
method Q_NOREPLY void org.kde.JobViewV2.clearDescriptionField(uint number)
signal void org.kde.JobViewV2.resumeRequested()
method bool org.kde.JobViewV2.setDescriptionField(uint number, QString name, QString value)
method Q_NOREPLY void org.kde.JobViewV2.setDestUrl(QDBusVariant destUrl)
method Q_NOREPLY void org.kde.JobViewV2.setInfoMessage(QString message)
method Q_NOREPLY void org.kde.JobViewV2.setPercent(uint percent)
method Q_NOREPLY void org.kde.JobViewV2.setProcessedAmount(qulonglong amount, QString unit)
method Q_NOREPLY void org.kde.JobViewV2.setSpeed(qulonglong bytesPerSecond)
method Q_NOREPLY void org.kde.JobViewV2.setSuspended(bool suspended)
method Q_NOREPLY void org.kde.JobViewV2.setTotalAmount(qulonglong amount, QString unit)
signal void org.kde.JobViewV2.suspendRequested()
method Q_NOREPLY void org.kde.JobViewV2.terminate(QString errorMessage)
method QDBusVariant org.freedesktop.DBus.Properties.Get(QString interface_name, QString property_name)
method QVariantMap org.freedesktop.DBus.Properties.GetAll(QString interface_name)
method void org.freedesktop.DBus.Properties.Set(QString interface_name, QString property_name, QDBusVariant value)
method QString org.freedesktop.DBus.Introspectable.Introspect()
method QString org.freedesktop.DBus.Peer.GetMachineId()
method void org.freedesktop.DBus.Peer.Ping()

我会让你猜测和尝试找出它们的作用,但是这里有一个小例子:

# Give it a name, in case we open the tooltip
qdbus org.kde.kuiserver /JobViewServer/JobView_29 setInfoMessage "Example progress"
# Update the progress
qdbus org.kde.kuiserver /JobViewServer/JobView_29 setPercent 50
# End it
qdbus org.kde.kuiserver /JobViewServer/JobView_29 terminate "Some error message"

结论

你应该有足够的知识来在kde系统托盘中创建一个进度条。我希望这对你有所帮助。无论如何,我很高兴能找到这个方法(包括深入研究一些kde应用程序代码来了解进度通知是如何完成的),我可能会写一些使用这个方法的东西。


2
我发现qdbus无法用于创建作业,因为如果创建它的DBus客户端退出(这正是qdbus所做的),则该作业将自动删除。现在我正在使用qtruby基本上编写相同的脚本,但同时保持连接打开。 - sylvain.joyeux

2
您可以使用 QxtToolTip,它是Qxt中的一个类。它使您能够将任何任意小部件显示为工具提示。因此,我认为您可以创建自定义小部件,并使用QxtToolTip在正确位置显示它。您可以使用此静态函数:
void QxtToolTip::show ( const QPoint & pos, QWidget * tooltip, QWidget * parent = 0, const QRect & rect = QRect() )   [static]

它可以像这样:
#include <QxtToolTip>

MyCustomWidget widget;
QPoint myPosition(x,y);
QxtToolTip::show ( &myPosition, &widget, parent);

有趣的是,我不知道这个库。但是我想要看起来更本地化,所以我需要在Linux上使用一些KDE和Gnome设施。 - Violet Giraffe

1

如果想要在系统托盘中使用,您需要使用KStatusNotifierItem;如果想要进行通知,则需要查看KNotifications框架。


找不到如何创建/显示进度条。有什么提示吗? - Violet Giraffe
哎呀,一旦我链接到“kdeui”,我的应用程序就在启动时崩溃了。 - Violet Giraffe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接