crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Как вызвать из плагина функцию приложения?
mva
  опции профиля:
сообщение 17.9.2010, 22:03
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 104
Регистрация: 15.3.2009
Из: Киров
Пользователь №: 615

Спасибо сказали: 3 раз(а)




Репутация:   0  


Добрый день!

Никак не могу найти в документации описание того, как правильно из плагина вызывать метод класса основного приложения. У меня выдается сообщение об ошибке "...: symbol lookup error: ... : undefined symbol: ... ". Может кто подскажет как это делается или где искать?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
mva
  опции профиля:
сообщение 21.9.2010, 23:02
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 104
Регистрация: 15.3.2009
Из: Киров
Пользователь №: 615

Спасибо сказали: 3 раз(а)




Репутация:   0  


Вот код плугина

searchparameters.h
Раскрывающийся текст
#include <QtGui>
#include <QFrame>
#include <QVBoxLayout>
#include <QString>
#include <QStringList>
#include <QWidget>
#include <QObject>
#include "mycombobox.h"
#include "formgridsearch.h"
#include "guifactory.h"
#include "../app.h"

class App;
class FormGridSearch;
struct sParam;

class SearchParameters : public QFrame {
    Q_OBJECT

public:
    SearchParameters(QWidget* parentWidget = 0);
    void setApp(App* a) { app = a; }
    void setFieldsList(QStringList);
    void setFormGrid(FormGridSearch* par) { parentForm = par; }
    void setProgramIdFieldName(QString s) { programIdFieldName = s; }
    void setProgramNameFieldName(QString s) { programNameFieldName = s; }

signals:
    void requery();

public slots:
    void dictionaryButtonPressed();

private:
    App* app;
    QString programIdFieldName;
    QString programNameFieldName;

    QGridLayout* gridLayout;
    QStringList parameters;
    FormGridSearch* parentForm;
    void addString(QString, int);
};


searchparameters.cpp
Раскрывающийся текст
#include <QString>
#include <QHBoxLayout>
#include <QLabel>
#include <QPushButton>
#include <QDebug>
#include <QSizePolicy>
#include <QFrame>
#include <QLayout>
#include <QKeyEvent>
#include "searchparameters.h"
#include "../dictionary.h"
#include "../dictionaries.h"
#include "formgrid.h"
#include "formgridsearch.h"
#include "../essence.h"


SearchParameters::SearchParameters(QWidget* parentWidget): QFrame(parentWidget) {
    gridLayout = 0;
}

void SearchParameters::setFieldsList(QStringList fldList) {
    ...
    gridLayout = new QGridLayout(this);
    int strNum = 0;
    for (int i = 0; i < fldList.count(); i++) {
        QString field = fldList.at(i);
        if (...)
            addString(field, strNum++);
    }
    setLayout(gridLayout);
    ...
}

void SearchParameters::addString(QString name, int strNum) {
    ...
    MyComboBox* comboBox = new MyComboBox();
    ...
    connect (comboBox, SIGNAL(enterPressed(QWidget*)), this, SLOT(comboBoxEnterPressed(QWidget*)));
    ...
    gridLayout->addWidget(comboBox, strNum, 1, 1, 1);
    if (...) {
        ...
        QPushButton* button = new QPushButton("...");
        button->setObjectName(name);
        ...
        gridLayout->addWidget(button, strNum, 2, 1, 1);
        connect (button, SIGNAL(clicked()), this, SLOT(dictionaryButtonPressed()));
        labelName = app->getDictionaries()->getDictionaryProperty(name, "имя_в_форме").toString();   [b][size=3]// здесь вызов функции из основного приложения происходит нормально[/size][/b]
        ...
    }
    else {
        labelName = app->getDictionaries()->getDictionaryProperty(parentForm->getParent()->getTableName(), "имя_в_форме").toString();    [b][size=3]// здесь тоже нормально[/size][/b]
        ...
    }
    ...
    QLabel* label = new QLabel(labelName + ":");
    gridLayout->addWidget(label, strNum, 0, 1, 1, Qt::AlignRight);
}

void SearchParameters::dictionaryButtonPressed() {
    app->getDictionaries()->addDictionary(sender()->objectName(), 0);            [b][size=3]//здесь происходит сбой[/size][/b] symbol lookup error .../libplugins.so: undefined symbol: _ZN12Dictionaries13addDictionaryE7QStringi
    Dictionary* dict = app->getDictionaries()->getDictionary(sender()->objectName());
    if (dict != 0) {
        ...
    }
    ...
}


Плагин SearchParameters "заряжается" примерно так:
Раскрывающийся текст
        extern App* app;
        ...
        QPointer<SearchParameters> parameters;
        ...
        parameters = (SearchParameters*)formWidget->findChild<QFrame*>("searchParameters");
        if (parameters) {
            parameters->setApp(app);
            parameters->setParent(formWidget);
            parameters->setFormGrid(this);
            parameters->setProgramIdFieldName(programIdFieldName);
            parameters->setProgramNameFieldName(programNameFieldName);
            parameters->setFieldsList(parent->getFieldsList());
            connect(parameters, SIGNAL(requery()), this, SLOT(cmdRequery()));
        }


QtDesigner принимает этот плагин.


Цитата(igor_bogomolov @ 21.9.2010, 12:26) *
Написал тестовый пример имитирующий проблему (переделанный стандартный пример из поставки Qt). Сам пример, конечно, не самый элегантный, но все проблемы и возможные способы решения он показывает.


Спасибо за пример. Обязательно его изучу.

Цитата(igor_bogomolov @ 21.9.2010, 13:06) *
Т.е. падение происходит когда приложение испускает сигнал?
Тогда такой вопрос, каким образам вы связываете сигнал приложения со слот плагина?


Да, приложение падает, когда испускается сигнал, точнее когда начинает выполняться код соответствующего слота. Сигнал исходит от кнопки, которая является частью плагина и обрабатывается слотом в этом же плагине.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- mva   Как вызвать из плагина функцию приложения?   17.9.2010, 22:03
- - igor_bogomolov   Ну, видимо, у меня используется подобная архитекту...   18.9.2010, 0:33
- - Litkevich Yuriy   если я правильно понимаю происходящее, то проблема...   18.9.2010, 8:44
- - SABROG   Цитата(mva @ 17.9.2010, 23:03) Никак не м...   20.9.2010, 11:05
- - wiz29   Думаю, правльно былобы иметь некий интерфейс, реал...   20.9.2010, 12:28
|- - mva   Цитата(wiz29 @ 20.9.2010, 13:28) Думаю, п...   21.9.2010, 8:42
- - Litkevich Yuriy   приведи код интерфейса и код использования в плаг...   21.9.2010, 9:33
- - SABROG   Цитата(mva @ 21.9.2010, 9:42) Но вопрос в...   21.9.2010, 11:15
- - igor_bogomolov   Написал тестовый пример имитирующий проблему (пере...   21.9.2010, 11:26
- - mva   Извиняюсь, не указал важную деталь и возможно ввел...   21.9.2010, 11:49
|- - wiz29   Цитата(mva @ 21.9.2010, 12:49) Извиняюсь,...   21.9.2010, 12:09
- - igor_bogomolov   Т.е. падение происходит когда приложение испускае...   21.9.2010, 12:06
- - mva   Вот код плугина searchparameters.h Раскрывающийся...   21.9.2010, 23:02
- - igor_bogomolov   Видимо в файле проекта плагина отсутствуют следущи...   22.9.2010, 2:25
- - mva   Все, проблему решил простейшим образом. CODE void...   22.9.2010, 9:50


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


10 чел. читают эту тему (гостей: 10, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 20.12.2024, 13:21