Russian Qt Forum

Qt => Общие вопросы => Тема начата: BD от Сентябрь 06, 2007, 13:21



Название: QWidget в библиотеке
Отправлено: BD от Сентябрь 06, 2007, 13:21
Здравствуйте.
Необходимо чтобы приложение использовало, скажем, QWidget, находящийся в библиотеке ( чтобы запихнуть его на TabWidget хотя бы )
Есть какие-нибудь предложения?
использование плагинов невозможно, т.к. используются статическая QT
Поискал на форуме, везде предлагают что-то типа
Цитировать
#define EXPORT_WIDGET

extern "C" EXPORT_WIDGET QWidget * returnWidget ( QWidget * parent );
class EXPORT_WIDGET MyWidget : public QWidget
{
...
};
и
Цитировать
QWidget * returnWidget ( QWidget * parent  )
{
   return new MyWidget ( parent );
}
В этом случае, при создании виджета необходимо создать QApplication в самой библиотеке.
Но и в этом случае, нельзя будет объявить родителя созданного виджета, т.к. он и его родитель будут находится в разных потоках.

Спасибо.

QT 4.3.1, OS Linux Mandriva


Название: Re: QWidget в библиотеке
Отправлено: QCasper от Сентябрь 06, 2007, 14:56
"т.к. он и его родитель будут находится в разных потоках" - это почему?


Название: Re: QWidget в библиотеке
Отправлено: BD от Сентябрь 06, 2007, 15:03
Цитировать
"т.к. он и его родитель будут находится в разных потоках" - это почему?
Я тоже не смог ответить на этот вопрос :)
Просто при создании элемента приложение валится со словами Cannot set parent, new parent is in a different thread
Есть предположение, что при создании еще одного экземпляра QApplication, создается новый поток для него


Название: Re: QWidget в библиотеке
Отправлено: Вячеслав от Сентябрь 06, 2007, 15:55
А нафига в dll QApplication создавать ? Получай его как указатель из основной проги и усе ....


Название: Re: QWidget в библиотеке
Отправлено: BD от Сентябрь 06, 2007, 18:33
Можно пример, что надо сделать с указателем, после передачи его в dll?


Название: Re: QWidget в библиотеке
Отправлено: Вячеслав от Сентябрь 06, 2007, 20:24
Чего-то я стормозил  - есть
Код:
QCoreApplication * QCoreApplication::instance ()   [static] 
Returns a pointer to the application's QCoreApplication (or QApplication) instance.
И собственно только-что нос в стру прогу сунул -

Код:
QWidget *CreatePanel(QWidget *owner)
{
 return new StatusPanel(owner);
}
И работало-както правда это 4.1 но какая фиг разница ?
PS а instance нужен был чтоб транслятора подцепить .....


Название: Re: QWidget в библиотеке
Отправлено: BD от Сентябрь 07, 2007, 07:20
Так я так и не понял :)
Указатель нужной QApplication получить \ отправить в библиотеку это не проблема
Вопрос в том, что надо с ним сделать, чтобы все виджеты, создаваемые в этой библиотеке, стали использовать этот указатель
Цитировать
И собственно только-что нос в стру прогу сунул -
Я в первом посте аналог написал, ничем не отличается :)
Только тогда при попытке загрузить виджет из библиотеки он требует создать QApplication перед этим


Название: Re: QWidget в библиотеке
Отправлено: Вячеслав от Сентябрь 07, 2007, 09:06
Ты либу грузишь до создания QApp'a или после ? дай код загрузки глянуть .... И кстати - почему плагины не нравяться ?


Название: Re: QWidget в библиотеке
Отправлено: BD от Сентябрь 07, 2007, 10:17
После создания.
Цитировать
QDir pluginsDir = QDir ( qApp -> applicationDirPath()+"/plugins" );
foreach ( QString fileName, "/plugins" ) {      
    QLibrary newPlugin ( pluginsDir.absoluteFilePath ( fileName ) );
    typedef QWidget * ( *ReturnFunction ) ( QWidget * parent );
    ReturnFunction plug = ( ReturnFunction ) newPlugin.resolve ( "returnWidget" );
    if ( plug ) {
        QWidget * newTab = plug ( this ); // Здесь загрузка либы останавливается
        ...
    }
...
Кстати, либу надо грузить именно после создания QApp, т.к. приложение выгружаться не будет
Плагины нравятся во всем. Только, проблема в том, что они не работают в статической qt.



Название: Re: QWidget в библиотеке
Отправлено: Dodge от Сентябрь 07, 2007, 10:26
Мужики, зачем изобретать велосипед?... юзаем систему плагинов qt - дизайнера. см. маны по плагинам к дизайнеру.


Название: Re: QWidget в библиотеке
Отправлено: BD от Сентябрь 07, 2007, 10:39
Цитировать
юзаем систему плагинов qt
см. первый пост
Цитировать

использование плагинов невозможно, т.к. используются статическая QT