• 8249阅读
  • 2回复

使用QtDBus实现运行一个实例 [复制链接]

上一主题 下一主题
离线XChinux
 

只看楼主 倒序阅读 楼主  发表于: 2011-07-15
— 本帖被 XChinux 从 Qt基础编程 移动到本区(2011-07-15) —
自己将其进行了简单的封装成一个QtDBusObject类,适用于支持dbus的系统中,构造函数的第一个参数为service名称,必须确保在系统中是唯一的。内容如下,不再详细解释,感兴趣的,请细读:
QtDBusObject.hpp
  1. #ifndef CHINUXTEAM_QTDBUS_OBJECT_HPP
  2. #define CHINUXTEAM_QTDBUS_OBJECT_HPP
  3. #include <QtCore>
  4. #include <QtGui>
  5. namespace ChinuxTeam
  6. {
  7. class QtDBusObject : public QObject
  8. {
  9.     Q_OBJECT
  10. public:
  11.     enum Status
  12.     {
  13.         NotRunning,
  14.         RaiseSuccess,
  15.         RaiseFailure
  16.     };
  17.     QtDBusObject(const QString &service, QObject *parent = 0);
  18.     ~QtDBusObject();
  19.     bool isConnected();
  20.     Status isRunningAndRaiseStatus();
  21.     bool registerService();
  22.     bool registerObject();
  23.     void setActivationWindow(QWidget *widget);
  24. public slots:
  25.     void raise();
  26. private:
  27.     QString _service;
  28.     QWidget *_activationWindow;
  29. };
  30. }
  31. #endif


QtDBusObject.cpp
  1. #include <QtDBus>
  2. #include "QtDBusObject.hpp"
  3. namespace ChinuxTeam
  4. {
  5. QtDBusObject::QtDBusObject(const QString &service, QObject *parent)
  6.     : QObject(parent), _service(service), _activationWindow(NULL)
  7. {
  8. }
  9. QtDBusObject::~QtDBusObject()
  10. {
  11. }
  12. bool QtDBusObject::isConnected()
  13. {
  14.     return QDBusConnection::sessionBus().isConnected();
  15. }
  16. QtDBusObject::Status QtDBusObject::isRunningAndRaiseStatus()
  17. {
  18.     QDBusInterface iface(_service, "/", "",
  19.                     QDBusConnection::sessionBus());
  20.     if (iface.isValid())
  21.     {
  22.         QDBusReply<void> reply = iface.call("raise");
  23.         if (reply.isValid())
  24.         {
  25.             return RaiseSuccess;
  26.         }
  27.         qDebug() << "call singleton instance raise failed"
  28.             << reply.error().message();
  29.         return RaiseFailure;
  30.     }
  31.     return NotRunning;
  32. }
  33. bool QtDBusObject::registerService()
  34. {
  35.     return QDBusConnection::sessionBus().registerService(_service);
  36. }
  37. bool QtDBusObject::registerObject()
  38. {
  39.     return QDBusConnection::sessionBus().registerObject("/", this,
  40.                     QDBusConnection::ExportAllSlots);
  41. }
  42. void QtDBusObject::setActivationWindow(QWidget *widget)
  43. {
  44.     _activationWindow = widget;
  45. }
  46. void QtDBusObject::raise()
  47. {
  48.     if (_activationWindow == NULL)
  49.     {
  50.         return;
  51.     }
  52.     _activationWindow->setWindowState(_activationWindow->windowState()
  53.                     & ~Qt::WindowMinimized);
  54.     _activationWindow->raise();
  55.     _activationWindow->activateWindow();
  56. }
  57. }



使用示例:
  1. #include <QtGui/QApplication>
  2. #include <QtGui/QMainWindow>
  3. #include "QtDBusObject.hpp"
  4. int main(int argc, char *argv[])
  5. {
  6.     QApplication app(argc, argv);
  7.     ChinuxTeam::QtDBusObject dbusobj("org.qtcn.sicompass");
  8.     if (!dbusobj.isConnected())
  9.     {
  10.         qDebug() << "cannot connect to dbus session bus";
  11.         app.quit();
  12.         return EXIT_FAILURE;
  13.     }
  14.     switch (dbusobj.isRunningAndRaiseStatus())
  15.     {
  16.         case ChinuxTeam::QtDBusObject::NotRunning:
  17.             break;
  18.         case ChinuxTeam::QtDBusObject::RaiseSuccess:
  19.             app.quit();
  20.             return EXIT_SUCCESS;
  21.         case ChinuxTeam::QtDBusObject::RaiseFailure:
  22.             app.quit();
  23.             return EXIT_FAILURE;
  24.     }
  25.     if (!dbusobj.registerService())
  26.     {
  27.         qDebug() << "register service failed";
  28.         app.quit();
  29.         return EXIT_FAILURE;
  30.     }
  31.     QMainWindow viewer;
  32.     dbusobj.setActivationWindow(&viewer);
  33.     if (!dbusobj.registerObject())
  34.     {
  35.         qDebug() << "register object failed";
  36.         app.quit();
  37.         return EXIT_FAILURE;
  38.     }
  39.     viewer.show();
  40.     return app.exec();
  41. }
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线yiyaaixuexi

只看该作者 1楼 发表于: 2011-07-25
这是什么意思 没有看懂
离线孤独不苦

只看该作者 2楼 发表于: 2017-07-26
这是什么意思,没看懂
快速回复
限100 字节
 
上一个 下一个