自己将其进行了简单的封装成一个QtDBusObject类,适用于支持dbus的系统中,构造函数的第一个参数为service名称,必须确保在系统中是唯一的。内容如下,不再详细解释,感兴趣的,请细读: QtDBusObject.hpp - #ifndef CHINUXTEAM_QTDBUS_OBJECT_HPP
#define CHINUXTEAM_QTDBUS_OBJECT_HPP
#include <QtCore> #include <QtGui>
namespace ChinuxTeam { class QtDBusObject : public QObject { Q_OBJECT public: enum Status { NotRunning, RaiseSuccess, RaiseFailure }; QtDBusObject(const QString &service, QObject *parent = 0); ~QtDBusObject(); bool isConnected(); Status isRunningAndRaiseStatus(); bool registerService(); bool registerObject(); void setActivationWindow(QWidget *widget); public slots: void raise(); private: QString _service; QWidget *_activationWindow; }; }
#endif
QtDBusObject.cpp - #include <QtDBus>
#include "QtDBusObject.hpp"
namespace ChinuxTeam { QtDBusObject::QtDBusObject(const QString &service, QObject *parent) : QObject(parent), _service(service), _activationWindow(NULL) { }
QtDBusObject::~QtDBusObject() { }
bool QtDBusObject::isConnected() { return QDBusConnection::sessionBus().isConnected(); }
QtDBusObject::Status QtDBusObject::isRunningAndRaiseStatus() { QDBusInterface iface(_service, "/", "", QDBusConnection::sessionBus()); if (iface.isValid()) { QDBusReply<void> reply = iface.call("raise"); if (reply.isValid()) { return RaiseSuccess; }
qDebug() << "call singleton instance raise failed" << reply.error().message(); return RaiseFailure; } return NotRunning; }
bool QtDBusObject::registerService() { return QDBusConnection::sessionBus().registerService(_service); }
bool QtDBusObject::registerObject() { return QDBusConnection::sessionBus().registerObject("/", this, QDBusConnection::ExportAllSlots); }
void QtDBusObject::setActivationWindow(QWidget *widget) { _activationWindow = widget; }
void QtDBusObject::raise() { if (_activationWindow == NULL) { return; } _activationWindow->setWindowState(_activationWindow->windowState() & ~Qt::WindowMinimized); _activationWindow->raise(); _activationWindow->activateWindow(); } }
使用示例: - #include <QtGui/QApplication>
#include <QtGui/QMainWindow> #include "QtDBusObject.hpp"
int main(int argc, char *argv[]) { QApplication app(argc, argv);
ChinuxTeam::QtDBusObject dbusobj("org.qtcn.sicompass"); if (!dbusobj.isConnected()) { qDebug() << "cannot connect to dbus session bus"; app.quit(); return EXIT_FAILURE; }
switch (dbusobj.isRunningAndRaiseStatus()) { case ChinuxTeam::QtDBusObject::NotRunning: break; case ChinuxTeam::QtDBusObject::RaiseSuccess: app.quit(); return EXIT_SUCCESS; case ChinuxTeam::QtDBusObject::RaiseFailure: app.quit(); return EXIT_FAILURE; }
if (!dbusobj.registerService()) { qDebug() << "register service failed"; app.quit(); return EXIT_FAILURE; }
QMainWindow viewer; dbusobj.setActivationWindow(&viewer); if (!dbusobj.registerObject()) { qDebug() << "register object failed"; app.quit(); return EXIT_FAILURE; } viewer.show(); return app.exec(); }
|