Есть библиотека(mathprov.so) в которой содержится следующее:
Код: Выделить всё
//libs.h
#ifndef MYLIBS_H
#define MYLIBS_H
#ifdef Q_WS_WIN
# define EXPORT __declspec(dllexport)
#else
# define EXPORT
#endif
void __attribute__ ((constructor)) initialize(void);
void __attribute__ ((destructor)) finalize(void);
#endif
//mathprov.h
#ifndef MATHPROV_H
#define MATHPROV_H
#include "../libs.h"
class QWidget;
class PartTypeDialog;
QWidget* parent;
PartTypeDialog* partTypeDialog;
extern "C" {
EXPORT void setParentWidget(QWidget* p);
EXPORT QWidget* getPartTypeDialog();
}
#endif
//mathprov.cpp
void initialize()
{
partTypeDialog = 0;
}
void finalize()
{ }
QWidget* getPartTypeDialog()
{
if (partTypeDialog == 0)
partTypeDialog = new PartTypeDialog(parent);
return (QWidget*)partTypeDialog;
}
void setParentWidget(QWidget* p)
{
parent = p;
}PartTypeDialog это некий наследник QWidget. Далее основная программа:
Код: Выделить всё
//CourseWindow.h
class CourseWindow : public QMainWindow
{
<...>
QLibrary* libMathProv; QWorkspace* ws;
};
//coursewindow.cpp
CourseWindow::CourseWindow(QWidget *parent, const char *name)
: QMainWindow(parent, name), libMathProv(0)
{
<...>
ws = new QWorkspace( <...> );
ws->setScrollBarsEnabled( TRUE );
connect(ws, SIGNAL(windowActivated(QWidget*)), this, SLOT(ws_windowActivated(QWidget* )));
}
void CourseWindow::ws_windowActivated ( QWidget * w )
{
if (w == 0) [B]//unload library[/B]
libMathProv->unload();
}
void CourseWindow::somefunc()
{
<...>
lib = new QLibrary("mathprov");
lib->setAutoUnload(false);
setParent = (psetparentfunc)lib->resolve( "setParentWidget" );
getDialog = (pgetdialogfunc)lib->resolve("getPartTypeDialog");
setParent(ws);
getDialog()->show();
}Ошибка сегментации возникает когда закрываешь окно(PartTypeDialog) и предком является QWorkspace. А если выйти из моей проги не закрывая PartTypeDialog, или вместо PartTypeDialog использовать любой стандартный QT-шный класс(наследник QWidget), то ошибки не происходит. Вы можете объяснить такое явление???
Если даже PartTypeDialog выглядит так:
class PartTypeDialog : public QWidget
{
Q_OBJECT
public:
PartTypeDialog(QWidget *parent = 0, const char *name = 0): QWidget(parent, name)
};
--------
Заранее примного благодарен.