找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 4269|回复: 8

我的第一个GUI程序

[复制链接]
发表于 2018-10-30 01:09:03 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
本帖最后由 watermelon 于 2018-11-1 15:01 编辑

前两天老师要我们来翻译英文文献,我下载了有道翻译的软件,发现它在进行翻译文档,翻译完毕以后是要花5元钱来导出文档的,我想这个也太.....。
所以小弟我就想自己写一个简单的借助有道翻译引擎来翻译的GUI程序。

我之前有接触过Qt5,做界面我比较喜欢Qt5(对初学者很友好),翻译的引擎用的有道翻译,使用python脚本爬下来,然后把python脚本嵌入到C++中。
说实话这个嵌入还是很有意思的,python3中把slot当做关键字,而Qt中的SLOT和slots也是有意义的,所以还要小小的改动一下。在嵌入过程中发现
使用fanyi.py这个脚本的函数和使用DLL中的导出函数的步骤很像。由于python无处不对象,所以在混编的时候还要对参数进行整合传给python,然后
解析传出来给C++写的界面用。

期间还有一个很有意思的事情,就是在选择要翻译的文件的时候,信号要选择triggered,而不是clicked,因为自定义的信号与槽在编译的时候会让clicked
信号作用两次,怪不得我之前一直是弹出两个对话框,我对自己调出这个bug还是很高兴的。

由于Qt做的程序在动态编译的情况下本来就不好打包发布(要携带很多dll),无论是windeployqt.exe还是静态编译,我还把python36.dll带上了,但是这两种方法
就是都没有办法在没有python的机器上运行,一点击“开始翻译”按钮就闪退,但是在自己的电脑上就运行的很好,这个就很恼火了。

最后我还是截几张图来纪念一下这个特殊的日子,UI的确我感觉也是挺丑的,下面我也会多看一些书籍来弥补这方面的知识的。
希望各位大佬多多指正。


README.txt内容:
  1. 1.由于本软件的编写用的Qt框架,C++,Python3.6混编,但是最后的exe真的出不来(真的恼火)。
  2. 无论是静态编译或者是动态编译后添加DLL文件,Python3.6总是会在按下“开始翻译”按钮的时候闪退。
  3. 但是在我的机器上是可以完美运行的(因为我有Python3.6的解释器)

  4. 2.本软件界面部分用的Qt框架,C++编写,核心是源文件translation中的fanyi.py文件,该文件用于爬取有道翻译网页版的翻译结果。

  5. 3.本软件仅供学习交流使用,严禁用于商业用途,最终解释权给网易-有道翻译所有。

  6. 4.由于python字符集和Qt字符集的问题,只能是英译中,并且英文中尽量不要出现标点(如果有也要是英文的),同时建议翻译的句子不要过大,以免降低翻译精准度。

  7. 5.希望各位大佬多多指正我,只有交流才会进行更好的发展。

  8. 6.协议的界面的左半部分图片和软件图标来自互联网,由于网络原因暂时无法找到原作者,深感抱歉,请原作者看到联系我(QQ:2015572934),侵权即删。

  9.                                                                 ---watermelon
复制代码




源码下载:https://github.com/trace-shadow/Watermelon_translate

协议

协议

选择文件

选择文件

翻译结果

翻译结果

程序图标 致敬Avicii

程序图标 致敬Avicii

Watermelon.zip

78.96 KB, 下载次数: 6

回复

使用道具 举报

发表于 2018-10-30 07:10:41 | 显示全部楼层
又见Qt
回复

使用道具 举报

 楼主| 发表于 2018-10-30 11:56:42 | 显示全部楼层

哈哈,谢谢站长鼓励
回复 赞! 靠!

使用道具 举报

 楼主| 发表于 2018-10-30 11:58:26 | 显示全部楼层
还是发一下调用python脚本的那段函数,真的和从dll中调用导出函数有相似的行为:
首先要#include <Python.h>
代码如下:
  1. //借助python脚本fanyi.py来进行翻译
  2. void MainWindow::use_youdao_translate()
  3. {
  4.     //初始化python模块
  5.     Py_Initialize();
  6.     if(!Py_IsInitialized())
  7.     {
  8.         QMessageBox::critical(NULL, "Error1", "Please get in touch with the Watermelon,sorry.",
  9.                               QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
  10.         return;
  11.     }

  12.     //导入fanyi.py文件
  13.     PyObject *pModule = PyImport_ImportModule("fanyi");
  14.     if(!pModule)
  15.     {
  16.         QMessageBox::critical(NULL, "Error2", "Please get in touch with the Watermelon,sorry.",
  17.                               QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
  18.     }

  19.     //获取fanyi模块中的get_translation_result函数
  20.     PyObject *pGTResult = PyObject_GetAttrString(pModule,"get_translation_result");

  21.     if(!pGTResult)
  22.     {
  23.         QMessageBox::critical(NULL, "Error3", "Please get in touch with the Watermelon,sorry.",
  24.                               QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
  25.     }


  26.     //开始调用get_translation_result函数
  27.     QString origin = ui->origin_textEdit->toPlainText();         //获取原文中的内容
  28.     //将换行符替换成*字符,因为原脚本只能爬取没有换行符的字符串
  29.     origin.replace('\n','*');

  30.     char *str = NULL;
  31.     QByteArray ba = origin.toLatin1();
  32.     str = ba.data();                          //将QString转化为char *

  33.     PyObject *pRet = PyObject_CallFunction(pGTResult,"s",str);

  34.     //获取python的返回值
  35.     char *res = NULL;
  36.     PyArg_Parse(pRet,"s",&res);

  37.     //将返回的结果转化成QString类型
  38.     QString result = res;
  39.     result.replace('*','\n');               //将输出格式换回来,我真聪明
  40.     ui->translate_textEdit->setPlainText(result);

  41.     //结束,释放python
  42.     Py_Finalize();
  43. }
复制代码

回复 赞! 靠!

使用道具 举报

发表于 2018-11-1 14:41:20 | 显示全部楼层
说起来有个问题,你的“协议”那个界面上的画,是你自己的吗?如果不是,你获得授权了吗?
回复 赞! 靠!

使用道具 举报

 楼主| 发表于 2018-11-1 14:57:43 | 显示全部楼层
0xAA55 发表于 2018-11-1 14:41
说起来有个问题,你的“协议”那个界面上的画,是你自己的吗?如果不是,你获得授权了吗? ...

报告,那个图不是我字节的,是网上的,不知道怎么获取授权,这么一说的确是有些欠妥,我还是把那个ReadMe.txt再改一下
回复 赞! 靠!

使用道具 举报

发表于 2019-5-10 20:03:14 | 显示全部楼层
还能这么玩的吗。
回复 赞! 靠!

使用道具 举报

 楼主| 发表于 2019-5-12 22:03:29 | 显示全部楼层

可以的,我建议不要Python混编程序了, 现在纯Python程序打包exe小弟我都搞萌比了,所以这个帖子如果纯Python或者纯C/C++编写比较好哦。
回复 赞! 靠!

使用道具 举报

发表于 2021-7-30 10:30:29 | 显示全部楼层
watermelon 发表于 2019-5-12 22:03
可以的,我建议不要Python混编程序了, 现在纯Python程序打包exe小弟我都搞萌比了,所以这个帖子如果纯Py ...

Python打包EXE真的让人很难受,包又大启动又慢,跟JAVA打包成EXE一样头秃
回复 赞! 靠!

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-11-21 21:39 , Processed in 0.035719 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表