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