UOS系统下如何对一个打印任务进行监控呢?
首先,UOS系统是支持这个功能。比如说我们打印一个任务后,UOS自带的打印管理器是能知道打印任务的状态的:
经过研究,最终发现了他的监控原理。
还得是DBus
没错,还是得通过DBus来实现打印任务监控。
话不多说,直接上代码:
#define SERVICE_INTERFACE_NAME "com.deepin.print.helper"
#define SERVICE_INTERFACE_PATH "/com/deepin/print/helper"
if (!QDBusConnection::sessionBus().connect(SERVICE_INTERFACE_NAME,
SERVICE_INTERFACE_PATH,
SERVICE_INTERFACE_NAME,
"signalJobStateChanged",
&listener,
SLOT(slJobChanged(QDBusMessage)))) {
qWarning() << "connect to dbus signal(signalJobStateChanged) failed";
}
这一段代码的意思是连接dbus的打印消息与槽函数,成功之后,才能接收系统的消息。
其中的 listener是自己写的一个监控对象,继承自QEventLoop。其槽函数可以这么写:
void Listener::slJobChanged(const QDBusMessage &msg)
{
if (msg.arguments().count() != 3) {
qWarning() << "JobStateChanged dbus arguments error";
}
else{
int TaskId=msg.arguments().at(0).toInt();//打印任务ID
int state=msg.arguments().at(1).toInt();//打印任务状态,4是created,5是started,9是finished
ipp_jstate_e eState = static_cast<ipp_jstate_e>(state) ;
QString strMsg = msg.arguments().at(2).toString();//打印任务消息
}
}
其中 ipp_jstate_e 是一个枚举类型,其头文件在ipp.h。如果没有这个头文件要安装cups的相关依赖。这里就不展开说了。