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,如此我们变完成了一个计算器界面的编写工作。
 - 具体的计算逻辑我们放到下一篇。