• 15492阅读
  • 20回复

[提问]Qt编写的子界面动态库,如何被VC、DELPHI等调用? [复制链接]

上一主题 下一主题
离线xp2009
 

只看楼主 正序阅读 楼主  发表于: 2014-06-09
这个子界面用的是QGraphicsView编写的,要求被嵌入到VC、Delphi的父窗体中

现在的问题是Qt自己的QApplication消息循环似乎阻塞了VC程序自己的CWinApp消息循环,导致程序卡死,子窗体显示不出来。

查阅了很多资料,官方有qtwinmigrate可以解决QT和MFC混合编译的问题,但是官方的文档,完全没看懂,特别是要求用cmd命令行那一块,就是link aginst qt libary完全没看懂,也不知道正确怎么操作。

导致我用Qt Creator,里面想声明一个MFC的CString、CWinApp变量都不行。

目前用的Qt是QT5.2。

我的目的是实行一个i通用性的跨平台的矢量图画板程序,现在领导的意思叫我直接用QPainter,类似于直接使用GDI等工具

但是我不知道怎么对WINDOWS、Linux、UNIX、MAC OS等系统底层消息、事件进行抽象及封装。

领导的意思是叫我看QT是如何实现跨平台的,叫我直接移植QT系统跨平台和绘图引擎这部分源代码,然后可以使用任何的C++编译器都能编译成自己的程序。

这弄得来我头的大了,感觉技术难度实在太大了,我觉得我还是先把QGraphicsView编写的子界面在VC、DELPHI下调用出来、正常使用再说吧
离线ysu533

只看该作者 20楼 发表于: 2014-06-21
回 xp2009 的帖子
xp2009:感谢以上各位的耐心解答,改为VS2008+QT4.8.6,就可以编写ActiveX控件,供其他Windows平台的exe调用 (2014-06-19 10:49) 

对头的, windows平台使用 ActiveX 控件是最简单的.
离线cnhemiya

只看该作者 19楼 发表于: 2014-06-20
回 hp_201111 的帖子
hp_201111:ps:好像delphi可以写出c形式的函数。
不明白!
....... (2014-06-19 15:08) 

c压栈方式的函数。c和pascal的函数的参数入栈的先后顺序不一样。
离线hp_201111

只看该作者 18楼 发表于: 2014-06-19
回 cnhemiya 的帖子
cnhemiya:[图片]
以前c++builder写的SetParent函数的测试程序
不管是vc的mfc,cb delphi的vcl,qt的库,最底层都是用的windows的api。它们之间虽然上层的封装形式不同,但是最底层的windows api的调用规则都是一样的,都是遵循windows api的调用规则。
....... (2014-06-18 12:40)

ps:好像delphi可以写出c形式的函数。


不明白!
离线sevencat

只看该作者 17楼 发表于: 2014-06-19
用qtwinmigrate里面的方法应该是可以的。
战争就是和平,自由就是奴役,愚味就是力量
离线xp2009

只看该作者 16楼 发表于: 2014-06-19
感谢以上各位的耐心解答,改为VS2008+QT4.8.6,就可以编写ActiveX控件,供其他Windows平台的exe调用
离线cnhemiya

只看该作者 15楼 发表于: 2014-06-18
窗口缩放器.rar (45 K) 下载次数:7
以前c++builder写的SetParent函数的测试程序

不管是vc的mfc,cb delphi的vcl,qt的库,最底层都是用的windows的api。它们之间虽然上层的封装形式不同,但是最底层的windows api的调用规则都是一样的,都是遵循windows api的调用规则。

它们之间的混合使用只要只使用winndows api和动态调用c的函数就应该没问题。
ps:好像delphi可以写出c形式的函数。因为pascal和c,参数的压栈规则是不一样的。
离线foxgod

只看该作者 14楼 发表于: 2014-06-10
回 dbzhang800 的帖子
dbzhang800:这个说法是不对的。首先Qt 和 VC 不是对等的概念,或者你的VC是特指 MFC?
Qt 和 MFC 是对等的,二者都是对系统API的封装,二者混合编程,考验的主要是对系统API掌握的的功底。GUI程序需要有事件循环,不管是Qt提供,还是MFC提供,稍微深入一下,调用的都是Windows的同一个API接 .. (2014-06-09 21:02) 

可是我以前用QT编的DLL,在MFC里面调用的时候,不行,我 把QT的工程导入到VS2010里面,再次编译成动态库,是可以调用的。
离线xp2009

只看该作者 13楼 发表于: 2014-06-10
不好意思,网页出了点问题,导致9-12楼重复提交了
离线xp2009

只看该作者 12楼 发表于: 2014-06-10

版主,现在遇到新的问题

我想在VS2008下静态编译QT,我有个以前搭建的VS2008+QT4.4的环境,能正常编译QT代码

然后,我下载的qtwinmigrate里面有个configure.bat,但是用cmd运行后没有反映,而且也没有生成我想要的lib文件,然后查了VS2008静态编译QT的一些资料,也没有说怎么单独编译一个后期增加的QT源代码

还有就是对qt的configure.exe和qmake等指令不熟悉
离线xp2009

只看该作者 11楼 发表于: 2014-06-10
版主,现在遇到新的问题

我想在VS2008下静态编译QT,我有个以前搭建的VS2008+QT4.4的环境,能正常编译QT代码

然后,我下载的qtwinmigrate里面有个configure.bat,但是用cmd运行后没有反映,而且也没有生成我想要的lib文件,然后查了VS2008静态编译QT的一些资料,也没有说怎么单独编译一个后期增加的QT源代码

还有就是对qt的configure.exe和qmake等指令不熟悉
离线xp2009

只看该作者 10楼 发表于: 2014-06-10
版主,现在遇到新的问题

我想在VS2008下静态编译QT,我有个以前搭建的VS2008+QT4.4的环境,能正常编译QT代码

然后,我下载的qtwinmigrate里面有个configure.bat,但是用cmd运行后没有反映,而且也没有生成我想要的lib文件,然后查了VS2008静态编译QT的一些资料,也没有说怎么单独编译一个后期增加的QT源代码

还有就是对qt的configure.exe和qmake等指令不熟悉
离线xp2009

只看该作者 9楼 发表于: 2014-06-10
版主,现在遇到新的问题

我想在VS2008下静态编译QT,我有个以前搭建的VS2008+QT4.4的环境,能正常编译QT代码

然后,我下载的qtwinmigrate里面有个configure.bat,但是用cmd运行后没有反映,而且也没有生成我想要的lib文件,然后查了VS2008静态编译QT的一些资料,也没有说怎么单独编译一个后期增加的QT源代码

还有就是对qt的configure.exe和qmake等指令不熟悉
离线cnhemiya

只看该作者 8楼 发表于: 2014-06-10
SetParent - 函数功能
函数功能:该函数改变指定子窗口的父窗口。
函数原型:HWND SetParent(HWND hWndChild,HWND hWndNewParent)
离线cnhemiya

只看该作者 7楼 发表于: 2014-06-10
我以前用c++builder,写过那个嵌入窗口的api的测试例子。可以嵌入vc写的程序窗口,但是只是简单显示没有任何数据交互。
离线cnhemiya

只看该作者 6楼 发表于: 2014-06-10
回 xp2009 的帖子
xp2009:版主我现在就是用QT写的一个标志C++动态库,用的exter "C"导出的动态库函数,里面再调用的QGraphicsView的相关东西。
现在的问题是QGraphicsView实现的子窗体,想嵌套在VC的父窗体里,例如是个MFC的一个VIEW,发现在OnCreate函数中调用DLL的导出函数直接卡死了。
... .. (2014-06-09 14:05) 

mfc方面没接触过这方面不熟。我就没用过vc
1、首先测试不嵌入QGraphicsView实现的子窗体,看能不能正常调用和显示。
就是简单的调用一下c dll的函数,然后直接显示QGraphicsView窗口。如果正常看2。
2、用win api有个findwindow什么的函数,找到QGraphicsView窗体句柄,还有个
win api函数可以把任意窗口做为子窗口嵌入到另一个窗口中,具体这个api不记得了。。。
百度能搜到这个api
离线dbzhang800

只看该作者 5楼 发表于: 2014-06-09
回 foxgod 的帖子
foxgod:QT编的DLL。早VC里面不可用,VC编的DLL。在QT里面也不可以用。 (2014-06-09 16:52) 

这个说法是不对的。首先Qt 和 VC 不是对等的概念,或者你的VC是特指 MFC?

Qt 和 MFC 是对等的,二者都是对系统API的封装,二者混合编程,考验的主要是对系统API掌握的的功底。GUI程序需要有事件循环,不管是Qt提供,还是MFC提供,稍微深入一下,调用的都是Windows的同一个API接口,其他也是这样。
离线foxgod

只看该作者 4楼 发表于: 2014-06-09
QT编的DLL。早VC里面不可用,VC编的DLL。在QT里面也不可以用。
离线xp2009

只看该作者 3楼 发表于: 2014-06-09
回 cnhemiya 的帖子
cnhemiya:领导的意思是叫我看QT是如何实现跨平台的,叫我直接移植QT系统跨平台和绘图引擎这部分源代码,然后可以使用任何的C++编译器都能编译成自己的程序。
这个难度太大,不要考虑了。
QGraphicsView编写的子界面在VC、DELPHI下调用出来、正常使用再说吧。
写个dll通过动态方式(函数名 .. (2014-06-09 12:01) 

版主我现在就是用QT写的一个标志C++动态库,用的exter "C"导出的动态库函数,里面再调用的QGraphicsView的相关东西。

现在的问题是QGraphicsView实现的子窗体,想嵌套在VC的父窗体里,例如是个MFC的一个VIEW,发现在OnCreate函数中调用DLL的导出函数直接卡死了。

查资料说是需要用QT的QMfcApp的Run代替MFC的CWinApp的Run,用QT的消息循环取代MFC的消息循环。

现在的情况就是想混合编译,就是不知道怎么正确搭建这个环境。
离线cnhemiya

只看该作者 2楼 发表于: 2014-06-09
发布的程序也要包含Qt的dll模块
离线cnhemiya

只看该作者 1楼 发表于: 2014-06-09
领导的意思是叫我看QT是如何实现跨平台的,叫我直接移植QT系统跨平台和绘图引擎这部分源代码,然后可以使用任何的C++编译器都能编译成自己的程序。
这个难度太大,不要考虑了。

QGraphicsView编写的子界面在VC、DELPHI下调用出来、正常使用再说吧。
写个dll通过动态方式(函数名)调用标准c函数,数据交互什么的也都是c的类型,类型和数据交互不要包含任何c++和Qt的东西。这样vc下最起码没问题了,delphi我记得动态调用(函数名)c的dll还是很方便的。
快速回复
限100 字节
 
上一个 下一个