LINUX.ORG.RU

qt виджет в динамической библиотеке


0

0

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

описываю интерфейс:

class ShapeInterface {
public:
        virtual ~ShapeInterface() {}

   virtual void up() = 0;
   virtual void down() = 0;
   virtual void left() = 0;
   virtual void right() = 0;
};

реализую интерфейс в динамической библиотеке, и экспортирую функции создания/удаления виджета.

class RectangleShape : public QWidget, public ShapeInterface {
public:
   RectangleShape(QWidget *parent = 0) : QWidget(parent) {}
   ~RectangleShape() {}

public:
   void up() {}
   void down() {}
   void left() {}
   void right() {};
};


extern "C" ShapeInterface *create_object(QWidget *parent)
{
   return new RectangleShape(parent);
}


extern "C" void destroy_object(ShapeInterface *pObj)
{
   delete pObj;
}

код реализации функций интерфейса значения не имеет. вобщем, пытаюсь работать как с классическим плагином на с++. вызываю из хостового приложения так:

   QLibrary myLib(objPath);
   typedef ShapeInterface *(*create_object)(QWidget *);
   create_object myNew =
        (create_object) myLib.resolve("create_object");

   if (myNew) {
      ShapeInterface *shapeInterface = myNew(this);
   }

объект явно создается (конструктор во всяком случае срабатывает), вот только на родителе виджет не отображается, хотя информацию о родителе из динамической бибилотеки можно получить (заголовок окна, геометрию окна и тп). но почему то он не отображается. Это какая то ограниченность qt, либо я что то не так делаю?

в идеале, мне нужно поместить в библиотеку виджет, чтобы динамически подгружать и отображать его на главном окне приложения (на любом parent вобщем). смотрел классическую систему плагинов qt, но там как я понял, вообще виджеты нельзя запихнуть, только надстройку наж ними. Да и не хочется использовать qt-шные плагины, а остаться на стандартной архитектуре (с экспортом своих ctors/dtors).

спасибо за внимание

★★★★★

Последнее исправление: vvviperrr (всего исправлений: 1)

господи, вызвал в конструкторе метод show(), и все сразу стало отображаться :) а вчера полночи просидел. всем спасибо :)

vvviperrr ★★★★★
() автор топика
Ответ на: комментарий от vvviperrr

Если виджету в конструктор не подставить родителя, то он считается окном и будет по умолчанию спрятан.

Dendy ★★★★★
()
Ответ на: комментарий от Dendy

я родителя в конструктор подставляю, но по умолчанию виджет все равно спрятан

vvviperrr ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.