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

  发布日期:   2017-09-07
  最新修改:   2020-01-17
  阅读次数:   150 次

一、前言:

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

    二、实现效果图

    1.png

三、编码实战

  • 计算器组件讲解:

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

   转载规则

《PythonPyQt5跨平台开发系列(四)综合案例实战:计算器字》GajAngels 采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。