元始天尊 发表于 2014-2-19 19:27:26

qq空间老贴转载-QT与matcom结合的实例

matcom和vs兼容但是和qt有些不兼容,网上也没有解决方法,但是经我实践,最后成功了。整个过程如下:
      ① 安装qt和matcom。
      ②先用qtcreator4.7.4建立一个QT gui应用,我命名为another,把matcom的v4501v.lib和matlib.h加入工程根目录。
      ③将matlib.h文件拖入工程,这样就加上了头文件,右击another工程列表树最根处,在右键菜单中选添加库,弹出对话框,选择外部库,将v4501v.lib加进去。完成后在pro文件中,会是类似如下的结果:
#
# Project created by QtCreator 2013-04-24T13:30:40
#
#-------------------------------------------------
QT+= core gui

TARGET = another
TEMPLATE = app

SOURCES +=
            main.cpp\mainwindow.cpp

HEADERS+=
            mainwindow.h

FORMS+=
            mainwindow.ui

HEADERS += \
               matlib.h
win32:CONFIG(release, debug|release):LIBS += -L$$PWD/ -lv4501v
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/ -lv4501vd

这里由于matcom没有用来调试的v4501vd.lib及v4501vd.dll,因此我们把那个d去掉
PS:(这点灵活应变的能力普通编程人员应该具备的!!!无论干什么事,都是要摸索一番的,哪有那么一帆风顺的) void MainWindow::on_pushButton_clicked(){   
   Mm m_h,m_data,m_h1,m_data1;   
   initM(MATCOM_VERSION);   
   m_h=winaxes(winId());//这里改成和mfc的m_hWnd相应的 ,书上代码的m_hWnd是vc的 ,qt当然要变通一下
   axesposition(10,10,100,100);   
   double bounddata={0.2*3.1415926,-1,1};   
   Mm mbound;   
   M_VECTOR(mbound,bounddata);   
   title((CL(TM("SIN函数图形"))));   
   xlabel((CL(TM("x"))));   
   ylabel((CL(TM("y"))));   
   set(m_h,(CL(TM("Color")),TM("black")));   
   set(m_h,(CL(TM("Box")),TM("on")));   
   Mm x,y;
   x=linspace(0,2*pi,100);   
   y=msin(x);   
   m_data=y;   
   plot((CL(m_data),TM("y")));   
   m_h1=winaxes(winId());   
   Mm pos;   
   pos=(BR(240),240,200,200);   
   set(m_h1,TM("RealPosition"),pos);   
   Mm color;   
   color=zeros(1,3);   
   color.r(1)=0;
   color.r(2)=0;
   color.r(3)=0;   
   set(m_h,TM("color"),color);   
   m_data1=randn(1,50);   
   plot((CL(m_data1),TM("b")));   
   double* phandle=NULL;   
   phandle=m_h1.addr();   
   int nrow,ncol;   
   nrow=m_h1.rows();   
   ncol=m_h1.cols();   
   title(CL(TM("当前的图形")));
}          ④在mainwindow.cpp中加入#include "matlib.h" (一定要放在#include "mainwindow.h" #include "ui_mainwindow.h" 之后),加入一个按钮控件,在clicked事件中加入代码如下,这里的例子为《精通Matlab与C C++ 溷合程序设计 第2版》第7章的7.7.2的实例2:
      编译以后得到如下错误(如果你有其他错误的话我就没办法了):
         d:\temp\another\matlib.h:2867: 错误:C2375: “abs”: 重定义;不同的链接
         此错误看字面意思应该是qt自身定义的函数与matlib.h中的函数冲突,于是我选择将matlib.h里所有这种冲突函数注释掉,结果如下: //#if !defined(_MSC_VER) | (_MSC_VER>=1100)
//m_type DLLI abs(m_type x);
//#endif
//m_type DLLI fix(m_type x);
//m_type DLLI log2(m_type x);
。。。
;//m_type DLLI round(m_type x);
//m_type DLLI sign(m_type x); 此时再构建则可运行成功,成功后会出现一个正弦图和另一个曲线图

watermelon 发表于 2019-3-19 11:53:59

厉害了,小弟刚刚发现原来还有一个这么方便的matcom,而我还在玩QtCharts
页: [1]
查看完整版本: qq空间老贴转载-QT与matcom结合的实例