• 9257阅读
  • 2回复

QDBusAbstractInterface的问题 [复制链接]

上一主题 下一主题
离线sd3000
 
只看楼主 倒序阅读 楼主  发表于: 2009-08-17
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
这是我给qmmp写的dbus接口,因为太长了我只贴出property部分
class Connect_qmmp : public QDBusAbstractInterface
{
        Q_OBJECT
    public :
        static inline const char *static_service()
                {return "org.qmmp.dbus";}
        static inline const char *static_path()
                {return "/Qmmp";}
        static inline const char *static_Interface()
                {return "org.qmmp.dbus";}
        Connect_qmmp (QObject *parent = 0,
                const QString &service = static_Interface(),
                const QString &path = static_path(),
                const QDBusConnection &connection=QDBusConnection::sessionBus());
        QString song_name();
        QString singer_name();
        bool is_stopped();
}

Connect_qmmp::Connect_qmmp (QObject *parent, const QString &service,
                        const QString &path, const QDBusConnection &connection)
                    :QDBusAbstractInterface (service, path,static_Interface(),
                                                        connection, parent)
{
    
}

QString Connect_qmmp::song_name()
{
    QVariant reply = property("title");
    return reply.toString();
}

QString Connect_qmmp::singer_name()
{
    QVariant reply = property("title");
    return reply.toString();
}

bool Connect_qmmp::is_stopped()
{
    QVariant reply = property("isStopped");
    return reply.toBool();
}

这是qmmp的dbus适配器
class DBUSAdaptor : public QDBusAbstractAdaptor
{
Q_OBJECT
Q_CLASSINFO("D-Bus Interface", "org.qmmp.dbus")
Q_PROPERTY(int volume READ volume WRITE setVolume)
Q_PROPERTY(int balance READ balance WRITE setBalance)
Q_PROPERTY(int length READ length)
Q_PROPERTY(int year READ year)
Q_PROPERTY(QString title READ title)
Q_PROPERTY(QString artist READ artist)
Q_PROPERTY(QString album READ album)
Q_PROPERTY(QString comment READ comment)
Q_PROPERTY(QString genre READ genre)
Q_PROPERTY(QString path READ path)
Q_PROPERTY(bool isPlaying READ isPlaying)
Q_PROPERTY(bool isPaused READ isPaused)
Q_PROPERTY(bool isStopped READ isStopped)
Q_PROPERTY(int elapsedTime READ elapsedTime)


public:
    DBUSAdaptor(Control *ctrl, QObject *parent = 0);

    ~DBUSAdaptor();

    int volume();
    void setVolume(int);
    int balance();
    void setBalance(int);
    int length();
    int year();
    QString title();
    QString artist();
    QString album();
    QString comment();
    QString genre();
    QString path();
    bool isPlaying();
    bool isPaused();
    bool isStopped();
    int elapsedTime();
};

int DBUSAdaptor::volume()
{
    int left, right;
    QMetaObject::invokeMethod(parent(), "leftVolume", Q_RETURN_ARG(int, left));
    QMetaObject::invokeMethod(parent(), "rightVolume", Q_RETURN_ARG(int, right));
    return qMax(left, right);
}

void DBUSAdaptor::setVolume(int volume)
{
    volume = qMin(volume, 100);
    volume = qMax(volume, 0);
    int bal = balance();
    int left = volume-qMax(bal,0)*volume/100;
    int right = volume+qMin(bal,0)*volume/100;
    QMetaObject::invokeMethod(m_control, "setVolume", Q_ARG(int, left), Q_ARG(int, right));
}

int DBUSAdaptor::balance()
{
    int left, right;
    QMetaObject::invokeMethod(parent(), "leftVolume", Q_RETURN_ARG(int, left));
    QMetaObject::invokeMethod(parent(), "rightVolume", Q_RETURN_ARG(int, right));
    if(left || right)
        return (right-left)*100/qMax(left, right);
    else
        return 0;
}

void DBUSAdaptor::setBalance(int bal)
{
    bal = qMin(bal,100);
    bal = qMax(bal,-100);
    int left = volume()-qMax(bal,0)*volume()/100;
    int right = volume()+qMin(bal,0)*volume()/100;
    QMetaObject::invokeMethod(m_control, "setVolume", Q_ARG(int, left), Q_ARG(int, right));
}

int DBUSAdaptor::length()
{
    return qobject_cast<DBUSControl *>(parent())->info()->length();
}

int DBUSAdaptor::year()
{
    return qobject_cast<DBUSControl *>(parent())->info()->year();
}

QString DBUSAdaptor::title()
{
    return qobject_cast<DBUSControl *>(parent())->info()->title();
}

QString DBUSAdaptor::artist()
{
    return qobject_cast<DBUSControl *>(parent())->info()->artist();
}

QString DBUSAdaptor::album()
{
    return qobject_cast<DBUSControl *>(parent())->info()->album();
}

QString DBUSAdaptor::comment()
{
    return qobject_cast<DBUSControl *>(parent())->info()->comment();
}

QString DBUSAdaptor::genre()
{
    return qobject_cast<DBUSControl *>(parent())->info()->genre();
}

QString DBUSAdaptor::path()
{
    return qobject_cast<DBUSControl *>(parent())->info()->path();
}

bool DBUSAdaptor::isPlaying()
{
    return qobject_cast<DBUSControl *>(parent())->state() == General::Playing;
}

bool DBUSAdaptor::isPaused()
{
     return qobject_cast<DBUSControl *>(parent())->state() == General::Paused;
}

bool DBUSAdaptor::isStopped()
{
     return qobject_cast<DBUSControl *>(parent())->state() == General::Stopped;
}

int DBUSAdaptor::elapsedTime()
{
    return qobject_cast<DBUSControl *>(parent())->elapsedTime();
}
图中title(),artist()都正常返值
但我通过接口中的QVariant reply = property("title");
得到的reply都是空值,但信号和method的接受是正常

接下来看二楼
[ 此帖被sd3000在2009-08-17 20:58重新编辑 ]
离线sd3000
只看该作者 1楼 发表于: 2009-08-17
这是qt官网的一个例子
适配器
class Pong: public QDBusAbstractAdaptor
{
     Q_OBJECT
     Q_CLASSINFO("D-Bus Interface", "com.trolltech.QtDBus.ComplexPong.Pong")
     Q_PROPERTY(QString value READ value WRITE setValue)
public:
     QString m_value;
     QString value() const;
     void setValue(const QString &newValue);

     Pong(QObject *obj) : QDBusAbstractAdaptor(obj)
     { }
signals:
     void aboutToQuit();
public slots:
     QDBusVariant query(const QString &query);
     Q_NOREPLY void quit();
};

QString Pong::value() const
{
     return m_value;
}

void Pong::setValue(const QString &newValue)
{
     m_value = newValue;
}

void Pong::quit()
{
     QTimer::singleShot(0, QCoreApplication::instance(), SLOT(quit()));
}

QDBusVariant Pong::query(const QString &query)
{
     QString q = query.toLower();
     if (q == "hello")
         return QDBusVariant("World");
     if (q == "ping")
         return QDBusVariant("Pong");
     if (q.indexOf("the answer to life, the universe and everything") != -1)
         return QDBusVariant(42);
     if (q.indexOf("unladen swallow") != -1) {
         if (q.indexOf("european") != -1)
             return QDBusVariant(11.0);
         return QDBusVariant(QByteArray("african or european?"));
     }

     return QDBusVariant("Sorry, I don't know the answer");
}

int main(int argc, char **argv)
{
     QCoreApplication app(argc, argv);

     QObject obj;
     Pong *pong = new Pong(&obj);
     pong->connect(&app, SIGNAL(aboutToQuit()), SIGNAL(aboutToQuit()));
     pong->setProperty("value", "initial value");
     QDBusConnection::sessionBus().registerObject("/", &obj);

     if (!QDBusConnection::sessionBus().registerService(SERVICE_NAME)) {
         fprintf(stderr, "%s\n",
                 qPrintable(QDBusConnection::sessionBus().lastError().message()));
         exit(1);
     }

     app.exec();
     return 0;
}
这是接口
class Ping: public QObject
{
     Q_OBJECT
public slots:
     void start(const QString &, const QString &, const QString &);
public:
     QFile qstdin;
     QDBusInterface *iface;
};

void Ping::start(const QString &name, const QString &oldValue, const QString &newValue)
{
     Q_UNUSED(oldValue);

     if (name != SERVICE_NAME || newValue.isEmpty())
         return;

     // open stdin for reading
     qstdin.open(stdin, QIODevice::ReadOnly);

     // find our remote
     iface = new QDBusInterface(SERVICE_NAME, "/", "com.trolltech.QtDBus.ComplexPong.Pong",
                                QDBusConnection::sessionBus(), this);
     if (!iface->isValid()) {
         fprintf(stderr, "%s\n",
                 qPrintable(QDBusConnection::sessionBus().lastError().message()));
         QCoreApplication::instance()->quit();
     }

     connect(iface, SIGNAL(aboutToQuit()), QCoreApplication::instance(), SLOT(quit()));

     while (true) {
         printf("Ask your question: ");

         QString line = QString::fromLocal8Bit(qstdin.readLine()).trimmed();
         if (line.isEmpty()) {
             iface->call("quit");
             return;
         } else if (line == "value") {
             QVariant reply = iface->property("value");
             if (!reply.isNull())
                 printf("value = %s\n", qPrintable(reply.toString()));
         } else if (line.startsWith("value=")) {
             iface->setProperty("value", line.mid(6));
         } else {
             QDBusReply<QDBusVariant> reply = iface->call("query", line);
             if (reply.isValid())
                 printf("Reply was: %s\n", qPrintable(reply.value().variant().toString()));
         }

         if (iface->lastError().isValid())
             fprintf(stderr, "Call failed: %s\n", qPrintable(iface->lastError().message()));
     }
}

int main(int argc, char **argv)
{
     QCoreApplication app(argc, argv);

     if (!QDBusConnection::sessionBus().isConnected()) {
         fprintf(stderr, "Cannot connect to the D-Bus session bus.\n"
                 "To start it, run:\n"
                 "\teval `dbus-launch --auto-syntax`\n");
         return 1;
     }

     Ping ping;
     ping.connect(QDBusConnection::sessionBus().interface(),
                  SIGNAL(serviceOwnerChanged(QString,QString,QString)),
                  SLOT(start(QString,QString,QString)));

     QProcess pong;
     pong.start("./complexpong");

     app.exec();
}


我没有发现qmmp的Dbus适配器,和我写的qmmp的接口,和官网的例子有什么区别
但就是得不到想要的结果
离线zwlt
只看该作者 2楼 发表于: 2010-04-23
支持。。。。。。。。。。。。   顶









World of Warcraft Horde Shuaqian skilled, if you do not

wow gold
Can come to my purchase
快速回复
限100 字节
 
上一个 下一个