您的位置:首页 > 产品设计 > UI/UE

PyQt5:计算器UI(1)

2016-05-27 00:00 1056 查看
对照PyQt5的计算器demo 和 Qt4.7的计算器demo ,初步了解信号槽、函数和UI的写法。



大概了解了下UI的写法

1. main.cpp

在Qt C++ 里面首先入口函数是:

int main(int argc, char *argv[])
{
QApplication app(argc, argv);
Calculator calc;
calc.show();
return app.exec();
}
在PyQt5里面入口函数

if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
calc = Calculator()
calc.show()
sys.exit(app.exec_())
同理都需要库的头文件

C++写法:

#include <QApplication>
#include <QToolButton>
#include <QGirdLayout>
PyQt写法:

from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import (QApplication, QGridLayout, QLayout, QLineEdit,
QSizePolicy, QToolButton, QWidget)


2.Calculator类

class Calculator(QWidget):

def __init__(self,  parent = None):
super(Calculator,  self).__init__(parent)
可以理解为构造函数,初始化内容

接下来可以new一些button

#[3]
self.display = QLineEdit('0')     # new QLineEdit
self.display.setReadOnly(True)   # 设置只读
self.display.setAlignment(Qt.AlignRight)  # 设置文字从右向左显示
self.display.setMaxLength(15)   # set max length
#[3]
#[4]
font = self.display.font()
font.setPointSize(font.pointSize() + 8)
self.display.setFont(font)
#[4]

#[5] create button  0, 1, 2, .... 9
self.digitButtons = []

for i in range(Calculator.NumDigitButtons):
self.digitButtons.append(self.createButton(str(i), self.digitClicked))
#[5]

#[7] create button
self.pointButton = self.createButton(".",  self.pointClicked)
self.changeSignButton = self.createButton(u"\N{PLUS-MINUS SIGN}",  self.changeSignClicked)

self.backspaceButton = self.createButton("Backspace",  self.backspaceClicked)
self.clearButton = self.createButton("Clear",  self.clearClicked)
self.clearAllButton = self.createButton("Clear All",  self.clearAll)

self.clearMemoryButton = self.createButton("MC",  self.clearMemory)
self.readMemoryButton = self.createButton("MR",  self.readMemory)
self.setMemoryButton = self.createButton("MS",  self.setMemory)
self.addToMemoryButton = self.createButton("M+",  self.addToMemory)

# / * - +
self.divisionButton = self.createButton(u"\N{DIVISION SIGN}", self.multiplicativeOperatorClicked)
self.timesButton = self.createButton(u"\N{MULTIPLICATION SIGN}", self.multiplicativeOperatorClicked)
self.minusButton = self.createButton("-", self.additiveOperatorClicked)
self.plusButton = self.createButton("+", self.additiveOperatorClicked)

self.squareRootButton = self.createButton("Sqrt", self.unaryOperatorClicked)
self.powerButton = self.createButton(u"x\N{SUPERSCRIPT TWO}", self.unaryOperatorClicked)
self.reciprocalButton = self.createButton("1/x", self.unaryOperatorClicked)
self.equalButton = self.createButton("=", self.equalClicked)
然后适用QGridLayout布局

#[9]
mainLayout = QGridLayout()
mainLayout.setSizeConstraint(QLayout.SetFixedSize)

mainLayout.addWidget(self.display, 0, 0, 1, 6)
mainLayout.addWidget(self.backspaceButton, 1, 0, 1, 2)
mainLayout.addWidget(self.clearButton, 1, 2, 1, 2)
mainLayout.addWidget(self.clearAllButton, 1, 4, 1, 2)

mainLayout.addWidget(self.clearMemoryButton, 2, 0)
mainLayout.addWidget(self.readMemoryButton, 3, 0)
mainLayout.addWidget(self.setMemoryButton, 4, 0)
mainLayout.addWidget(self.addToMemoryButton, 5, 0)

for i in range(1,  Calculator.NumDigitButtons):
row = ((9 - i) / 3) + 2
column = ((i -1) % 3) + 1
mainLayout.addWidget(self.digitButtons[i],  row,  column)

mainLayout.addWidget(self.digitButtons[0], 5, 1)
mainLayout.addWidget(self.pointButton, 5, 2)
mainLayout.addWidget(self.changeSignButton, 5, 3)

mainLayout.addWidget(self.divisionButton, 2, 4)
mainLayout.addWidget(self.timesButton, 3, 4)
mainLayout.addWidget(self.minusButton, 4, 4)
mainLayout.addWidget(self.plusButton, 5, 4)

mainLayout.addWidget(self.squareRootButton, 2, 5)
mainLayout.addWidget(self.powerButton, 3, 5)
mainLayout.addWidget(self.reciprocalButton, 4, 5)
mainLayout.addWidget(self.equalButton, 5, 5)
self.setLayout(mainLayout)


这里面动态创建按钮并连接槽函数:

def createButton(self, text, member):
button = Button(text)
button.clicked.connect(member) # member = SLOT(函数名)
return button
3. Button 类 继承 QToolButton 主要设置了大小

class Button(QToolButton):
def __init__(self, text, parent = None):
super(Button, self).__init__(parent)

self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred)
self.setText(text)

def sizeHint(self):
size = super(Button, self).sizeHint()
size.setHeight(size.height() + 20)
size.setWidth(max(size.width(), size.height()))
return size


4. Calculator类中的按钮连接的槽函数

主要要和上面的def对齐

def digitClicked(self):
print("digitClicked")
这里都没有实现函数,只是点击打印了信息。

.py整体文件如下:

#!/usr/bin/env python

import math

from PyQt5.QtCore import Qt from PyQt5.QtWidgets import (QApplication, QGridLayout, QLayout, QLineEdit, QSizePolicy, QToolButton, QWidget)

class Button(QToolButton): def __init__(self, text, parent = None): super(Button, self).__init__(parent) self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred) self.setText(text) def sizeHint(self): size = super(Button, self).sizeHint() size.setHeight(size.height() + 20) size.setWidth(max(size.width(), size.height())) return size
#[2] Calculator inherit QWidget
class Calculator(QWidget):
NumDigitButtons = 10 # C++ enum

def __init__(self, parent = None):
super(Calculator, self).__init__(parent)

#[3]
self.display = QLineEdit('0') # new QLineEdit
self.display.setReadOnly(True) # 设置只读
self.display.setAlignment(Qt.AlignRight) # 设置文字从右向左显示
self.display.setMaxLength(15) # set max length
#[3]
#[4]
font = self.display.font()
font.setPointSize(font.pointSize() + 8)
self.display.setFont(font)
#[4]

#[5] create button 0, 1, 2, .... 9
self.digitButtons = []

for i in range(Calculator.NumDigitButtons):
self.digitButtons.append(self.createButton(str(i), self.digitClicked))
#[5]

#[7] create button
self.pointButton = self.createButton(".", self.pointClicked)
self.changeSignButton = self.createButton(u"\N{PLUS-MINUS SIGN}", self.changeSignClicked)

self.backspaceButton = self.createButton("Backspace", self.backspaceClicked)
self.clearButton = self.createButton("Clear", self.clearClicked)
self.clearAllButton = self.createButton("Clear All", self.clearAll)

self.clearMemoryButton = self.createButton("MC", self.clearMemory)
self.readMemoryButton = self.createButton("MR", self.readMemory)
self.setMemoryButton = self.createButton("MS", self.setMemory)
self.addToMemoryButton = self.createButton("M+", self.addToMemory)

# / * - +
self.divisionButton = self.createButton(u"\N{DIVISION SIGN}", self.multiplicativeOperatorClicked)
self.timesButton = self.createButton(u"\N{MULTIPLICATION SIGN}", self.multiplicativeOperatorClicked)
self.minusButton = self.createButton("-", self.additiveOperatorClicked)
self.plusButton = self.createButton("+", self.additiveOperatorClicked)

self.squareRootButton = self.createButton("Sqrt", self.unaryOperatorClicked)
self.powerButton = self.createButton(u"x\N{SUPERSCRIPT TWO}", self.unaryOperatorClicked)
self.reciprocalButton = self.createButton("1/x", self.unaryOperatorClicked)
self.equalButton = self.createButton("=", self.equalClicked)
#[7]

#[9] mainLayout = QGridLayout() mainLayout.setSizeConstraint(QLayout.SetFixedSize) mainLayout.addWidget(self.display, 0, 0, 1, 6) mainLayout.addWidget(self.backspaceButton, 1, 0, 1, 2) mainLayout.addWidget(self.clearButton, 1, 2, 1, 2) mainLayout.addWidget(self.clearAllButton, 1, 4, 1, 2) mainLayout.addWidget(self.clearMemoryButton, 2, 0) mainLayout.addWidget(self.readMemoryButton, 3, 0) mainLayout.addWidget(self.setMemoryButton, 4, 0) mainLayout.addWidget(self.addToMemoryButton, 5, 0) for i in range(1, Calculator.NumDigitButtons): row = ((9 - i) / 3) + 2 column = ((i -1) % 3) + 1 mainLayout.addWidget(self.digitButtons[i], row, column) mainLayout.addWidget(self.digitButtons[0], 5, 1) mainLayout.addWidget(self.pointButton, 5, 2) mainLayout.addWidget(self.changeSignButton, 5, 3) mainLayout.addWidget(self.divisionButton, 2, 4) mainLayout.addWidget(self.timesButton, 3, 4) mainLayout.addWidget(self.minusButton, 4, 4) mainLayout.addWidget(self.plusButton, 5, 4) mainLayout.addWidget(self.squareRootButton, 2, 5) mainLayout.addWidget(self.powerButton, 3, 5) mainLayout.addWidget(self.reciprocalButton, 4, 5) mainLayout.addWidget(self.equalButton, 5, 5) self.setLayout(mainLayout)

self.setWindowTitle("Calculator")
#[9]

#[6] 函数未实现
def createButton(self, text, member):
button = Button(text)
button.clicked.connect(member) # member = SLOT(函数名)
return button

def digitClicked(self):
print("digitClicked")
#[6]

#[8] function about buttons 函数未实现
def pointClicked(self):
print("pointClicked")

def changeSignClicked(self):
print("changeSignClicked")

def backspaceClicked(self):
print("backspaceClicked")

def clearClicked(self):
print("clearClicked")

def clearAll(self):
print("clearAll")

def clearMemory(self):
print("clearMemory")

def readMemory(self):
print("readMemory")

def setMemory(self):
print("setMemory")

def addToMemory(self):
print("addToMemory")

def multiplicativeOperatorClicked(self):
print("multiplicativeOperatorClicked")

def additiveOperatorClicked(self):
print("additiveOperatorClicked")

def unaryOperatorClicked(self):
print("unaryOperatorClicked")

def equalClicked(self):
print("equalClicked")
#[8]

#[1] same as C++ main.cpp
if __name__ == '__main__': import sys app = QApplication(sys.argv) calc = Calculator() calc.show() sys.exit(app.exec_())
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: