Ricky Hao

PyQt 初学总结

前几天初步学习了Python环境下的Qt。

换句话说,就是可以再也不用写像以前那样的命令行程序,可以写有图形界面的程序了!(虽然,命令行简单,快)

工具:

从这个网站下载符合你版本的PyQt:[PyQt下载][1]
推荐使用**Eric6**这个Python的IDE。(请自行百度)
Python的手册(安装自带)
Qt的手册(不知为何,我PyQt自带的Assistant用不了,你们可以去下一个C++版的Qt,用它的Assistant)
英语(现阶段PyQt5的教程很少,特别是中文教程。Qt手册和Python手册也大多是英文,所以)

==================================================================================================
对于初学PyQt,我推荐先将这个网站通读一遍(PS:纯英文)
PyQt5 tutorial
将其中的程序范例都至少通读理解一遍以后,就可以尝试自己写个小程序来玩玩。
我写的是计算器。

QQ图片20151125205719.png

首先,这里需要实现几个功能:
1.界面布局(QtWidgets.QGridLayout
2.通过界面按钮输入数据(QtWidgets.QPushButton
3.结果窗口输出(QtWidgets.QTextBrowser
4.实现键盘按键输入数据(def keyPressEvent(self)
5.输入的历史记录(自定函数)

6.中缀表达式和前缀表达式的转换(前缀、中缀、后缀表达式)

一、界面布局
这里我选用的是QGridLayout的布局方式。
就是将界面分成一个二维数组的形式,每个控件所在的位置用坐标标定。

QGridLayout.addWidget(QWidget,int row,int col);

上面这是最简单的一种添加控件的方式。
QWidget->你要添加的控件
row,col为坐标

QGridLayout.addWidget(QWidget,int row,int col,int spanrow,int spancol);

这种添加控件的方式,可以人为地控制一个控件所占用的“格数”。

其中的spanrowspancol是指从指定坐标(row,col)扩充多少spanrow行和多少spancol列的范围。

二、通过界面按钮输入数据
这里使用的是QPushButtom.clicked.connect()方法。
自定一个函数:

def OnChange(self):
    self.senfToBuf(self.sender().text());

这样就可以将这个按钮的名字(也就是显示在按钮上的字)发送到你所需要的函数(我是sendToBuf函数)。
其中,self.sender()指的是触发这个函数时点击的按钮。而他的text()方法就是得到按钮的名称。

这样就可以达到通过按钮输入数据的目的。

三、结果窗口输出
因为不想让输出窗口能够被编辑且可以多行显示,所以我使用的是QTextBrowser而不是QLineEdit
对于这个控件,其实用法都差不多。显示数据使用的函数就是

QTextBrowser.setText(String);

每次数据输入的时候,都进行一次更新即可。

四、实现键盘按键输入数据
首先,我们可以知道对于QWidget这个类(也就是我们自己的类所继承的类),他自带一个函数keyPressEvent
我们通过重载这个函数来达到我们自己的目的。

def keyPressEvent(self,e):
    if(e.key()==Qt.Key_Enter):
        self.sendToBuf('=');
    else:
        self.senfToBuf(e.text());

在这里,e指代的是我们触发这个Event时按下的按键。
e.key()->按键类型(Qt里面内置了各种按键类型,我这里是只要是Enter类型按键,就发送=号)

e.text()->按键文本(就是按键的字。比如按下1,这个函数就会得到'1'

五、输入的历史纪录

就是每次操作完一个算式,将算式加入数组然后输出罢了。

六、中缀表达式和前缀表达式的转换
仔细研读上面给出的地址。其实将中缀表达式转换成前缀、后缀表达式都可以。
可以使用列表List的几个功能:

List.pop();
List.remove();

其实用List就可以很好地模拟栈。
下面是我写的前缀表达式的转换程序:

class prefix():
    def __init__(self):
        self.stack=[];
        self.buf=[];

    def arrange(self):
        self.s1=[];
        self.s2=[];

        for ch in self.buf:
            if(type(ch)==float):
                self.s2.append(ch);
            elif(ch in '/*-+'):
                self.operatePK(ch);
            elif(ch==')'):
                self.s1.append(ch);
            elif(ch=='('):
                while(self.s1!=')' and len(self.s1)>0):
                    self.s2.append(self.s1.pop());
                if(len(self.s1)>0):
                    self.s1.pop();
            else:
                print(ch);
        while(len(self.s1)):
            self.s2.append(self.s1.pop());
            
        self.stack=[];
        
        for ch in self.s2:
            self.stack.append(ch);

    def operateToInt(self,ch):
        if(ch in '+-'):
            return 0;
        else:
            return 1;

    def operatePK(self,ch):
        if(len(self.s1)==0 or self.s1[len(self.s1)-1]==')'):
                    self.s1.append(ch);
        else:
            if(self.operateToInt(ch)>=self.operateToInt(self.s1[len(self.s1)-1])):
                self.s1.append(ch);
            else:
                while(self.operateToInt(ch)
点赞

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据