首页 > 其他分享 >QT&TCL1 调用TCL解释器

QT&TCL1 调用TCL解释器

时间:2023-10-22 15:32:37浏览次数:29  
标签:解释器 QT TCL1 TCL C++ Tcl tcl

TCL作为一种工具语言已经在很多地方得到广泛的应用,在土木方面著名的例子就是ANSYS了。当然作为UCB开发的OpenSees自然也是要用自家的TCL语言了,不过最新的OpenSees源代码中已经增加了对于Python语言的支持。虽然官方尚没有公开Python的使用方式,但是相信应该很快就可以看到使用Python语言建立OpenSees模型了。OpenSees作为一个C++编写的软件,如果用C++实现一个类似于ANSYS中的APDL语言,会大大增加工作量,因此在使用TCL语言建模时需要调用TCL解释器对tcl脚本进行解析,这也是在安装OpenSees的时候需要先安装tcl/tk的原因。 

如果有同学安装了Python的集成包,比如Anaconda或者Winpython之类,就会发现不需要安装tcl/tk就可以运行OpenSees了,我自己的电脑就没有安装OpenSees官网提供的tcl/tk安装程序而能够直接运行64位的OpenSees。为了能够自己实现C++中调用TCL解释器,首先还是要安装一下ActiveTcl的,我自己安装的是32位ActiveTcl,这并不影响我电脑运行64位的OpenSees,因为OpenSees调用的是Anaconda中64为的tcl86.dll。

回归主题,因为我自己使用的是32为gcc编译器,因此为了比较好的继承性,我直接下载了32位的ActiveTcl,下载地址可以从ActiveTcl官网找到,这里给一个ActiveTcl 8.5的下载链接:点击下载

PS:目前最新的ActoveTcl是8.6,64位(20230719)

下载之后直接安装到C:\Program Files\Tcl目录下即可,打开Qt Creator新建一个Project:


QT&TCL1 调用TCL解释器_tcl

选择Qt Console Application,因为我只是建立一个测试程,选择Choose…后设置项目的名称和路径:


QT&TCL1 调用TCL解释器_tcl_02

完成之后需要做一件重要的事情就是将Tcl目录下的include和lib复制到工程文件夹E:\QT\tcltest\tcltest下并从新命名为tcltkinclude和tcltklib:

QT&TCL1 调用TCL解释器_tcl_03

C++(QT)调用TCL解释器

QT&TCL1 调用TCL解释器_tcl_04

C++(QT)调用TCL解释器

然后回到Qt Creator中右键工程文件夹,选择添加库…:

QT&TCL1 调用TCL解释器_tcl_05

C++(QT)调用TCL解释器

选择外部库:

QT&TCL1 调用TCL解释器_tcl_06

C++(QT)调用TCL解释器

在外部库的设置页面,选择tcktklib中的tcl85.lib,链接选择动态,将“为debug版本添加‘d’作为后缀”选项去掉,点击下一步完成添加:

QT&TCL1 调用TCL解释器_tcl_07

C++(QT)调用TCL解释器

这时候pro文件中自动增加了tcl85的库文件,但是还缺少头文件的位置,因此增加INCLUDEPATH += $$PWD/tcltkinclude到pro文件中去,这样pro文件应该与下面一致:

QT += coreQT -= gui CONFIG += c++11TARGET = tcltestCONFIG += consoleCONFIG -= app_bundleTEMPLATE = appSOURCES += main.cpp INCLUDEPATH += $$PWD/tcltkinclude unix|win32: LIBS += -L$$PWD/tcltklib/ -ltcl85 INCLUDEPATH += $$PWD/tcltklib DEPENDPATH += $$PWD/tcltklib

然后回到main.cpp直接Ctrl+R运行一下,如果没有出错会出现一个黑框框。然后在main.cpp中增加include “tcl.h”,这样在主文件中输入Tcl_就可以看到Qt Creator的智能提示了:


QT&TCL1 调用TCL解释器_tcl_08

C++(QT)调用TCL解释器

这样环境就部署好了,下面先创建一个test.tcl文件,文件的路径为E:\QT\tcltest\tcltest\test.tcl:

QT&TCL1 调用TCL解释器_tcl_09

C++(QT)调用TCL解释器

在main.cpp中写入下面的语句:

#include <QCoreApplication>#include <iostream>#include "tcl.h"using namespace std; int main(int argc, char *argv[]){ QCoreApplication a(argc, argv); Tcl_Interp *interp = Tcl_CreateInterp(); int Res; const char *detail; Res = Tcl_EvalFile(interp, "E:/QT/tcltest/tcltest/test.tcl"); detail = Tcl_GetStringResult(interp); if (Res != TCL_OK) { cout<<"Failed!"<<endl; cout<<detail<<endl; } else { cout<<"Success!"<<endl; } Tcl_DeleteInterp(interp); return a.exec(); }

稍微解释一下,需要先生成一个解释器实例,Tcl_CreateInterp()用于创建这个实例并返回Tcl_Interp *的指针。具体可以参看Tcl的C接口帮助文档,然后使用了两个函数Tcl_EvalFile()和Tcl_GetStringResult()。

Tcl_EvalFile()需要两个参数,第一个是解释器的指针,即刚才创建的interp这个指针, 第二个为文件路径,注意在Qt中需要使用正斜杠/代替Windows的反斜杠\,否则会出错。Tcl_EvalFile()会返回一个下面之一的整数表示执行结果:

  • 0 (TCL_OK)
  • 1 (TCL_ERROR)
  • 2 (TCL_RETURN)
  • 3 (TCL_BREAK)
  • 4 (TCL_CONTINUE)

Tcl_GetStringResult()可以从解释器接受解释器的信息,这个信息不是程序中的输出信息,是解释器解释tcl失败的原因,可以用来辅助调试。

这里我用没有用qDebug()而是直接用了cout输出到控制台,直接使用Ctrl+R执行之后就可以看到黑框框里面直接输出“orycho”和“Success!”表明调用tcl解释器成功:

QT&TCL1 调用TCL解释器_tcl_10

C++(QT)调用TCL解释器

至此,成功在C++中调用TCL解释器对tcl文本文件进行解释。

标签:解释器,QT,TCL1,TCL,C++,Tcl,tcl
From: https://blog.51cto.com/u_12597366/7977261

相关文章

  • QT中的线程池的介绍和使用
    (文章目录)前言本篇文章将为大家讲解一下QT中线程池的概念和使用的方法。一、线程池概念讲解线程池是一种常见的并发编程模型,用于管理和复用多个线程来执行任务。它的基本思想是在应用程序启动时创建一组线程,这些线程可以重复使用,以执行一系列的任务,而不需要为每个任务都创建......
  • Qt调用Opencv
    使用QtCreator调用opencv一、构建套件在构建套件之前,需正确安装VisualStudio和WindowsSDK当正确安装后,一般情况下,在QtCreator会自动识别到VS的编译器和调试器,并会自动构建好。若调试器未能自动识别,可自行找到相关的安装路径(cdb.exe文件),然后添加,自行命名好即可。图......
  • TCL脚本语言学习
    前言  TCL(ToolCommandLanguage)命令的格式是命令+字符串,第一个是命令,后面都是字符串,tcl的解释器(逐行执行)会根据命令去对后面的字符串进行相关操作。注释符号:#一、安装启动tcl命令行,以%开头sudoaptinstalltcl//安装tcltclsh//启动tcl%二、变量列表1、置换subtitutio......
  • QT 菜单中添加Qcheckbox复选框
    //回放autowidget=newQWidget;{autocheckbox=newQCheckBox("回放");autolayout=newQHBoxLayout;layout->addWidget(checkbox);layout->setContentsMargins(5,1,5,1);widget->setLayout(l......
  • QT cmake工程使用QXlsx源码操作execl,无需编译QXlsx,也不需要下载其他东西,windows和ubu
    一、下载地址:链接二、进入下载好的QXlsx目录下,取出QXlsx目录和README.md待用三、用qt创建一个简单的cmake工程,将QXlsx目录和README.md文件放到cmakelists.txt所在目录 四、修改cmakelists.txt文件cmake_minimum_required(VERSION3.5)project(xlsxTestLANGUAGESCXX)......
  • python3.12安装pyqt6教程
    1.开发环境:win11,Pycharm2023.2.32.python版本:Python3.12.03.Installationpackage#python.exe-mpipinstall--upgradepip#pipinstallxlrd#pipinstallxlwt#pipinstallpyserial#pipinstallturtle==0.0.1下载2个包文件然后安装https://github.com/altendky......
  • 安装arm银河麒麟及Qt5.12.1
    一、安装银河麒麟虚拟机:qemu虚拟机安装银河麒麟V10arm架构系统桌面版_陆星材的博客-CSDN博客安装完(试用版)之后,点击桌面的“安装Kylin”图标,安装银河麒麟系统。将命令后面的“,drive=cdrom”删掉。执行即可打开麒麟系统。二、编译Qt5.12.1源码:教程1银河麒麟V10+飞腾CPU......
  • QT mocs_compilation.cpp 中出现多重定义问题
     在qt自动生成moc时,报自动生成的cpp中的方法重定义redefinitionof‘constQMetaObject*xxx::metaObject()const’等等查看mocs_compilation.cpp 发现其中有两行一样的cpp,这种情况大家可能会第一时间去排查是不是.h文件被包含了两次,但是发现.h文件都是#ifndef了的这种......
  • Qt 样式表
    qtabwidget样式表QWidget{background-color:rgb(108,117,125,65);}QTabBar::tab{font-family:Consolas;/*设置tab中的文本的字体*/max-width:150px;min-width:120px;min-height:20px;font:14px;color:rgb(108,117,125,......
  • Qto_BuildingBaseQuantities
    Qto_BuildingBaseQuantities建筑基准数量:建筑的所有引用的定义中通用的基准数量。   NameTypeDescriptionHeightQ_LENGTHFirsthöhe楼层的系统高度,从未加工天花板的上边缘到上层未加工天花板上边缘测量。仅当存在恒定高度时指定。Height该建筑的标准......