PythonPyQt5跨平台开发系列(四)综合案例实战:计算器
目录
一、前言:
- Pyqt5的学习需要多学多练,最好是实际找点小东西来做,这样效果会更好。
- OK,本次我们来实现一个计算节小程序。
二、实现效果图
三、编码实战
- 计算器组件讲解:
- 1、创建一个button类来实现按钮。
- 创建button类的优点:
1、集中控制按钮的样式 2、集中处理信号管理,如接收点击信号的槽函数的统一设置等
-
其实计算器中用到的控件还是相对简单的,主体我们会用一个垂直的布局,然后按钮使用网格布局进行实现。
-
Ok,我们先定义一个button类
class Button(QToolButton): def __init__(self, text): super(Button, self).__init__() #设置按钮的大小控制策略。 self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred) self.setText(text) #重写sizeHint方法来返回按钮的大小 def sizeHint(self): size = QSize(QToolButton().sizeHint()) size.setHeight(size.height() + 20) size.setWidth(max(size.width(), size.height())) return size
-
QSizePolicy类知识点补充:
1、QSizePolicy是一个描述布局水平和垂直方向调整策略的属性。 2、大小策略会影响布局引擎处理部件的方式,部件加入布局以后,会返回一个QSizePolicy,描述了其水平和垂直方向的大小策略。可以通过QWidget.sizePolicy()设置大小策略
- 模式详解:
1、Fixed:默认大小是唯一的,不可变的,因此部件不能放大也不能缩小。 2、Minimum:默认大小是其最小值。部件允许扩展,但是并不倾向扩展(例如:水平方向上的按钮),不能比默认大小提供的大小更小。 3、Maximum:默认大小是最大值,假如其它部件需要空间并且不会破坏该部件,那么该部件允许被缩小(例如:一个分割线)。 4、Preferred:默认大小是最佳效果,部件允许放大或缩小,但不倾向于扩展比sizeHint()的值大(QWidget的缺省策略)。 5、Expanding:默认大小是合理的大小,但部件允许缩小并且可用。部件可以利用额外的空间,因此它将会得到尽可能多的空间(例如:水平方向上的滑块,一般控件需要撑满剩余空间时可用)。 6、MinimumExpanding:默认大小是最小值。部件允许使用额外空间,因此它将会得到尽可能多的空间。 7、Ignored:默认大小将会被忽略,部件将会得到尽可能多的空间。
- Ok,我们先定义一个CalculatorMachine类
自定义计算机类
class CalculatorMachine(QMainWindow):
def __init__(self):
super(CalculatorMachine, self).__init__();
self.initUI();
# 封装创建按钮的操作text为按钮文字,event为槽接收函数
def creat_button(self, text, event):
button = Button(text)
button.clicked.connect(event)
return button
def initUI(self):
self.q_widgt = QWidget(self);
self.move_center();
self.resize(320, 240);
self.setWindowTitle('安杰小生-计算器');
# 创建最外层的布局,用垂直方向的布局
self.main_layout = QVBoxLayout();
# 创建顶部显示控件
self.display = QLineEdit();
self.display.setText('0');
self.display.p = QPalette();
self.display.p.setColor(QPalette.Text, Qt.red);
self.display.setPalette(self.display.p)
#设置显示高度
self.display.setFixedHeight(40)
#显示文字向右对齐
self.display.setAlignment(Qt.AlignRight);
self.display.setFixedHeight(40)
self.display.setReadOnly(True);
self.main_layout.addWidget(self.display);
self.main_layout.addSpacing(1)
# 用网格布局创建底部数字按钮
self.key_layout = QGridLayout();
# 获取显示的数字0-9
self.num_digit = range(10);
print(self.num_digit)
# 根据数字数量创建按钮集合
self.digit_button = list(self.num_digit)
print(self.digit_button)
# 遍历创建按钮
for i in self.num_digit:
# 从1开始显示
if i > 0:
column = ((i - 1) % 3) + 1;
row = ((i - 1) / 3) + 1
self.digit_button[i] = self.creat_button(str(i), self.digit_clicked);
self.key_layout.addWidget(self.digit_button[i], row, column);
# 画0
self.digit_button[0] = self.creat_button(str(0), self.digit_clicked);
self.key_layout.addWidget(self.digit_button[0], 4, 1);
self.point_button = self.creat_button('.', self.point_clicked);
self.key_layout.addWidget(self.point_button, 4, 2);
self.equal_button = self.creat_button('=', self.equal_operator_clicked)
self.key_layout.addWidget(self.equal_button, 4, 3, 1, 2);
self.clear_button = self.creat_button('C', self.clear_operator_clicked)
self.key_layout.addWidget(self.clear_button, 1, 4);
self.minus_button = self.creat_button('-', self.minus_operator_clicked)
self.key_layout.addWidget(self.minus_button, 2, 4);
self.plus_button = self.creat_button('+', self.plus_operator_clicked)
self.key_layout.addWidget(self.plus_button, 3, 4);
self.main_layout.addLayout(self.key_layout)
self.q_widgt.setLayout(self.main_layout)
self.setCentralWidget(self.q_widgt)
# 点击数字回调
def digit_clicked(self):
print('数字操作符被点击了');
def point_clicked(self):
print('.操作符被点击了');
def plus_operator_clicked(self):
print('+操作符被点击了');
def minus_operator_clicked(self):
print('-操作符被点击了');
def clear_operator_clicked(self):
print('C操作符被点击了');
def equal_operator_clicked(self):
print('=操作符被点击了');
# 移动窗口到屏幕中心
def move_center(self):
# 获取屏幕的中心点
w_center_point = QDesktopWidget().availableGeometry().center();
m_react = self.frameGeometry();
m_react.moveCenter(w_center_point);
self.move(m_react.topLeft());
pass
if __name__ == '__main__':
app = QApplication(sys.argv);
c = CalculatorMachine();
c.show();
sys.exit(app.exec_());
- OK,如此我们变完成了一个计算器界面的编写工作。
- 具体的计算逻辑我们放到下一篇。