watermelon 发表于 2018-10-30 01:09:03

我的第一个GUI程序

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

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

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

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

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

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

                                                                ---watermelon



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

0xAA55 发表于 2018-10-30 07:10:41

又见Qt

watermelon 发表于 2018-10-30 11:56:42

0xAA55 发表于 2018-10-30 07:10
又见Qt

哈哈,谢谢站长鼓励

watermelon 发表于 2018-10-30 11:58:26

还是发一下调用python脚本的那段函数,真的和从dll中调用导出函数有相似的行为:
首先要#include <Python.h>
代码如下:
//借助python脚本fanyi.py来进行翻译
void MainWindow::use_youdao_translate()
{
    //初始化python模块
    Py_Initialize();
    if(!Py_IsInitialized())
    {
      QMessageBox::critical(NULL, "Error1", "Please get in touch with the Watermelon,sorry.",
                              QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
      return;
    }

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

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

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


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

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

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

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

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

    //结束,释放python
    Py_Finalize();
}

0xAA55 发表于 2018-11-1 14:41:20

说起来有个问题,你的“协议”那个界面上的画,是你自己的吗?如果不是,你获得授权了吗?

watermelon 发表于 2018-11-1 14:57:43

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

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

Ink_Hin_fifteen 发表于 2019-5-10 20:03:14

还能这么玩的吗。

watermelon 发表于 2019-5-12 22:03:29

Ink_Hin_fifteen 发表于 2019-5-10 20:03
还能这么玩的吗。

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

WeaponJang 发表于 2021-7-30 10:30:29

watermelon 发表于 2019-5-12 22:03
可以的,我建议不要Python混编程序了, 现在纯Python程序打包exe小弟我都搞萌比了,所以这个帖子如果纯Py ...

Python打包EXE真的让人很难受,包又大启动又慢,跟JAVA打包成EXE一样头秃
页: [1]
查看完整版本: 我的第一个GUI程序