Название: QDbus и LineEdit :'(
Отправлено: malcer от Июня 16, 2011, 00:47
здравствуйте пишу прогу, которой нужно "управлять" из терминала.
void example::run() { qDebug() << "result"; ui->lineEdit->setText("result"); }
почемуто, запуская этот метод через терминал,используя QDbus c qDebug нет проблем, а эдит воопще не реагирует :-\
подскажыте в чем проблема?
Название: Re: QDbus и LineEdit :'(
Отправлено: LisandreL от Июня 16, 2011, 07:48
Вы сам вызов-то показали бы. И опеределение example.
Название: Re: QDbus и LineEdit :'(
Отправлено: malcer от Июня 16, 2011, 10:37
Мой код: C++ (Qt) --------------------------------------------------- main.cpp --------------------------------------------------- #include <QtGui/QApplication> #include <QtDBus/QDBusConnection> #include "example.h" #include "adaptor.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); /* connection to the service session bus */ example *tmp = new example(); new Adaptor(tmp); QDBusConnection connection = QDBusConnection::sessionBus(); connection.registerObject("/example", tmp); connection.registerService("com.trolltech.Example"); example w; w.show(); return a.exec(); } --------------------------------------------------- example.h --------------------------------------------------- #ifndef EXAMPLE_H #define EXAMPLE_H #include <QMainWindow> #include <QtDBus/QtDBus> #include <QtCore/QDebug> #include <QString> #include <QFile> namespace Ui { class example; } class example : public QMainWindow { Q_OBJECT public: example(QWidget *parent = 0); ~example(); QString str; protected: void changeEvent(QEvent *e); private: Ui::example *ui; public Q_SLOTS: void run(); void on_pushButton_clicked(); }; #endif // EXAMPLE_H --------------------------------------------------- example.cpp --------------------------------------------------- #include "example.h" #include "ui_example.h" example::example(QWidget *parent) : QMainWindow(parent), ui(new Ui::example) { ui->setupUi(this); } example::~example() { //delete ui; } void example::changeEvent(QEvent *e) { QMainWindow::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: ui->retranslateUi(this); break; default: break; } } void example::run() { qDebug() << "qdbus"; ui->lineEdit->setText("qdbus"); } void example::on_pushButton_clicked() { qDebug() << "button"; ui->lineEdit->setText("button"); } --------------------------------------------------- adaptor.h --------------------------------------------------- #include <QtDBus/QtDBus> class Adaptor: public QDBusAbstractAdaptor { Q_OBJECT Q_CLASSINFO("D-Bus Interface", "com.trolltech.Example") Q_CLASSINFO("D-Bus Introspection", "" " <interface name=\"com.trolltech.Example\" >\n" " <method name=\"run\" />\n" " </method>\n" " </interface>\n" "") public: Adaptor(QObject *parent); virtual ~Adaptor(); public: // PROPERTIES public Q_SLOTS: // METHODS void run(); }; --------------------------------------------------- adaptor.cpp --------------------------------------------------- #include "adaptor.h" #include "example.h" #include <QtCore/QMetaObject> Adaptor::Adaptor(QObject *parent) : QDBusAbstractAdaptor(parent) { // constructor setAutoRelaySignals(true); } Adaptor::~Adaptor() { // destructor } void Adaptor::run() { QMetaObject::invokeMethod(parent(), "run"); }
Из терминала ввожу " qdbus com.trolltech.Example /example run "
Название: Re: QDbus и LineEdit :'(
Отправлено: LisandreL от Июня 16, 2011, 10:55
Я правильно понимаю, что метод run вызывается, qDebug выводится, а edit не модифицируется? C D-Bus не работал, но рискну предположить, что проблема с потоками (к Gui из неосновного потока обращаться нельзя). Сделайте проверку: C++ (Qt) void example::run() { qDebug() << "qdbus"; ui->lineEdit->setText("qdbus") << QThread::currentThread () << qApp->thread(); }
Если потоки разные попробуйте вызывать run так: C++ (Qt) void Adaptor::run() { QMetaObject::invokeMethod( parent(), "run", Qt::QueuedConnection ); }
Название: Re: QDbus и LineEdit :'(
Отправлено: malcer от Июня 16, 2011, 14:31
Нет, у меня только один основной поток.
А после QMetaObject::invokeMethod( parent(), "run", Qt::QueuedConnection ); ничего не изменяеться:(
попробую создать второй и доступаться через него.
|