连接Qt GUI与TCL应用程序

Connecting Qt GUI with TCL application

本文关键字:TCL 应用程序 GUI Qt 连接      更新时间:2023-10-16

我有一个Qt GUI和另一个使用TCL解释器与用户通信的应用程序。

我希望Qt和应用程序共享在应用程序中创建的信息,并在GUI中显示。这就是为什么我需要它们是同一个进程的线程(它们之间共享一个指针)。

另外,我希望Qt产生字符串,这些字符串将通过控制台发送到另一个线程中的TCL(应用程序)。

我怎样才能进行这种交流?

我的想法是改变TCL解释器stdin为Qt控制台的stdout,但我不知道如何做到这一点!

在Tcl应用程序的本地主机接口上创建一个网络套接字,并侦听来自Qt应用程序的命令(参见socketfileeventinfo complete)。我建议您处理从解释器(interp create)中接收到的命令,以便您可以轻松地对远程应用程序允许的命令进行沙箱处理。要将字符串传递给Tcl应用程序,Qt应用程序只需发送到套接字即可。要接收数据,请发送请求该数据的命令并读取响应。如果确保只打开本地主机接口上的侦听套接字,就可以消除大多数安全问题。如果遇到问题,可以考虑添加tls,或者安排读取命名管道。有很多可能的进程间通信的可能性,但通常套接字是最灵活的。

如果要捕获Tcl解释器的标准输出(和标准错误;),那么你必须在子进程中运行Tcl解释器,通过管道与外部基于Qt/c++的进程通信。(你应该能够找到如何做到这一点,一般通过搜索堆栈溢出…)

Tcl特定的细节:您将真的要确保Tcl解释器做:

fconfigure stdout -buffering line

这是因为在非交互模式下(例如在管道上使用时),Tcl对其标准输出使用完全缓冲。您需要行缓冲(或者对于未缓冲的输出可能是none),以便您可以在输出值时立即看到它们。

您可能还想运行自定义REPL(假设Tcl 8.5或8.6):

fconfigure stdout -buffering line
while {[gets stdin line] >= 0} {
    set code [catch $line msg opt]
    puts [list $code $msg $opt]
}

将结果写回的方式是一个Tcl列表(通常不太难解析),其中包含结果代码(通常为0表示OK或1表示ERROR),结果消息/数据,以及一个键/值字典,该字典描述了额外的"有趣"内容,如错误情况下的堆栈跟踪。