![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
silart |
![]()
Сообщение
#1
|
Студент ![]() Группа: Новичок Сообщений: 15 Регистрация: 31.3.2008 Пользователь №: 138 Спасибо сказали: 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 |
![]()
Сообщение
#2
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
Тебе нужна именно динамическая библиотека?
|
|
|
ViGOur |
![]()
Сообщение
#3
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
Ну вот я набросал простой пример:
main.cpp экзешник.
Собственно код самой либы: Хоть диалог и не модальный, но все создается и запускается из библиотеки.
|
|
|
silart |
![]()
Сообщение
#4
|
Студент ![]() Группа: Новичок Сообщений: 15 Регистрация: 31.3.2008 Пользователь №: 138 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Ну вот я набросал простой пример: Спасибо конечно, но немного не то... Нужно чтобы 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 |
![]()
Сообщение
#5
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
У меня все работает, в аттаче проект...
Прикрепленные файлы
|
|
|
silart |
![]()
Сообщение
#6
|
Студент ![]() Группа: Новичок Сообщений: 15 Регистрация: 31.3.2008 Пользователь №: 138 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
И все это нужно мне для того, чтобы сделать такую библиотеку, которая генерирует отчет openrpt.
Ссылка взята с этого форума. Может кто непосредственно с openrpt работал? мне нужно его в свою программу вставить. У них там все в кучу навалино, куча инклудов, проблематично в свою программу вставить. Кто-нибудь использует openrpt? |
|
|
ViGOur |
![]()
Сообщение
#7
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
С этого и нужно было начинать...
![]() Где-то я видел описание его использования, если найду, выложу. |
|
|
silart |
![]()
Сообщение
#8
|
Студент ![]() Группа: Новичок Сообщений: 15 Регистрация: 31.3.2008 Пользователь №: 138 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Скачал я ваш проект. Только не получилось собрать его в первозданном виде. moc какие-то пути не смог найти у меня. Я сделал свой проект, так же как ваш. Блин, тоже самое. Пишет что QPaintDevice был создан до QApplication. Не знаю что и делать. Вот засада, блин.
Я и в main() пытался вызвать и внутри обработчика слота, все то же самое. И с помощью QLibrary, и жестким связыванием - никак не работает. У меня QT версии 4.2.2 собран статически. То есть не таскает за собой системные dll. |
|
|
silart |
![]() ![]()
Сообщение
#9
|
Студент ![]() Группа: Новичок Сообщений: 15 Регистрация: 31.3.2008 Пользователь №: 138 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
С этого и нужно было начинать... ![]() Где-то я видел описание его использования, если найду, выложу. Я скачал с официального сайта один pdf-ник, но там как сами отчетики делать в редакторе. Как его к своему проекту прикрутить не написано. Найдите пожалуйста, очень нужно. На этих отчетах весь мир клином сошелся. Время идет, проект стоит... ![]() |
|
|
ViGOur |
![]()
Сообщение
#10
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
Давай, сначала попробуем собрать мой проект, раз он не собирается.
Может если у тебя получится его собрать, тогда будет все в порядке и с openrpt. ![]() |
|
|
silart |
![]()
Сообщение
#11
|
Студент ![]() Группа: Новичок Сообщений: 15 Регистрация: 31.3.2008 Пользователь №: 138 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Давай, сначала попробуем собрать мой проект, раз он не собирается. Может если у тебя получится его собрать, тогда будет все в порядке и с 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 |
![]()
Сообщение
#12
|
Студент ![]() Группа: Новичок Сообщений: 15 Регистрация: 31.3.2008 Пользователь №: 138 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
У нас разные настройки студии.
Я не могу собрать проект из-за того, что ui_testdll.h не найден. И указать путь метакомпилятору я не знаю где. Вроде везде где можено посмотрел... ![]() |
|
|
ViGOur |
![]()
Сообщение
#13
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
Студия тут не причем, moc должен сам определить что, откуда и куда он должен брать и генерить.
Попробуй сделать ребилд полный, иногда помогает, когда moc начинает дурить. |
|
|
ViGOur |
![]()
Сообщение
#14
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
Хотя может проблема в том, что я сделал пример на 4.3.0 и это наверное где-то в файле проекта прописано...
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#15
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
qmake надо поэксплуотриовать, только как подстудией его пользуют незнаю, вам виднее, вообщем чтобы новые мэйкфайлы или файл проекта студии получить
|
|
|
silart |
![]()
Сообщение
#16
|
Студент ![]() Группа: Новичок Сообщений: 15 Регистрация: 31.3.2008 Пользователь №: 138 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
ViGOur, не могли бы вы мне прислать проект в виде pro-файла, а то версии разные, может из-за этого.
Я повсякому пробовал. |
|
|
ViGOur |
![]()
Сообщение
#17
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
ViGOur, не могли бы вы мне прислать проект в виде pro-файла, а то версии разные, может из-за этого. Смотри аттач.
Я повсякому пробовал.
Прикрепленные файлы
|
|
|
silart |
![]()
Сообщение
#18
|
Студент ![]() Группа: Новичок Сообщений: 15 Регистрация: 31.3.2008 Пользователь №: 138 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Смотри аттач. Проект скачал, открыл, вроде все преобразовалось, только вот библиотека стала не проектом dll, а проектом статической библиотеки. Ну да ладно, подправил, вроде собралась dll-ка. Только эта dll-ка не хочет загружаться с помощью QLibrary... Ну и ладно, загрузил ее обычным статическим способом (раннее связывание), так загрузилась... но вот проблема осталась той же. Опять пишет что QPaintDevice до QApplication. Может из-за того что разные версии Qt? Или из-за того, что что у меня проект собирается со статическими версиями библиотек? Может быть такое или нет? Во всяком случае спасибо вам, ViGOur. Вы и так на меня уже много времени потратили. |
|
|
ViGOur |
![]()
Сообщение
#19
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
Да вроде не должно быть зависимости статическая или динамическая сборка.
Ведь может понадобиться как та так и другая сборка одновременно в проекте. Последний архив, я компилил так: без qmake -project, чтобы не портить pro файл.Разумеется как для exe так и для dll. Библиотека должна быть статической, если заметил там я создал еще def файл в папке проекта библиотеки и в pro файле указал его. |
|
|
silart |
![]()
Сообщение
#20
|
Студент ![]() Группа: Новичок Сообщений: 15 Регистрация: 31.3.2008 Пользователь №: 138 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Да вроде не должно быть зависимости статическая или динамическая сборка. Ведь может понадобиться как та так и другая сборка одновременно в проекте. Последний архив, я компилил так: без qmake -project, чтобы не портить pro файл.Разумеется как для exe так и для dll. Библиотека должна быть статической, если заметил там я создал еще def файл в папке проекта библиотеки и в pro файле указал его. Механизм QLibrary мутный какой-то. lib-файл тоже не хочет загружать... Вообще это все нужно для плагинов, мне он необязательно нужен. Я могу и статически связать dll с exe. Но все равно никак не работает. С QApplication вроде работало, но только немодальный диалог создавало, а модальнывй никак... В чем же проблема... |
|
|
ViGOur |
![]()
Сообщение
#21
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
Библиотека должна быть статической, если заметил там я создал еще def файл в папке проекта библиотеки и в pro файле указал его. Извини, ошибся, библиотека должна быть динамической.Думал о статической библиотеке, нужно было написать слово динамическая, а написал статическая. ![]() |
|
|
Гость_hmmm_* |
![]()
Сообщение
#22
|
Гости ![]() |
Вопрос совсем не в тему но пробовал на примерах из этой темы поэтому вопрос именно сюда.
Открыл тестовый проект в VS. Тоесть два проекта - один либа другой main. Собираб либу как dll и линкую к главному проекту. Прописываю в свойствах главное проекта связь с lib файлу из либы и пишу простенький header для использования функции из библиотеки. Когда запускаю на выполнение не может найти dll. Кидаю dll в папку debug c главным проектом - всё работает отлично. Скажите а как-нибудь можно реализовывать разработку чтобы не надо было постоянно кидать длл-ку ??Наверняка ведь как-то можно это подругому делать?? Просто в другом своём приложении хочу вынести ряд классов и функций в либу и не хотелось бы всё время переносить длл-ку.. глупо оно как-то=((( |
|
|
Litkevich Yuriy |
![]()
Сообщение
#23
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Укажи в переменной среды PATH, путь к своей библиотеке. Виндовоз, не найдя в каталоге с exe'шником нужной dll'ки, полезит просматривать пути указанные в переменной PATH.
|
|
|
Гость_hmmm_* |
![]()
Сообщение
#24
|
Гости ![]() |
Укажи в переменной среды PATH, путь к своей библиотеке. Виндовоз, не найдя в каталоге с exe'шником нужной dll'ки, полезит просматривать пути указанные в переменной PATH. Жаль(( я думал проблема может быть решена каким либо шаманством с настройками проекта solutinа.. или ещё как. Для каждой своей либы такое делать не удобно, да и разрабатываю не один, поэтому надо и остальным прописывать.. вероятно придётся делать не статическую линковку а через QLibrary или QPluginLoader, что не оч удобно так как довольно много классов от туда хватать буду в разных местах программы, получается придётся делать синглтон для загрузки самой либы, чтобы не указывать в каждом месте её загрузку.. =( |
|
|
Гость_hmmm_* |
![]()
Сообщение
#25
|
Гости ![]() |
з.ы. только если конечно мы можем указать path не глобально а исключительно для программы. Не совсем правда соображу как это сделать.
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#26
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
kwisp |
![]()
Сообщение
#27
|
![]() астарожна ынтжинэр ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
з.ы. только если конечно мы можем указать path не глобально а исключительно для программы. Не совсем правда соображу как это сделать. в винде можно в батнике прописать свой PATH(с помощью set) и потом запустить программу PATH прописанная таким образом будет действительна только для сеанса батника и не будетп ортить глобальную PATH для всех прог и винды. естественно прогу запускать через батник что-то типа =======файл toStart.cmd===== @set PATH=пишем что надо для запуска проги имя запускаемой программы ======================= теперь прога запустится в нужном окружении Сообщение отредактировал kwisp - 17.5.2009, 13:55 |
|
|
Гость_hmmm_* |
![]()
Сообщение
#28
|
Гости ![]() |
Этот вариант будет пригоден скорее уже для реализованного приложения нежели для процесса разработки.. ведь надо как-то отлаживать программу и при этом не кидать каждый раз dll-ки в debug.. самое печальное в некоторых книгах например Хортона по програмиированию в VSC++ 2008 указана такая проблема и они как раз и переносят файлик тупо в debug. Странное на мой взгляд решение.. Наверное буду решать этот вопрос динамическим подключением...
Кстати возможно я иду несколько не тем путём.. потому что мне в идеале нужна не столько прям сама dll сколько возможность собрать модуль который можно безболезненно подключать к различным проектам + возможность его отлаживать и проч.. тоесть фактически просто некоторый набор cpp и h, ui файлов которые можно подключать к разным проектам. Насколько я понял это решается именно через выделение их в отдельную библиотеку (а в рамках студии помещение их в отдельный проект) и компиляции как библиотеки в моём случае dll. Возможно я что-то путаю или не понимаю, но перелопатил много материалла и на prog.org.ru и здесь и в документации и другое пути пока не нашёл. =(( |
|
|
kwisp |
![]()
Сообщение
#29
|
![]() астарожна ынтжинэр ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
эт наверное я не понимаю.
я думал надо запускать программу с определенным PATH - это решается с помощью батника. точно так же можно имея на машине несколько вариантов(версий) библиотеки Qt и несколько компиляторов запуская определенный батник собирать проекты различными компиляторами и используя различные библиотеки... не коверкая системный PATH каждый раз. ![]() ведь надо как-то отлаживать программу и при этом не кидать каждый раз dll-ки в debug.. и не будешь кидать их в дебуг, пропишешь путь к ним в PATH в батнике и должно заработать. впрочем если я что то перепутал то простите. завтра с работы могу кинуть свои батники если надо. |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 6.4.2025, 15:02 |