PyQt5:计算器UI(1)
2016-05-27 00:00
1056 查看
对照PyQt5的计算器demo 和 Qt4.7的计算器demo ,初步了解信号槽、函数和UI的写法。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/17/7e68b5cb725c5c267443c1afb32741a1)
大概了解了下UI的写法
1. main.cpp
在Qt C++ 里面首先入口函数是:
C++写法:
2.Calculator类
接下来可以new一些button
这里面动态创建按钮并连接槽函数:
4. Calculator类中的按钮连接的槽函数
主要要和上面的def对齐
.py整体文件如下:
大概了解了下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 button3. 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_())
相关文章推荐
- 介绍KeyTool GUI工具2款
- [工具]iOS UIDatePicker日历选择控件
- JMS Request/Reply Example
- How should I implement request response with JMS?
- UIImageBlur一个image的分类
- Android酷炫实用的开源框架(UI框架)
- Android组件及UI框架大全
- ffmeg thread_queue_size描述
- iOS之UIView动画
- Android中ListView嵌套GridView的简单消息流UI(解决宽高问题)
- UVa 11039 Building designing (贪心+排序+模拟)
- ACM等算法比赛中JAVA 常用"STL"总结:TreeMap,Queue,PriorityQueue等
- UILable的使用,文本高度的计算boundingRectWithSize
- UIView的使用
- ios 获取UIImage图片的像素尺寸
- 手机适配----资源适配篇(values)
- LeetCode-300.Longest Increasing Subsequence
- 字节打印流PrintStream,字符打印流PrintWriter,序列流SequenceInputStream、
- Subsequence(两个单调队列)
- UIView-九宫格