crossplatform.ru

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

2 страниц V  < 1 2  
Ответить в данную темуНачать новую тему
> Как вызвать из плагина функцию приложения?
igor_bogomolov
  опции профиля:
сообщение 21.9.2010, 12:06
Сообщение #11


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

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




Репутация:   29  


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

P.S. Перечитал еще раз и запутался окончательно. Если бы вы приложили код было бы понятнее что у вас происходит.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 21.9.2010, 12:09
Сообщение #12


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

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




Репутация:   12  


Цитата(mva @ 21.9.2010, 12:49) *
Извиняюсь, не указал важную деталь и возможно ввел в заблуждение: ошибка происходит в слоте, который является элементом плагина. В остальной части плагина вызов функций основного приложения происходит корректно.

Покажите пожалуйста примерный вариант кода (где и как вызыватются нужные методы, с описанием сторон, под сторонами я понимаю плагин/приложение). не обязательно полный.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mva
  опции профиля:
сообщение 21.9.2010, 23:02
Сообщение #13


Участник
**

Группа: Участник
Сообщений: 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) *
Т.е. падение происходит когда приложение испускает сигнал?
Тогда такой вопрос, каким образам вы связываете сигнал приложения со слот плагина?


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


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

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




Репутация:   29  


Видимо в файле проекта плагина отсутствуют следущие файлы
HEADERS += ../dictionary.h \
           ../dictionaries.h
SOURCES += ../dictionary.cpp \
           ../dictionaries.cpp
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mva
  опции профиля:
сообщение 22.9.2010, 9:50
Сообщение #15


Участник
**

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

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




Репутация:   0  


Все, проблему решил простейшим образом.

CODE

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


Всего-то что сделал - объявил функцию addDictionary(QString, int) в классе Dictionaries виртуальной. И все.
Т.е. получается, что функции, вызываемые плагином из основного приложения должны быть виртуальными.

Всем спасибо за помощь.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




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