crossplatform.ru

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

3 страниц V   1 2 3 >  
Ответить в данную темуНачать новую тему
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 килобайт ) Кол-во скачиваний: 472
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
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. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silart
  опции профиля:
сообщение 31.3.2008, 11:18
Сообщение #11


Студент
*

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

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




Репутация:   0  


Цитата(ViGOur @ 31.3.2008, 16:13) *
Давай, сначала попробуем собрать мой проект, раз он не собирается.

Может если у тебя получится его собрать, тогда будет все в порядке и с openrpt. :)


Вот что пишет:
CODE
Moc'ing testdll.h...
Системе не удается найти указанный путь.
Project : error PRJ0019: A tool returned an error code from "Moc'ing testdll.h..."
Project : warning PRJ0018 : The following environment variables were not found:

Где эти пути указываются, ума не приложу.
Вроде все правильно указано
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silart
  опции профиля:
сообщение 31.3.2008, 11:36
Сообщение #12


Студент
*

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

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




Репутация:   0  


У нас разные настройки студии.
Я не могу собрать проект из-за того, что ui_testdll.h не найден.
И указать путь метакомпилятору я не знаю где. Вроде везде где можено посмотрел... :(
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 31.3.2008, 11:39
Сообщение #13


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

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

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




Репутация:   40  


Студия тут не причем, moc должен сам определить что, откуда и куда он должен брать и генерить.

Попробуй сделать ребилд полный, иногда помогает, когда moc начинает дурить.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 31.3.2008, 11:40
Сообщение #14


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

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

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




Репутация:   40  


Хотя может проблема в том, что я сделал пример на 4.3.0 и это наверное где-то в файле проекта прописано...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 31.3.2008, 11:44
Сообщение #15


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


qmake надо поэксплуотриовать, только как подстудией его пользуют незнаю, вам виднее, вообщем чтобы новые мэйкфайлы или файл проекта студии получить
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silart
  опции профиля:
сообщение 31.3.2008, 11:49
Сообщение #16


Студент
*

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

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




Репутация:   0  


ViGOur, не могли бы вы мне прислать проект в виде pro-файла, а то версии разные, может из-за этого.
Я повсякому пробовал.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 31.3.2008, 12:16
Сообщение #17


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

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

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




Репутация:   40  


Цитата(silart @ 31.3.2008, 12:49) *
ViGOur, не могли бы вы мне прислать проект в виде pro-файла, а то версии разные, может из-за этого.
Я повсякому пробовал.
Смотри аттач.
Прикрепленные файлы
Прикрепленный файл  testDll.zip ( 1.89 килобайт ) Кол-во скачиваний: 209
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silart
  опции профиля:
сообщение 31.3.2008, 14:59
Сообщение #18


Студент
*

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

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




Репутация:   0  


Цитата(ViGOur @ 31.3.2008, 17:16) *
Смотри аттач.


Проект скачал, открыл, вроде все преобразовалось, только вот библиотека стала не проектом dll, а проектом статической библиотеки.
Ну да ладно, подправил, вроде собралась dll-ка. Только эта dll-ка не хочет загружаться с помощью QLibrary... Ну и ладно, загрузил ее обычным статическим способом (раннее связывание), так загрузилась... но вот проблема осталась той же. Опять пишет что QPaintDevice до QApplication.
Может из-за того что разные версии Qt? Или из-за того, что что у меня проект собирается со статическими версиями библиотек? Может быть такое или нет?
Во всяком случае спасибо вам, ViGOur. Вы и так на меня уже много времени потратили.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 31.3.2008, 15:13
Сообщение #19


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

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

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




Репутация:   40  


Да вроде не должно быть зависимости статическая или динамическая сборка.
Ведь может понадобиться как та так и другая сборка одновременно в проекте.

Последний архив, я компилил так:
qmake
nmake
без qmake -project, чтобы не портить pro файл.
Разумеется как для exe так и для dll.

Библиотека должна быть статической, если заметил там я создал еще def файл в папке проекта библиотеки и в pro файле указал его.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silart
  опции профиля:
сообщение 31.3.2008, 15:48
Сообщение #20


Студент
*

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

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




Репутация:   0  


Цитата(ViGOur @ 31.3.2008, 20:13) *
Да вроде не должно быть зависимости статическая или динамическая сборка.
Ведь может понадобиться как та так и другая сборка одновременно в проекте.

Последний архив, я компилил так:
qmake
nmake
без qmake -project, чтобы не портить pro файл.
Разумеется как для exe так и для dll.

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


Механизм QLibrary мутный какой-то. lib-файл тоже не хочет загружать...
Вообще это все нужно для плагинов, мне он необязательно нужен. Я могу и статически связать dll с exe.
Но все равно никак не работает.

С QApplication вроде работало, но только немодальный диалог создавало, а модальнывй никак...
В чем же проблема...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 31.3.2008, 19:27
Сообщение #21


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

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

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




Репутация:   40  


Цитата(ViGOur @ 31.3.2008, 16:13) *
Библиотека должна быть статической, если заметил там я создал еще def файл в папке проекта библиотеки и в pro файле указал его.
Извини, ошибся, библиотека должна быть динамической.

Думал о статической библиотеке, нужно было написать слово динамическая, а написал статическая. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_hmmm_*
сообщение 17.5.2009, 0:59
Сообщение #22





Гости








    


Вопрос совсем не в тему но пробовал на примерах из этой темы поэтому вопрос именно сюда.
Открыл тестовый проект в VS. Тоесть два проекта - один либа другой main. Собираб либу как dll и линкую к главному проекту. Прописываю в свойствах главное проекта связь с lib файлу из либы и пишу простенький header для использования функции из библиотеки. Когда запускаю на выполнение не может найти dll. Кидаю dll в папку debug c главным проектом - всё работает отлично. Скажите а как-нибудь можно реализовывать разработку чтобы не надо было постоянно кидать длл-ку ??Наверняка ведь как-то можно это подругому делать?? Просто в другом своём приложении хочу вынести ряд классов и функций в либу и не хотелось бы всё время переносить длл-ку.. глупо оно как-то=(((
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 17.5.2009, 2:15
Сообщение #23


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Укажи в переменной среды PATH, путь к своей библиотеке. Виндовоз, не найдя в каталоге с exe'шником нужной dll'ки, полезит просматривать пути указанные в переменной PATH.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_hmmm_*
сообщение 17.5.2009, 12:23
Сообщение #24





Гости








    


Цитата(Litkevich Yuriy @ 17.5.2009, 2:15) *
Укажи в переменной среды PATH, путь к своей библиотеке. Виндовоз, не найдя в каталоге с exe'шником нужной dll'ки, полезит просматривать пути указанные в переменной PATH.

Жаль(( я думал проблема может быть решена каким либо шаманством с настройками проекта solutinа.. или ещё как. Для каждой своей либы такое делать не удобно, да и разрабатываю не один, поэтому надо и остальным прописывать.. вероятно придётся делать не статическую линковку а через QLibrary или QPluginLoader, что не оч удобно так как довольно много классов от туда хватать буду в разных местах программы, получается придётся делать синглтон для загрузки самой либы, чтобы не указывать в каждом месте её загрузку.. =(
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_hmmm_*
сообщение 17.5.2009, 12:25
Сообщение #25





Гости








    


з.ы. только если конечно мы можем указать path не глобально а исключительно для программы. Не совсем правда соображу как это сделать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 17.5.2009, 12:35
Сообщение #26


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(Гость_hmmm_* @ 17.5.2009, 16:23) *
я думал проблема может быть решена каким либо шаманством с настройками проекта solutinа
ну в ней я думаю можно так сделать, но я студией не пользуюсь
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 17.5.2009, 13:51
Сообщение #27


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

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




Репутация:   23  


Цитата(Гость_hmmm_* @ 17.5.2009, 13:25) *
з.ы. только если конечно мы можем указать path не глобально а исключительно для программы. Не совсем правда соображу как это сделать.

в винде можно в батнике прописать свой PATH(с помощью set) и потом запустить программу
PATH прописанная таким образом будет действительна только для сеанса батника и не будетп ортить глобальную PATH для всех прог и винды.

естественно прогу запускать через батник

что-то типа
=======файл toStart.cmd=====
@set PATH=пишем что надо для запуска проги
имя запускаемой программы
=======================

теперь прога запустится в нужном окружении

Сообщение отредактировал kwisp - 17.5.2009, 13:55
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_hmmm_*
сообщение 17.5.2009, 14:57
Сообщение #28





Гости








    


Этот вариант будет пригоден скорее уже для реализованного приложения нежели для процесса разработки.. ведь надо как-то отлаживать программу и при этом не кидать каждый раз dll-ки в debug.. самое печальное в некоторых книгах например Хортона по програмиированию в VSC++ 2008 указана такая проблема и они как раз и переносят файлик тупо в debug. Странное на мой взгляд решение.. Наверное буду решать этот вопрос динамическим подключением...

Кстати возможно я иду несколько не тем путём.. потому что мне в идеале нужна не столько прям сама dll сколько возможность собрать модуль который можно безболезненно подключать к различным проектам + возможность его отлаживать и проч.. тоесть фактически просто некоторый набор cpp и h, ui файлов которые можно подключать к разным проектам. Насколько я понял это решается именно через выделение их в отдельную библиотеку (а в рамках студии помещение их в отдельный проект) и компиляции как библиотеки в моём случае dll.

Возможно я что-то путаю или не понимаю, но перелопатил много материалла и на prog.org.ru и здесь и в документации и другое пути пока не нашёл. =((
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 17.5.2009, 17:52
Сообщение #29


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

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




Репутация:   23  


эт наверное я не понимаю.

я думал надо запускать программу с определенным PATH - это решается с помощью батника. точно так же можно имея на машине несколько вариантов(версий) библиотеки Qt и несколько компиляторов запуская определенный батник собирать проекты различными компиляторами и используя различные библиотеки... не коверкая системный PATH каждый раз.:)
Цитата(Гость_hmmm_* @ 17.5.2009, 15:57) *
ведь надо как-то отлаживать программу и при этом не кидать каждый раз dll-ки в debug..

и не будешь кидать их в дебуг, пропишешь путь к ним в PATH в батнике и должно заработать.

впрочем если я что то перепутал то простите. завтра с работы могу кинуть свои батники если надо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 6.4.2025, 15:02