我正在尝试使用 QT SDK 在 QT 中开发一些程序。昨天我读到Unity 启动器 API在官方 ubuntu 网站上。但只有 Vala 和 python 的示例。可以使用 C++ 语言使用 Unity Launcher API(快速列表、计数器和进度条),如果可以的话,请发布一个示例。
答案1
我也在学习 Qt,并试图找到一种在 Qt 中使用 Unity API 的方法,我只能使用 Dbus API,但没有使用 Quicklist,因为它需要一个 DbusMenu,而我不知道如何实现它(仍在学习:))。
这是我为自己创建的示例,希望对其他人有用。也许 Unity 开发人员可以帮助纠正/修复/添加新代码(快速列表) :)
/*
Unity Launcher Dbus API exmable for Qt
foxoman [gplus.to/foxoman][[email protected]]
https://wiki.ubuntu.com/Unity/LauncherAPI#Low_level_DBus_API:_com.canonical.Unity.LauncherEntry
First step : add this line to your Qt project file .pro
QT += dbus
*/
/* I will run this example as Qt console apps */
#include <QtCore/QCoreApplication>
/* Include Qt Dbus required */
#include <QtDBus>
// Qt Main Method
int main(int argc, char *argv[])
{
/* Qt console Main Loop [ in GUI application the Main loop is QApplication ]
Unity API need Main Loop to run */
QCoreApplication a(argc, argv);
/* Create Qt Dbus Signal to send Dbus Message to unity Dbus API
signal com.canonical.Unity.LauncherEntry.Update (in s app_uri, in a{sv} properties)
*/
QDBusMessage signal = QDBusMessage::createSignal(
"/", /* Path */
"com.canonical.Unity.LauncherEntry", /* Unity DBus Interface */
"Update"); /* Update Signal */
/* app_uri
Desktop ID ex: firefox -> need to be pined in the launcher to see the effect
*/
signal << "application://firefox.desktop";
/* properties : A map of strings to variants with the properties to set on the launcher icon */
QVariantMap setProperty;
/* A number to display on the launcher icon */
setProperty.insert("count", qint64(80));
/* show count */
setProperty.insert("count-visible", true);
/* progress bar count must be float between 0 and 1 (mean from 0.00 to 0.100)*/
setProperty.insert("progress", double(0.80));
/* show progress bar */
setProperty.insert("progress-visible", true);
/* Tells the launcher to get the users attention */
setProperty.insert("urgent",true);
/* Pack the properties Map to the signal */
signal << setProperty;
/* Send the signal */
QDBusConnection::sessionBus().send(signal);
return a.exec();
}
答案2
目前没有专门用于从 Qt C++ 访问启动器功能的库。有一个 libunity 库,但它主要面向 glib,因此相对不适合 Qt。正如另一个答案中提到的,与启动器集成的最便捷方法是使用低级 dbus API。
如何与启动器集成的基本概念是向启动器发送一个带有应用程序 ID 和一组属性的信号。应用程序 ID 是 .desktop 文件的文件名,通常存储在/usr/share/applications
:
//create the signal
QDBusMessage signal = QDBusMessage::createSignal("/",
"com.canonical.Unity.LauncherEntry", "Update");
//set the application ID
signal << "application://firefox.desktop";
//set the properties
QVariantMap properties;
...
signal << properties;
//send the signal
QDBusConnection::sessionBus().send(signal);
柜台
要设置计数器,您需要设置属性以使计数可见,并赋予其所需的整数值:
qint64 counter_value = 1;
properties["count-visible"] = true; //set the count to visible
properties["count"] = counter_value; //set the counter value
进度条
要设置进度条,您需要设置属性以使进度可见,并赋予其所需的双精度值:
double progress_value = 0.5;
properties["progress-visible"] = true; //set the progress bar to visible
properties["progress"] = progress_value; //set the progress value
快速列表
可以使用 dbusmenu Qt 库来设置快速列表。您需要包含头文件:
#include <dbusmenuexporter.h>
快速列表在 Qt 中创建为QMenu
菜单。此菜单使用对象通过 dbusmenu“导出” DBusMenuExporter
。导出时,您为该对象指定一个唯一路径,然后引用该路径来告诉启动器项将哪个菜单显示为快速列表。
在主窗口类声明中,添加以下实例变量:
QMenu *quicklist;
DBusMenuExporter *quicklist_exporter;
然后,在构造函数中:
quicklist = new QMenu(this);
//exports the menu over dbus using the object: /com/me/myapp/quicklist
quicklist_exporter = new DBusMenuExporter("/com/me/myapp/quicklist", quicklist);
要向菜单添加项目,请使用菜单的 [addAction](http://qt-project.org/doc/qt-5.0/qtwidgets/qmenu.html#addAction) 方法添加 [QAction](http://qt-project.org/doc/qt-5.0/qtwidgets/qaction.html) 对象。
要设置启动器图标的快速列表,请设置信号的“quicklist”属性:
properties["quicklist"] = "/com/me/myapp/quicklist";
配置项目文件
您需要配置 .pro 文件以添加 dbus 支持:QT += dbus
。为了使用 quicklist 支持进行构建,您需要libdbusmenu*dev
安装 dbusmenu-qt 开发库 ()。然后,您可以将以下内容添加到项目文件以包含 dbusmenu 库:
#import the dbusmenu-qt library for quicklists
greaterThan(QT_MAJOR_VERSION, 4) {
INCLUDEPATH += /usr/include/dbusmenu-qt5/
LIBS += -ldbusmenu-qt5
} else {
INCLUDEPATH += /usr/include/dbusmenu-qt/
LIBS += -ldbusmenu-qt
}
示例应用程序
要查看使用 Qt 的所有启动器功能的完整示例,请查看此Github 项目。