这是我给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重新编辑 ]