• 【第五周】四则运算GUI


    这次这个简陋的程序终于发布了,其实发布很简单(在windows平台),因为使用的是vs2008+qt4.7的组合,在微软自家平台上用一用还是很方便的,只需要在release编译生成的exe文件,加上几个vs2008的.dll和qt的.dll动态链接库即可。

     

    百度网盘下载地址:http://pan.baidu.com/s/1c20wbIg

     之前的四则运算的代码转移到了一个头文件中,这样做工程的时候能方便调用。内容其实变化不大,主要有两点:1,把之前的主函数改成了一个普通函数string pmaker(),功能是随机出一个标准题目,返回值就是返回的string类型的算式。2,新增了一个将string类型转化为其他类型的泛型函数,用来处理用户的输入,方便和标准答案作对比。

    下面记录一下代码,对qt不太熟悉,先把学会了的记录下来,以后忘了还可以回来查看。

     1,main函数。

    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv); //生成一个程序a
        MyClass w;                    //MyClass是一个窗口类
        w.show();                    //显示一个窗口
        return a.exec();            //程序a进入实践循环
    }

    这个是qt工程自己生成的,对于QT这样的图形编程来说,一般都是逻辑绘图分离的,QApplication代表一个程序,MyClass代表一个窗口。一个程序可以有多个窗口。最后,return a.exec(),相当于把程序运行交给Qt处理,进入程序的循环状态。 而 return 0; 程序就直接退出了,不能达到显示的效果。

    2,myclass.h

    class MyClass : public QMainWindow
    {
        Q_OBJECT
    
    public:
        MyClass(QWidget *parent = 0, Qt::WFlags flags = 0);
        ~MyClass();
    private slots:
        int OnBtnOK();    //下一题按钮按下时触发。
        int OnEnterOk();//在答题框按下回车时触发。
    private:
        QString pshow();//用来显示出的题目,返回出的题目的string
        int pjudge(QString s,QString as);//判断答案是否正确
        QString qss;//用来存放题目的string
        int score;//用来存放得分
        int difficulty_index;
        Ui::MyClassClass ui;
    };

    myclass类主要是这些东西,两个slots(槽)函数,用来接收按钮或回车发出的signal(信号)。还有其他函数,注释写了大概功能,后面会介绍到。

    3,myclass.cpp的内容

    MyClass::MyClass(QWidget *parent, Qt::WFlags flags)
        : QMainWindow(parent, flags)
    {
        ui.setupUi(this);
          qss = pshow();    //出题,显示到linetext中。并用qss保存下来。
          score = 0;        //得分初始化。
        connect(ui.PBtNext,SIGNAL(clicked()),
            this,SLOT(OnBtnOK()));//连接pushbutton和该类的对象。
        connect(ui.lineEdit_answer,SIGNAL(returnPressed()),
        this,SLOT(OnEnterOk()));//连接lineedit和该类的对象。
    }

    myclass的构造函数,在myclass类被实例化后会执行,因为我们的软件打开后便要出题,不需要其他额外操作,所以在构造函数里就有出题的函数,开始便会调用,同时把score初始化为零。两个connect把下一题这个按钮和onbtnok()这个函数连接起来,一点击按钮便会执行这个函数。下面的同理,只不过触发条件变成在lineedit输入东西后,光标还在lineedit里面,这样按回车键便会触发onenterok()这个函数。这两个函数都需要自定义。

    QString MyClass::pshow()
    {
        QString pstring;
        pstring = GBK::a2w(pmaker());
        ui.lineEdit_problem->setText(pstring);
        return pstring;
    }

    这个函数pshow()用来在lineedit里面显示题目,由于QT有自己的string类型,叫Qstring类型,为了跨平台考虑,用的是Unicode编码,而string是GBK编码,如果直接显示我们函数得到的结果会是乱码,所以我们先要把显示的题目转化成Unicode编码,这就需要GBK类里面的a2w方法,这个方法把窄字符转换成宽字符,即把GBK编码转化成Unicode编码,也就是把string转化成Qstring。转化后再输出。用lineEdit的setText方法。lineEdit_problem是lineedit的一个实体。表示出题框。

    int MyClass::pjudge(QString s,QString as)
    {
        string sp = GBK::w2a(s);
        double result = calculateRPN(convert2RPN(sp));
        string an = GBK::w2a(as);
        double answer = stringToNum<double>(an);
        if (abs(result-answer)<0.1)
        {
            return 1;
        } 
        else
        {
            return 0;
        }
    }

    pjudge()函数是判断用户输入答案和标准答案是否一致的。它接收一个pmaker()生成的题目,它是Qstring类型的,所以转化成string类型在处理,用户输的答案也一样,若二者一致,则返回1,若二者不一致,则返回0。

    int MyClass::OnBtnOK()
    {
        
        int flag =pjudge(qss,ui.lineEdit_answer->text());
        if (flag)
        {
            
            QMessageBox::information(this,"OK","");
            score++;
        }
        else
        {
            QMessageBox::information(this,"NO","You are wrong");
        }
        ui.lineEdit_current->setText(GBK::a2w(itos(score)));
        ui.lineEdit_answer->setText("");
        qss = pshow();
    
        return 0;
    }

    这个是槽函数,当点击了下一题按钮就会触发,pjudge判断正误,正确总分加一,其实之前控制台程序分数比这复杂,但是由于主函数被封装了,只有一个返回值,返回了题目,就没法返回难度值了。算是有个小难点,不过其实给myclass增个属性用来记录难度值就行可以了,相当于全局变量。目前尚未实现。

    int MyClass::OnEnterOk()
    {
    
        MyClass::OnBtnOK();
        return 0;
    }

    这个函数其实是跟上个函数一样的 ,就是调用了上个函数,不过这是跟lineEdit_answer即答案栏连接在一起的,光标在答案栏只要一按回车就能触发了,就是可以判定输入答案,弹出对错框,然后再按回车,对错框消失,直接输入下一题,整个过程不用操作鼠标,也不用其他操作,使用很流畅,非常酸爽。

  • 相关阅读:
    如何在iOS中使用Block(转)
    blocks 学习(转)
    关于sqlite3 top的查询
    IOS多线程编程
    iOS平台内存常见问题(转)
    关于C中数组的组织存放
    消息推送机制实现与探讨
    IOS单例模式(Singleton)
    assign copy retain
    关于浮动,怪异模式
  • 原文地址:https://www.cnblogs.com/Boxer1994/p/5965264.html
Copyright © 2020-2023  润新知