Осваиваю DBus на Qt, пишу 2 консольных приложения: первое для ввода сообщения, а второе для получения этого сообщения. Первое не компилируется, пишет :
14:26:26: Выполняются этапы для проекта First...
14:26:26: Настройки не изменились, этап qmake пропускается.
14:26:26: Запускается: «/usr/bin/make»
g++ -c -pipe -g -Wall -W -D_REENTRANT -fPIE -DQT_QML_DEBUG -DQT_DECLARATIVE_DEBUG -DQT_DBUS_LIB -DQT_CORE_LIB -I../../../Qt5.1.0/5.1.0/gcc/mkspecs/linux-g++ -I../First -I../../../Qt5.1.0/5.1.0/gcc/include -I../../../Qt5.1.0/5.1.0/gcc/include/QtDBus -I../../../Qt5.1.0/5.1.0/gcc/include/QtCore -I. -I. -o main.o ../First/main.cpp
../First/main.cpp: In function 'int main(int, char**)':
../First/main.cpp:19:34: error: no matching function for call to 'MessInterfaceAdaptor::MessInterfaceAdaptor(First&)'
../First/main.cpp:19:34: note: candidates are:
In file included from ../First/main.cpp:5:0:
../First/mess_adaptor.h:40:5: note: MessInterfaceAdaptor::MessInterfaceAdaptor(QObject*)
../First/mess_adaptor.h:40:5: note: no known conversion for argument 1 from 'First' to 'QObject*'
../First/mess_adaptor.h:29:7: note: MessInterfaceAdaptor::MessInterfaceAdaptor(const MessInterfaceAdaptor&)
../First/mess_adaptor.h:29:7: note: no known conversion for argument 1 from 'First' to 'const MessInterfaceAdaptor&'
../First/main.cpp:21:38: error: no matching function for call to 'QDBusConnection::registerObject(const char [6], First&)'
../First/main.cpp:21:38: note: candidate is:
In file included from ../../../Qt5.1.0/5.1.0/gcc/include/QtDBus/qdbusabstractinterface.h:52:0,
from ../../../Qt5.1.0/5.1.0/gcc/include/QtDBus/QtDBus:5,
from ../First/main.cpp:4:
../../../Qt5.1.0/5.1.0/gcc/include/QtDBus/qdbusconnection.h:168:10: note: bool QDBusConnection::registerObject(const QString&, QObject*, QDBusConnection::RegisterOptions)
../../../Qt5.1.0/5.1.0/gcc/include/QtDBus/qdbusconnection.h:168:10: note: no known conversion for argument 2 from 'First' to 'QObject*'
make: *** [main.o] Error 1
14:26:30: Процесс «/usr/bin/make» завершился с кодом 2.
Ошибка при сборке/установке проекта First (комплект: Desktop Qt 5.1.0 GCC 32bit)
Во время выполнения этапа «Сборка»
14:26:30: Прошло времени: 00:04.
Код First.h
#ifndef FIRST_H
#define FIRST_H
#include <iostream>
#include <QObject>
using namespace std;
class First: public QObject
{
Q_OBJECT
public:
First(string);
public Q_SLOTS:
void Str(string);
string get_str();
private:
string strok;
};
#endif // FIRST_H
First.cpp
#include "First.h"
#include <iostream>
using namespace std;
First::First(string First::strok)
{
First::Str(First::sstrok);
}
void First::Str(string str)
{
First::strok=str;
}
string First::get_str()
{
return First::strok;
}
Main.cpp
#include <QCoreApplication>
#include "First.h"
#include <iostream>
#include <QtDBus/QtDBus>
#include "mess_adaptor.h"
using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
string strok;
cout << "Eter the word and press 'ENTER':\n";
getline(cin, strok);
First *fir = new First(strok);
new MessInterfaceAdaptor(*fir);
QDBusConnection conn = QDBusConnection::sessionBus();
conn.registerObject("/Mess", *fir);
conn.registerService("org.Message");
delete fir;
}
Так-же создал Mess.xml
<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
<node>
<interface name="org.MessInterface">
<method name="Str"/>
<method name="get_str"/>
</interface>
</node>
И с помощью терминала сгенерил mess_adaptor.h
/*
* This file was generated by qdbusxml2cpp version 0.8
* Command line was: qdbusxml2cpp -a mess_adaptor.h: Mess.xml
*
* qdbusxml2cpp is Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
*
* This is an auto-generated file.
* This file may have been hand-edited. Look for HAND-EDIT comments
* before re-generating it.
*/
#ifndef MESS_ADAPTOR_H_1377155979
#define MESS_ADAPTOR_H_1377155979
#include <QtCore/QObject>
#include <QtDBus/QtDBus>
QT_BEGIN_NAMESPACE
class QByteArray;
template<class T> class QList;
template<class Key, class Value> class QMap;
class QString;
class QStringList;
class QVariant;
QT_END_NAMESPACE
/*
* Adaptor class for interface org.MessInterface
*/
class MessInterfaceAdaptor: public QDBusAbstractAdaptor
{
Q_OBJECT
Q_CLASSINFO("D-Bus Interface", "org.MessInterface")
Q_CLASSINFO("D-Bus Introspection", ""
" <interface name=\"org.MessInterface\">\n"
" <method name=\"Str\"/>\n"
" <method name=\"get_str\"/>\n"
" </interface>\n"
"")
public:
MessInterfaceAdaptor(QObject *parent);
virtual ~MessInterfaceAdaptor();
public: // PROPERTIES
public Q_SLOTS: // METHODS
void Str();
void get_str();
Q_SIGNALS: // SIGNALS
};
#endif
Пожалуйста, подскажите, что делаю не так..
C++ (Qt)
new MessInterfaceAdaptor(*fir);
...
conn.registerObject("/Mess", *fir);
Звездочка лишняя
Ну и в догонку:
твой код ничего осмысленного не сделает, потому что после регистрации в DBus идет удаление fir и выход
Спасибо большое, заработало.
Ну и в догонку:
твой код ничего осмысленного не сделает, потому что после регистрации в DBus идет удаление fir и выход
Только подтереть строчку delete fir?