Russian Qt Forum

Qt => Установка, сборка, отладка, тестирование => Тема начата: Гурман от Март 13, 2014, 10:48



Название: Очередной вопрос про ежа и ужа - скрестить Qt с... C#/.NET
Отправлено: Гурман от Март 13, 2014, 10:48
Такая вот хрень может потребоваться... Группа делает специализированную СУБД для хранения результатов физических измерений, с генераторами отчетов, построением печатаемых графиков и прочей ерундой. В группе программисты C#/.NET, никто Qt не знает. А мне надо сделать управление измерительными приборами, сбор и первичную обработку, и динамическую визуализацию всяких параметров типа осциллограмм и пр., а также использовать предыдущие наработки, сделанные с использованием Qt. Группа работает на VisualStudio.

Есть ли и у кого-либо какой-либо опыт скрещивания C# программ с Qt, пусть хотя бы в VS? Что вообще нужно, чтобы Qt можно было использовать с C++ компилятором Microsoft? Сорри за боян, но я в эту сторону вообще не смотрел - всегда работаю в Креаторе с GNU-компиляторами.

Вариант обмена данными через IP-сокеты не хляет, это слишком муторно, и не подходит для задачи. Нужно, чтобы функционал на Qt содержался в динамически загружаемой библиотеке, функции которой можно было бы вызывать из C# программ, хотя бы, через extern "C" врапперы. И возможно, наоборот, потребуется вызывать что-то из главной программы на С# внутри Qt библиотеки. Засунуть Qt внутрь динамической библиотеки у меня вполне получилось, такое приложение сделано, протестировано и сдано. Но там библиотека подшивалась к С++ приложению, которое тоже компилировалось GNU. По поводу C# я не знаю почти ничего, как это вообще можно реализовать и можно ли, с учетом, что там программы работают в виртуальной машине.


Название: Re: Очередной вопрос про ежа и ужа - скрестить Qt с... C#/.NET
Отправлено: Hellraiser от Март 13, 2014, 11:46
Qt с MSVS дружат, для удобства надо поставить аддон от Digia. Библиотек вполне достаточно уже готовых, для 2010 и 2012. А взаимодействие с C# проще, на мой взгляд, посредством ActiveQt.


Название: Re: Очередной вопрос про ежа и ужа - скрестить Qt с... C#/.NET
Отправлено: kambala от Март 13, 2014, 12:43
Цитировать
Что вообще нужно, чтобы Qt можно было использовать с C++ компилятором Microsoft?
как минимум — скачать соответствующую версию библиотеки либо собрать самому с помощью майкрософтовского компилятора


Название: Re: Очередной вопрос про ежа и ужа - скрестить Qt с... C#/.NET
Отправлено: Гурман от Март 13, 2014, 12:49
взаимодействие с C# проще, на мой взгляд, посредством ActiveQt.
Ну... не совсем то, что хотелось бы, но что-то так можно соорудить. Очевидно, мой код надо будет оформить, как ActiveX сервер, чтобы основное приложение к нему обращалось. Так уж спроектировали, что основным приложением будет СУБД, хотя это, конечно, глупость - просто руководитель группы ни с чем, кроме СУБД, работать не умеет толком.

Но мне не вполне ясно пока, как обращаться обратно. Колбэки то они мне передать не могут. Или придется им городить у себя ActiveX контролы, чтобы я к ним обращался через QAxObject?


Название: Re: Очередной вопрос про ежа и ужа - скрестить Qt с... C#/.NET
Отправлено: Гурман от Март 13, 2014, 12:51
Цитировать
Что вообще нужно, чтобы Qt можно было использовать с C++ компилятором Microsoft?
как минимум — скачать соответствующую версию библиотеки либо собрать самому с помощью майкрософтовского компилятора

собрать достаточно? какие-то специфичные настройки при этом нужны? их у MS много, и есть критичные - или всё уже предусмотрено?


Название: Re: Очередной вопрос про ежа и ужа - скрестить Qt с... C#/.NET
Отправлено: kambala от Март 13, 2014, 13:24
дефолтная конфигурация вполне нормальная. ненужные модули можно не собирать естественно.

например когда-то я Qt 5.0 для студии 2012 конфигурировал так:
Код:
configure -prefix %CD%\qtbase -platform win32-msvc2012 -debug-and-release -force-debug-info -opensource -confirm-license -c++11 -ltcg -fast -opengl desktop -incredibuild-xge -no-accessibility -no-dbus -no-audio-backend -no-qml-debug -saveconfig win -nomake examples -nomake demos -nomake tests -mp -sse2 -ssse3 -sse4.1 -sse4.2
nmake module-qtdoc module-qtimageformats module-qttools module-qttranslations


Название: Re: Очередной вопрос про ежа и ужа - скрестить Qt с... C#/.NET
Отправлено: Hellraiser от Март 13, 2014, 13:50
Но мне не вполне ясно пока, как обращаться обратно. Колбэки то они мне передать не могут. Или придется им городить у себя ActiveX контролы, чтобы я к ним обращался через QAxObject?
Так что все-таки требуется? Надо написать на Qt библиотеку, к которой должны обращаться программы С#, или самому подключиться и взаимодействовать с сервером автоматизации?


Название: Re: Очередной вопрос про ежа и ужа - скрестить Qt с... C#/.NET
Отправлено: Гурман от Март 13, 2014, 15:10
Но мне не вполне ясно пока, как обращаться обратно. Колбэки то они мне передать не могут. Или придется им городить у себя ActiveX контролы, чтобы я к ним обращался через QAxObject?
Так что все-таки требуется? Надо написать на Qt библиотеку, к которой должны обращаться программы С#, или самому подключиться и взаимодействовать с сервером автоматизации?

Надо написать библиотеку, в которой есть функции проведения измерений и некоторой первичной обработки, визуализации текущих полученных данных. Основное приложение (СУБД) будет обращаться к этим функциям за получением измеренных данных, совать их в базы, считать статистику, печатать отчеты. Но при этом из библиотеки могут быть обращения к основному приложению, ну например, чтобы при визуализации какого-нибудь параметра получить от основного приложения среднее значение параметра за день-неделю-месяц-год-десятилетие и отобразить вместе с текущим. То есть, заранее из основного приложения все значения из базы, которые могут потребоваться при визуализации, передать нельзя, потому как заранее неизвестно, какие будут нужны и сколько. Тем более, что измерительная библиотека - тоже модульная, подключили новый прибор, для него подключили DLLку, у неё свои потребности, которые заранее предусмотреть невозможно.

Понятно, что это результат кривого проектирования, когда основным приложением является СУБД, и в неё запихнуты функции, которых там не должно быть - но так уже пошло-поехало... По мне, так я бы вообще всё только на Qt сделал, и ровно наоборот - основное приложение меряет и обращается к СУБД когда требуется сохранить полученные данные или получить какие-то средние, а база тупо хранит, может посчитать статистику и отчет напечатать. Но увы, зав. зоопарком сказал - надо скрестить ежа и ужа.


Название: Re: Очередной вопрос про ежа и ужа - скрестить Qt с... C#/.NET
Отправлено: Hellraiser от Март 13, 2014, 15:18
А нельзя, чтобы основное приложение само передавало данные в библиотеку? Тогда надо будет создать класс, унаследованный от QObject, определить в нем публичные слоты (через которые основное приложение будет передавать столь необходимую для работы класса информацию) и сигналы (через которые созданный класс будет оповещать и передавать результаты измерений / обработки в основное приложение). В ином случае, основное приложение тоже придется делать контроллером автоматизации, что в случае с базой данных будет, на мой взгляд, слегка геморройно.


Название: Re: Очередной вопрос про ежа и ужа - скрестить Qt с... C#/.NET
Отправлено: Гурман от Март 13, 2014, 15:31
А нельзя, чтобы основное приложение само передавало данные в библиотеку?

Я же говорю - неизвестно заранее, какие именно данные, сколько и когда могут потребоваться измерительной библиотеке из базы. То есть, нельзя.


Название: Re: Очередной вопрос про ежа и ужа - скрестить Qt с... C#/.NET
Отправлено: Hellraiser от Март 13, 2014, 15:34
А что мешает, в таком случае, самому классу библиотеки обратиться к базе и выбрать из нее необходимые данные?


Название: Re: Очередной вопрос про ежа и ужа - скрестить Qt с... C#/.NET
Отправлено: Гурман от Март 13, 2014, 15:39
А что мешает, в таком случае, самому классу библиотеки обратиться к базе и выбрать из нее необходимые данные?

Тут уже не что, а кто - начальник базы.  :D То есть, руководитель группы, делающей СУБД.


Название: Re: Очередной вопрос про ежа и ужа - скрестить Qt с... C#/.NET
Отправлено: Hellraiser от Март 13, 2014, 15:50
Маленькое уточнение - наверно, все-таки не СУБД, а клиентскую программу, взаимодействующую с СУБД?


Название: Re: Очередной вопрос про ежа и ужа - скрестить Qt с... C#/.NET
Отправлено: Johnik от Март 13, 2014, 22:23
в примерах Qt есть маленький проект написанный на смеси: managed C++ и Qt
qt5: src/qtactiveqt/examples/activeqt/dotnet
qt4: src/examples/activeqt/dotnet

Статья "Управляемый С++" (http://www.rsdn.ru/article/dotnet/mcpp.xml) может быть сможет помочь, по крайней мере разобраться в вышеприведенном коде.
Так же может пригодиться статья: "Взаимодействие .NET с неуправляемым кодом" (http://www.rsdn.ru/article/dotnet/netTocom.xml).


Название: Re: Очередной вопрос про ежа и ужа - скрестить Qt с... C#/.NET
Отправлено: Гурман от Март 14, 2014, 08:02
в примерах Qt есть маленький проект написанный на смеси: managed C++ и Qt
qt5: src/qtactiveqt/examples/activeqt/dotnet
qt4: src/examples/activeqt/dotnet

да, нашел, там много полезного, есть мануалы, типа

qt-project.org/doc/qt-5.0/activeqt/activeqt-dotnet.html

но по-прежнему пока не ясно, как строить взаимодействие, чтобы вызовы были двунаправленными


Название: Re: Очередной вопрос про ежа и ужа - скрестить Qt с... C#/.NET
Отправлено: pilot.net от Май 03, 2014, 06:37
не понятно что значить "чтобы вызовы были двунаправленными"
я делал просто
в хашнике
Код
C++ (Qt)
#using "System.dll"
#using "System.Data.dll"
 
using namespace System;
using namespace System::Data;
 
в .cpp
Код
C++ (Qt)
gcroot<System::String^>  string  = gcnew System::String()