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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите с плагином  (Прочитано 3576 раз)
XpycT
Гость
« : Сентябрь 04, 2009, 15:37 »

Привет,сделал плагин для поиска инфы о фильмах на _kinopoisk.ru, но немного застрял Улыбающийся

Плагин работает нормально, все парсит и приводит к нужному формату, но вот вынести данные в основное приложение не получается. Делал как в примере книги Qt 4. Программирование GUI на С++, но дело в том что там пример чисто обработки функции. А так как у меня последний результат вычисляется в QNetworkAccessManager::finised(), не пойму как выдрать информацию от туда. Пытался обратиться к интерфейсу приложения с самого плагина, но почему-то не получается Улыбающийся.

Интерфейс у меня такой :
Код
C++ (Qt)
#include "PluginsWindow.h"
class QString;
class QStringList;
class PluginInterface {
public:
   PluginInterface() {}
   virtual ~PluginInterface() {}
 
   virtual QStringList operations() const = 0;
 
   virtual void operation() = 0;
};
 
Q_DECLARE_INTERFACE(PluginInterface,
                   "com.mysoft.Application.PluginInterface/1.0"
                  )

В приложении плагин вызывается:
Код
C++ (Qt)
// ----------------------------------------------------------------------
void PluginsWindow::addToMenu(QObject* pobj)
{
   if (!pobj) {
       return;
   }
 
   PluginInterface* pI = qobject_cast<PluginInterface*>(pobj);
   if (pI) {
       QStringList lstOperations = pI->operations();
       foreach (QString str, lstOperations) {
           QAction* pact = new QAction(str, pobj);
           connect(pact, SIGNAL(triggered()),
                   this, SLOT(slotStringOperation())
                  );
           m_pmnuPlugins->addAction(pact);
       }
   }
}
 
// ----------------------------------------------------------------------
void PluginsWindow::slotStringOperation()
{
   QAction* pact = qobject_cast<QAction*>(sender());
 
   PluginInterface* pI = qobject_cast<PluginInterface*>(pact->parent());
   pI->operation();
 
}

Ну и соответственно в самом плагине

Код
C++ (Qt)
void KinopoiskPlugin::operation()
{
   QString movieName = QInputDialog::getText(0,tr("Enter movie"),tr("Enter movie name:"));
   if(!movieName.isEmpty())
           searchMovie(movieName);
}

в самом конце функции searchMovie(movieName) идет GET запрос и в finished(QNetworkReply*) парсится в конечный вариант QString description
Код
C++ (Qt)
void KinopoiskPlugin::replyFinished(QNetworkReply* reply){
   int statusCode= reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
   int status = currentStatus;
   switch(status){
       case Movie:{
                switch(statusCode){
                    case 200:{
                            QString tmp=reply->readAll();
                            description = parseMovie(tmp);
                            QMessageBox::information(0,"",description); // Вот тут мне надо вернуть данные в основное приложение
                   }
                   break;
               }
           }
           break;
   }
}

PS Может плохо обьяснил т.к. не знаю как правильно выразиться... если по простому - мне надо конечное description вернуть в основное приложение в QPlainTextEdit ^_^
Записан
BRE
Гость
« Ответ #1 : Сентябрь 04, 2009, 15:46 »

А почему просто не послать сигнал?
Записан
XpycT
Гость
« Ответ #2 : Сентябрь 04, 2009, 17:54 »

А почему просто не послать сигнал?
Не хочется привязывать в приложении сигналы к плагинам, а реализовать полностью все в них.
Записан
BRE
Гость
« Ответ #3 : Сентябрь 04, 2009, 18:17 »

Не хочется привязывать в приложении сигналы к плагинам, а реализовать полностью все в них.
Если не использовать сигналы, то нужно будет ждать завершения сетевого обмена, т.е. замораживать выполнение основной программы или запускать все в другом потоке.

А почему не хочется использовать сигналы?
Записан
XpycT
Гость
« Ответ #4 : Сентябрь 04, 2009, 18:26 »

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

А почему не хочется использовать сигналы?


Все, понял что был не прав. Реализовал с помощью сигналов - теперь работает корректно. Спасибо за подсказку Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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