目录

PythonPyQt5跨平台开发系列(四)综合案例实战:计算器

一、前言:

  • Pyqt5的学习需要多学多练,最好是实际找点小东西来做,这样效果会更好。
  • OK,本次我们来实现一个计算节小程序。

二、实现效果图

http://upload-images.jianshu.io/upload_images/1811893-720efea47c3cfa15.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240

三、编码实战

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