Qt コンソール アプリケーションがあります。このアプリケーションには、タイプ「my_client」のオブジェクトがあります。「my_client」オブジェクトには「messageSlot」という名前のスロットがあります。このスロットは DBUS メッセージに接続されています。
したがって、この qt アプリの主な機能は次のとおりです。
int main(int argc, char *argv[])
{
QCoreApplication a(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;
}
if (!QDBusConnection::sessionBus().registerService("org.brlapi.server"))
{
fprintf(stderr, "%s\n",
qPrintable(QDBusConnection::sessionBus().lastError().message()));
std::cout << qPrintable(QDBusConnection::sessionBus().lastError().message())
<< std::endl;
exit(1);
}
my_client client;
new myClassAdaptor(&client);
QDBusConnection::sessionBus().registerObject("/", &client);
QDBusConnection::sessionBus().connect("org.my.server",
"/",
"org.my.server",
"message",
&client,
SLOT(my_client::messageSlot(QString, QString)));
return a.exec();
}
my_client は次のとおりです。
class my_client : public QObject
{
Q_OBJECT
public:
my_client()
{
}
private slots:
void messageSlot(QString msg1, QString msg2)
{
std::cout << "CLIENT : I've received a message : " << msg1.toStdString()
<< "," << msg2.toStdString() << std::endl;
QDBusMessage msg = QDBusMessage::createSignal("/", "org.my.server", "message");
msg << "Hello!!!" << "Are you ok?";
QDBusConnection::sessionBus().send(msg);
}
};
しかし、このコードでは DBUS メッセージを受信できません。問題は、クライアント オブジェクトにメイン ループがないため、シグナルを受信できないことだと思います。
私は正しいですか?もしそうなら、どうすればクライアントオブジェクトをメインループに追加できますか? そうでない場合、このコードの問題は何ですか? dbus メッセージを受信して QT シグナル/スロットで処理するにはどうすればよいですか?