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