crossplatform.ru

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

3 страниц V   1 2 3 >  
Ответить в данную темуНачать новую тему
> GUI внутри динамической библиотеки, Как засунуть модальное окно внутрь DLL?
silart
  опции профиля:
сообщение 31.3.2008, 5:19
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 15
Регистрация: 31.3.2008
Пользователь №: 138

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




Репутация:   0  


Кто-нибудь пробовал создать на Qt такую Dll, чтобы внутри нее создавались виджеты?
Можно создать на Qt просто динамическую библиотеку, но в ней нельзя создавать виджеты, потому что объект QApplication не создается. (При обращении к графическим функциям вылазит страшное сообщение, что QPaintDevice был создан до QApplication)
Нужен ли он вообще для модальных окон? Если нужен, как его создать, он ведь не умеет конструктора по умолчанию?
Вот пример dll, что сгенерировал мастер:
CODE
class LIBRARY_EXPORT Library
{
public:
Library();
~Library();

void CreateReport(QSqlDatabase db, const QString& path, const ParameterList& params, QWidget* parent = 0);
void MessageBox(const QString& title, const QString& msg, QWidget* parent = 0);

private:
};
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 31.3.2008, 8:06
Сообщение #2


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

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




Репутация:   40  


Тебе нужна именно динамическая библиотека?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 31.3.2008, 8:40
Сообщение #3


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

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




Репутация:   40  


Ну вот я набросал простой пример:

main.cpp экзешник.
#include <QtGui/QApplication>
#include <QLibrary>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    
    QLibrary lib( "library.dll");
    typedef bool (*fnc)(QWidget*);
    fnc ShowModalDialog = (fnc) lib.resolve( "ShowModalDialog");
    if( !ShowModalDialog)
        return -1;
    ShowModalDialog( 0);

    return a.exec();
}

Собственно код самой либы:
bool LIBRARY_EXPORT ShowModalDialog( QWidget *pParent)
{
    CxDialog *dlg = new CxDialog( pParent);
    dlg->setWindowTitle( "dll dialog");
    dlg->show();

    return true;
}
Хоть диалог и не модальный, но все создается и запускается из библиотеки.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silart
  опции профиля:
сообщение 31.3.2008, 9:39
Сообщение #4


Студент
*

Группа: Новичок
Сообщений: 15
Регистрация: 31.3.2008
Пользователь №: 138

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




Репутация:   0  


Цитата(ViGOur @ 31.3.2008, 13:40) *
Ну вот я набросал простой пример:


Спасибо конечно, но немного не то... Нужно чтобы dll-ка экспортировала функцию, в которую передавался помимо всего прочего указатель на QWidget, являющимся родительским окном. А внутри экспортируемой функции создавалось модальное окно (родитель то был передан).
Вот пример либы:

CODE
#include <QtCore/QString>
#include <QtGui/QApplication>
#include <QtGui/QMessageBox>
#include <QtGui/QWidget>

QApplication* pApp = NULL;

void Init()
{
int argc = 0;
char* argv[1];
*argv = "";

pApp = new QApplication(argc, argv);
}

void Cleanup()
{
delete pApp;
}

void CreateReport(const QString& title, const QString& text, QWidget* parent)
{
QMessageBox::critical(0, title, text); //parent
return;
}


Что интересно, но так работает, только окно создается немодальное. Когда ставим parent на место, вылазит страшное сообщение о том, что событие послано другому потоку, не создавшего виджет.

Пробовал я сделать отдельный поток специально для вызова QMessageBox::critical, там матерится что виджет создается не из GUI-потока.
Пример:
CODE
class Internal : public QThread
{
Q_OBJECT
private:
QString title;
QString text;
QWidget* parent;

public:
Internal(const QString& tit, const QString& txt, QWidget* p) :
title(tit), text(txt), parent(p)
{}

void run()
{
QMessageBox::critical(parent, title, text);
}
};


Может кто сталкивался с подобным геморроем? Помогите пожалуйста.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 31.3.2008, 9:49
Сообщение #5


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

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




Репутация:   40  


У меня все работает, в аттаче проект...
Прикрепленные файлы
Прикрепленный файл  testDll.zip ( 8.94 килобайт ) Кол-во скачиваний: 440
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silart
  опции профиля:
сообщение 31.3.2008, 9:51
Сообщение #6


Студент
*

Группа: Новичок
Сообщений: 15
Регистрация: 31.3.2008
Пользователь №: 138

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




Репутация:   0  


И все это нужно мне для того, чтобы сделать такую библиотеку, которая генерирует отчет openrpt.
Ссылка взята с этого форума.
Может кто непосредственно с openrpt работал? мне нужно его в свою программу вставить. У них там все в кучу навалино, куча инклудов, проблематично в свою программу вставить.
Кто-нибудь использует openrpt?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 31.3.2008, 10:15
Сообщение #7


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

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




Репутация:   40  


С этого и нужно было начинать... :)
Где-то я видел описание его использования, если найду, выложу.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silart
  опции профиля:
сообщение 31.3.2008, 10:35
Сообщение #8


Студент
*

Группа: Новичок
Сообщений: 15
Регистрация: 31.3.2008
Пользователь №: 138

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




Репутация:   0  


Скачал я ваш проект. Только не получилось собрать его в первозданном виде. moc какие-то пути не смог найти у меня. Я сделал свой проект, так же как ваш. Блин, тоже самое. Пишет что QPaintDevice был создан до QApplication. Не знаю что и делать. Вот засада, блин.
Я и в main() пытался вызвать и внутри обработчика слота, все то же самое.
И с помощью QLibrary, и жестким связыванием - никак не работает.
У меня QT версии 4.2.2 собран статически. То есть не таскает за собой системные dll.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silart
  опции профиля:
сообщение 31.3.2008, 10:40
Сообщение #9


Студент
*

Группа: Новичок
Сообщений: 15
Регистрация: 31.3.2008
Пользователь №: 138

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




Репутация:   0  


Цитата(ViGOur @ 31.3.2008, 15:15) *
С этого и нужно было начинать... :)
Где-то я видел описание его использования, если найду, выложу.

Я скачал с официального сайта один pdf-ник, но там как сами отчетики делать в редакторе. Как его к своему проекту прикрутить не написано.
Найдите пожалуйста, очень нужно. На этих отчетах весь мир клином сошелся. Время идет, проект стоит... :(
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 31.3.2008, 11:13
Сообщение #10


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

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




Репутация:   40  


Давай, сначала попробуем собрать мой проект, раз он не собирается.

Может если у тебя получится его собрать, тогда будет все в порядке и с openrpt. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 29.3.2024, 13:21