Russian Qt Forum
Июля 05, 2025, 18:59 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QDbus и LineEdit :'(  (Прочитано 2751 раз)
malcer
Гость
« : Июня 16, 2011, 00:47 »

здравствуйте
пишу прогу, которой нужно "управлять" из терминала.

void example::run()
{
   qDebug() << "result";
   ui->lineEdit->setText("result");
}

почемуто, запуская этот метод через терминал,используя QDbus
c qDebug нет проблем, а эдит воопще не реагирует  В замешательстве

подскажыте в чем проблема?

Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #1 : Июня 16, 2011, 07:48 »

Вы сам вызов-то показали бы. И опеределение example.
Записан
malcer
Гость
« Ответ #2 : Июня 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 "
« Последнее редактирование: Июня 16, 2011, 10:39 от Пантер » Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #3 : Июня 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 );
}
« Последнее редактирование: Июня 16, 2011, 14:54 от LisandreL » Записан
malcer
Гость
« Ответ #4 : Июня 16, 2011, 14:31 »

Нет, у меня только один основной поток.

А после QMetaObject::invokeMethod( parent(), "run", Qt::QueuedConnection );
ничего не изменяеться:(

попробую создать второй и доступаться через него.

Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.044 секунд. Запросов: 19.