创建主窗口

主窗口的类型

  1. QMainWindow(主窗口):可以包含菜单栏、工具栏、状态栏、标题栏;(最常见的窗口形式
  2. QDialog:是对话窗口的基类;(没有菜单栏、工具栏、状态栏)
  3. QWidget :不确定窗口的用途,就是用QWidget;(即可以代替主窗口,又可以代替对话窗口

第三章 基本窗口控件 - 图1

代码

  1. import sys # 获取参数
  2. from PyQt5.QtWidgets import QMainWindow,QApplication # 导入整个应用程序和窗口部件类
  3. from PyQt5.QtGui import QIcon # 添加图标
  4. class FirstMainWin(QMainWindow): #继承主窗口的方法
  5. def __init__(self):
  6. '''
  7. 初始化方法
  8. :param parent:
  9. '''
  10. super(FirstMainWin,self).__init__() #第二种继承父类的方法,super().父类方法名;第一种父类名.方法名(self)
  11. # 设置主窗口的标题
  12. self.setWindowTitle('第一个主窗口应用')
  13. # 设置窗口的尺寸
  14. self.resize(400,300)
  15. # 获得状态栏
  16. self.status=self.statusBar()
  17. # 在状态栏上显现消息
  18. self.status.showMessage('只存在5s的消息',5000) #单位是ms
  19. if __name__ == '__main__': # 只有这个文件单独执行才会调用该语句
  20. app = QApplication(sys.argv) # 传入参数
  21. app.setWindowIcon(QIcon('./images/resume_nor.png')) # 设置图标,没有办法显示图标
  22. main = FirstMainWin()
  23. main.show()
  24. sys.exit(app.exec_()) # 进入程序的主循环

结果

第三章 基本窗口控件 - 图2

让主窗口居中显示

代码

  1. # QDesktopWidget
  2. import sys # 获取参数
  3. from PyQt5.QtWidgets import QDesktopWidget,QMainWindow,QApplication # 导入整个应用程序和窗口部件类
  4. from PyQt5.QtGui import QIcon # 添加图标
  5. class CenterForm(QMainWindow): #继承主窗口的方法
  6. def __init__(self):
  7. '''
  8. 初始化方法
  9. :param parent:
  10. '''
  11. super(CenterForm,self).__init__() #第二种继承父类的方法,super().父类方法名;第一种父类名.方法名(self)
  12. # 设置主窗口的标题
  13. self.setWindowTitle('让窗口居中')
  14. # 设置窗口的尺寸
  15. self.resize(400,300)
  16. pass
  17. def center(self):
  18. '''
  19. 让窗口居中
  20. :return:
  21. '''
  22. # 获取屏幕的坐标
  23. screen = QDesktopWidget.screenGeometry()
  24. # 获取窗口坐标
  25. size = self.geometry()
  26. # 获取中间位置坐标
  27. newLeft = (screen.width()-size.width())/2
  28. newTop = (screen.height()-size.height())/2
  29. # 移动窗口坐标
  30. self.move(newLeft,newTop)
  31. if __name__ == '__main__': # 只有这个文件单独执行才会调用该语句
  32. app = QApplication(sys.argv) # 传入参数
  33. main = CenterForm()
  34. main.show()
  35. sys.exit(app.exec_()) # 进入程序的主循环

结果

第三章 基本窗口控件 - 图3

退出应用程序

QPushButton

QPushButton 类专门用来创建可按压的按钮。QPushButton 按钮上除了可以放置一串文本,文本左侧还可以放置图标,必要时还可以在按钮上放置图片。

第三章 基本窗口控件 - 图4

QHBoxLayout

水平布局,是指将所有控件从左到右(或者从右到左)依次摆放。

第三章 基本窗口控件 - 图5

代码

  1. import sys # 获取参数
  2. from PyQt5.QtWidgets import QMainWindow, QApplication, QHBoxLayout, QPushButton, QWidget # QHBoxLayout水平布局
  3. class QuitApplication(QMainWindow): # 继承主窗口的方法
  4. def __init__(self):
  5. super(QMainWindow, self).__init__() # 第二种继承父类的方法,super().父类方法名;第一种父类名.方法名(self)
  6. self.setWindowTitle('退出应用程序') # 设置主窗口的标题
  7. self.resize(300, 120) # 设置窗口的尺寸
  8. # 添加Button
  9. self.button1 = QPushButton('退出应用程序')
  10. # 将信号与槽关联,将信号绑定在槽上
  11. self.button1.clicked.connect(self.onc
  12. layout = QHBoxLayout() # 创建水平布局
  13. layout.addWidget(self.button1) # 把组件加到窗口中
  14. mainFrame = QWidget() # 需要有一个主控件
  15. mainFrame.setLayout(layout) # 把水平布局放到主控件中
  16. self.setCentralWidget(mainFrame) # 把主控件放在整个窗口上
  17. pass
  18. # 按钮单击事件的方法(自定义的槽,相当于事件的方法)
  19. def onClick_Button(self):
  20. sender = self.sender() # 通过sender来获得button
  21. print(sender.text() + '按钮被按下')
  22. app = QApplication.instance()
  23. # 退出应用程序
  24. app.quit()
  25. pass
  26. pass
  27. if __name__ == '__main__': # 只有这个文件单独执行才会调用该语句
  28. app = QApplication(sys.argv) # 传入参数
  29. main = QuitApplication()
  30. main.show()
  31. sys.exit(app.exec_()) # 进入程序的主循环

结果

第三章 基本窗口控件 - 图6

第三章 基本窗口控件 - 图7

屏幕坐标系

  • 相对于整个屏幕形成的坐标系,知道后可以控制控件的尺寸和位置。
    • 格式化输出
      • 使用 % 作为占位符:print(‘我的名字是%s:来自【%s】’%(name,classPro))
      • .formate:print(‘姓名:{}’.format(name))

代码

  1. import sys
  2. from PyQt5.QtWidgets import QHBoxLayout,QMainWindow,QApplication,QPushButton,QWidget
  3. def onClinkButton():
  4. print('第一种获取坐标系的方法')
  5. print('widget.x() = %d' % widget.x()) # 250(窗口坐标),使用%做占位符,格式化输出
  6. print('widget.y() = %d' % widget.y()) # 200(窗口坐标),包含标题栏
  7. print('widget.width() = %d' % widget.width()) # 200(工作区宽度)
  8. print('widget.height() = %d' % widget.height()) # 240(工作区高度)
  9. print('第二种获取坐标系的方法')
  10. print('widget.geometry().x() = %d' % widget.geometry().x()) # 250(工作区横坐标),windows横着有边框
  11. print('widget.geometry().y() = %d' % widget.geometry().y()) # 228(工作区的纵坐标),窗口坐标系,不包含标题栏,由像素决定
  12. print('widget.geometry().width() = %d' % widget.geometry().width()) # 200(工作区宽度)
  13. print('widget.geometry().height() = %d' % widget.geometry().height()) # 240(工作区高度)
  14. print('第三种获取坐标系的方法')
  15. print('widget.frameGeometry().x() = %d' % widget.frameGeometry().x()) # 250(窗口横坐标)
  16. print('widget.frameGeometry().y() = %d' % widget.frameGeometry().y()) # 200(窗口纵坐标)
  17. print('widget.frameGeometry().width() = %d' % widget.frameGeometry().width()) # 200(窗口宽度)
  18. print('widget.frameGeometry().height() = %d' % widget.frameGeometry().height()) # 260(窗口高度)把标题栏包含在内的高度
  19. pass
  20. # 使用面向对象的方式
  21. app = QApplication(sys.argv)
  22. widget = QWidget()
  23. btn = QPushButton(widget)
  24. btn.setText('按钮')
  25. btn.clicked.connect(onClinkButton)
  26. btn.move(24,52)
  27. widget.resize(200,240) # 设置工作区的尺寸
  28. widget.move(250,200)
  29. widget.setWindowTitle('屏幕坐标系')
  30. widget.show()
  31. sys.exit(app.exec_())

结果

第三章 基本窗口控件 - 图8

设置窗口和应用程序图标

  • 窗口的 setWindowIcon 方法用于设置窗口的图标,只在 Windows、Linux 中可用;
  • QApplication 中的 setWindowIcon 方法用于设置主窗口的图标和应用程序图标,但调用了窗口 setWindowIcon 方法,QApplication 方法就只能用于设置应用程序图标了。

代码

  1. import sys # 获取参数
  2. from PyQt5.QtWidgets import QMainWindow,QApplication # 导入整个应用程序和窗口部件类
  3. from PyQt5.QtGui import QIcon # 添加图标
  4. class IconForm(QMainWindow): #继承主窗口的方法
  5. def __init__(self):
  6. super(QMainWindow,self).__init__() #第二种继承父类的方法,super().父类方法名;第一种父类名.方法名(self)
  7. self.initUI()
  8. pass
  9. def initUI(self):
  10. # 设置窗口的位置和尺寸
  11. self.setGeometry(0,0,250,250)
  12. # 设置主窗口的标题
  13. self.setWindowTitle('设置窗口图标')
  14. # 设置窗口图标
  15. # self.setWindowIcon(QIcon('./controls/images/A.ico')) # 在Mac上不显示任何图标,只能在windows下左上角显示图标
  16. # 获得状态栏
  17. self.status=self.statusBar()
  18. # 在状态栏上显现消息
  19. self.status.showMessage('只存在5s的消息',5000) #单位是ms
  20. if __name__ == '__main__': # 只有这个文件单独执行才会调用该语句
  21. app = QApplication(sys.argv) # 传入参数
  22. app.setWindowIcon(QIcon('./controls/images/A.ico')) # 只能设计应用程序的图标
  23. main = IconForm()
  24. main.show()
  25. sys.exit(app.exec_()) # 进入程序的主循环

结果

第三章 基本窗口控件 - 图9

为控件添加提示消息

代码

  1. # 显示控件提示消息
  2. import sys
  3. from PyQt5.QtWidgets import QHBoxLayout,QMainWindow,QApplication,QToolTip,QPushButton,QWidget
  4. from PyQt5.QtGui import QFont # 引入字体
  5. class TooltipForm(QMainWindow):
  6. def __init__(self):
  7. super().__init__()
  8. self.intiUI()
  9. pass
  10. def intiUI(self):
  11. QToolTip.setFont(QFont('SansSerif',12))
  12. self.setToolTip('今天是<b>星期五</b>') # 给窗口设置提示符
  13. self.setGeometry(300, 300, 200, 300) # 设置工作区的位置,高度,宽度
  14. self.setWindowTitle('设置控件提示消息')
  15. self.resize(300, 120) # 设置窗口的尺寸
  16. # 添加Button
  17. self.button1 = QPushButton('我的按钮')
  18. self.button1.setToolTip('这是一个按钮,Are you ok?')
  19. layout = QHBoxLayout() # 创建水平布局
  20. layout.addWidget(self.button1) # 把组件加到窗口中
  21. mainFrame = QWidget() # 需要有一个主控件
  22. mainFrame.setLayout(layout) # 把水平布局放到主控件中
  23. self.setCentralWidget(mainFrame) # 把主控件放在整个窗口上
  24. pass
  25. pass
  26. if __name__ == '__main__':
  27. app = QApplication(sys.argv)
  28. main = TooltipForm()
  29. main.show()
  30. sys.exit(app.exec_())

结果

第三章 基本窗口控件 - 图10

第三章 基本窗口控件 - 图11

QLabel控件的基本用法

用来显示文本信息

  • setAlignment():设置文本的对齐方式
  • setIndent():设置文本缩进
  • text():获取文本内容
  • setBuddy():设置伙伴关系
  • setText():设置文本内容
  • selectedText():返回所选择的字符
  • setWordWrap():设置是否允许换行

QLabel常用的信号(事件)

  • 当鼠标滑过QLabel控件时触发:linkHovered
  • 当鼠标单机QLabel控件时触发:linkActivated

代码

  1. import sys
  2. from PyQt5.QtWidgets import QVBoxLayout, QMainWindow, QApplication, QPushButton, QLabel, QWidget
  3. from PyQt5.QtGui import QPixmap, QPalette # 用于绘图设备的图像显示(用于在标签或按钮上显示图像),设置Qlabel的背景色
  4. from PyQt5.QtCore import Qt # 引入核心模块
  5. class QLabelDemo(QWidget):
  6. def __init__(self):
  7. super().__init__()
  8. self.initUI()
  9. pass
  10. def initUI(self):
  11. label1 = QLabel(self)
  12. label2 = QLabel(self)
  13. label3 = QLabel(self)
  14. label4 = QLabel(self)
  15. label1.setText('<font color=yellow>这是一个文本标签')
  16. label1.setAutoFillBackground(True)
  17. palette = QPalette()
  18. palette.setColor(QPalette.Window, Qt.blue)
  19. label1.setPalette(palette)
  20. label1.setAlignment(Qt.AlignCenter) # 设置文本居中对齐
  21. label2.setText("<a href='#'>欢迎使用Python GUI程序</a>") # 后续会控制网页,跳转到事件
  22. label3.setAlignment(Qt.AlignCenter)
  23. label3.setToolTip('这是一个图片标签')
  24. label3.setPixmap(QPixmap('./images/picture.ico'))
  25. # 如果设为True,用浏览器打开网页,如果设为Flase,调用槽函数
  26. label4.setOpenExternalLinks(True)
  27. label4.setText("<a href='https://item.jd.com/12417265.html'>感谢关注《Python从菜鸟到高手》</a>")
  28. label4.setAlignment(Qt.AlignRight) # 让文字右对齐
  29. label4.setToolTip('这是一个超级链接')
  30. vbox = QVBoxLayout() # 创建垂直布局
  31. vbox.addWidget(label1) # 把组件添加到窗口中
  32. vbox.addWidget(label2)
  33. vbox.addWidget(label3)
  34. vbox.addWidget(label4)
  35. # 将信号与槽绑定
  36. label2.linkHovered.connect(self.linkHovered)
  37. label4.linkActivated.connect(self.linkClicked)
  38. self.setLayout(vbox)
  39. self.setWindowTitle('Qlabel控件演示')
  40. def linkHovered(self):
  41. print('当鼠标滑过label2标签时,触发事件')
  42. pass
  43. def linkClicked(self):
  44. print('当鼠标单击label4标签时,触发事件')
  45. pass
  46. pass
  47. if __name__ == '__main__': # 只有这个文件单独执行才会调用该语句
  48. app = QApplication(sys.argv) # 传入参数
  49. main = QLabelDemo()
  50. main.show()
  51. sys.exit(app.exec_()) # 进入程序的主循环

结果

第三章 基本窗口控件 - 图12

QLabel与伙伴控件

热键

只有在菜单显示时才会起作用,只有在 Windows 上才有这么一说。

伙伴关系

设置两个控件之间的关联,用一个控件控制另外一个控件。

概念

最所五个参数,第一个控件对象,第二三是控件位置,第四五是控件的尺寸。

  1. mainLayout.addWidget(控件对象, 行索引, 列索引, 占用的行, 占用的列)

代码

  1. import sys
  2. from PyQt5.QtWidgets import *
  3. class QLabelBuddy(QDialog):
  4. def __init__(self):
  5. super().__init__()
  6. self.initUI()
  7. pass
  8. def initUI(self):
  9. self.setWindowTitle('QLabel与伙伴关系')
  10. nameLabel = QLabel('&Name',self)
  11. nameLineEdit = QLineEdit(self)
  12. nameLabel.setBuddy(nameLineEdit) # 设置伙伴关系
  13. passwordLabel = QLabel('&Name', self)
  14. passwordLineEdit = QLineEdit(self)
  15. passwordLabel.setBuddy(passwordLineEdit)
  16. btnOK = QPushButton('&OK')
  17. btnCancel = QPushButton('$Cancel')
  18. # 使用栅格布局
  19. mainLayout = QGridLayout(self)
  20. mainLayout.addWidget(nameLabel, 0, 0) # 在栅格的第1行,第1列
  21. mainLayout.addWidget(nameLineEdit, 0, 1, 1, 2) # 在栅格的第1行,第2列,高为1,宽为2.最多五个参数,第一个参数是把什么控件添加到里面,
  22. mainLayout.addWidget(passwordLabel, 1, 0) # 在栅格的第2行,第1列
  23. mainLayout.addWidget(passwordLineEdit, 1, 1, 1, 2) # 在栅格的第2行,第2列,高为1,宽为2
  24. mainLayout.addWidget(btnOK, 2, 1) # 在栅格的第3行,第2列
  25. mainLayout.addWidget(btnCancel, 2, 2) # 在栅格的第3行,第3列
  26. pass
  27. pass
  28. if __name__ == '__main__': # 只有这个文件单独执行才会调用该语句
  29. app = QApplication(sys.argv) # 传入参数
  30. main = QLabelBuddy()
  31. main.show()
  32. sys.exit(app.exec_()) # 进入程序的主循环

结果

苹果系统不显示热键,alt+热键可以直接跳转到该对话框。

第三章 基本窗口控件 - 图13

QLineEdit控件与回显模式

基本功能

输入单行文本

高级功能

  • 设置回显模式(EchoMode):当我们在 QLineEdit 里面输入文本时,会怎样将输入的文本显示,一共有四种回显模式
    1. Normal:正常回显;
    2. NoEcho:没有回显(在 Linux 中输入密码时);
    3. Password:显示的时候是点,可以防止别人看到(在密码输入框中常见);
    4. PasswordEchoOnEdit:编辑的时候是正常的,焦点改变后变成点,先是 Normal 后是 Password。

代码

  1. import sys
  2. from PyQt5.QtWidgets import *
  3. class QLineEditEchoMode(QWidget):
  4. def __init__(self):
  5. super().__init__()
  6. self.initUI()
  7. pass
  8. def initUI(self):
  9. self.setWindowTitle('文本输入框的回显模式')
  10. # 创建四个控件
  11. normalLineEdit = QLineEdit()
  12. noEchoLineEdit = QLineEdit()
  13. passwordLineEdit = QLineEdit()
  14. passwordOnEditLineEdit = QLineEdit()
  15. # 创建表单布局
  16. formLayout = QFormLayout()
  17. formLayout.addRow('normal', normalLineEdit) # 前面是控件的标签,后面是控件
  18. formLayout.addRow('noEcho', noEchoLineEdit)
  19. formLayout.addRow('password', passwordLineEdit)
  20. formLayout.addRow('passwordOnEdit', passwordOnEditLineEdit)
  21. # 显示提示信息,输入内容时提示会消失(placeholdertext)
  22. normalLineEdit.setPlaceholderText('normal')
  23. noEchoLineEdit.setPlaceholderText('noEcho')
  24. passwordLineEdit.setPlaceholderText('password')
  25. passwordOnEditLineEdit.setPlaceholderText('passwordOnEdit')
  26. # 设置文本输入框的模式
  27. normalLineEdit.setEchoMode(QLineEdit.Normal)
  28. noEchoLineEdit.setEchoMode(QLineEdit.NoEcho)
  29. passwordLineEdit.setEchoMode(QLineEdit.Password)
  30. passwordOnEditLineEdit.setEchoMode(QLineEdit.PasswordEchoOnEdit)
  31. self.setLayout(formLayout) # 应用表单布局
  32. pass
  33. pass
  34. if __name__ == '__main__': # 只有这个文件单独执行才会调用该语句
  35. app = QApplication(sys.argv) # 传入参数
  36. main = QLineEditEchoMode()
  37. main.show()
  38. sys.exit(app.exec_()) # 进入程序的主循环

结果

第三章 基本窗口控件 - 图14

第三章 基本窗口控件 - 图15

限制QLineEdit控件的输入

校验器:限制只能输入整数、浮点数或满足一定条件的字符串。

代码

  1. import sys
  2. from PyQt5.QtWidgets import *
  3. from PyQt5.QtGui import QIntValidator, QDoubleValidator, QRegExpValidator # 引入整数校验器,浮点型校验器,正则表达式校验器
  4. from PyQt5.QtCore import QRegExp
  5. class QLineEditValidator(QWidget):
  6. def __init__(self):
  7. super().__init__()
  8. self.initUI()
  9. pass
  10. def initUI(self):
  11. self.setWindowTitle('校验器')
  12. # 创建三个文本输入框,分别用来输入整数类型,浮点类型,满足正则表达式的(只能是数字和字母)
  13. intLineEdit = QLineEdit()
  14. doubleLineEdit = QLineEdit()
  15. regExpLineEdit = QLineEdit()
  16. # 设置提示文本
  17. intLineEdit.setPlaceholderText('请输入整型')
  18. doubleLineEdit.setPlaceholderText('请输入浮点类型')
  19. regExpLineEdit.setPlaceholderText('数字和字母')
  20. # 创建表单布局,把三个控件加入到表单中
  21. formlayout = QFormLayout()
  22. formlayout.addRow('整数类型 :', intLineEdit)
  23. formlayout.addRow('浮点类型 :', doubleLineEdit)
  24. formlayout.addRow('数字和字母:', regExpLineEdit)
  25. # 整数校验器[1,99]
  26. intValidator = QIntValidator(self) # self表明父对象
  27. intValidator.setRange(1, 99) # 设置校验器的范围
  28. # 浮点校验器[-360,360],精度要求小数点后2位(限制不是很准确,只能限制位数,不能限制范围)
  29. doubleValidator = QDoubleValidator()
  30. doubleValidator.setRange(-360, 360)
  31. doubleValidator.setNotation(QDoubleValidator.StandardNotation) # 标准的表示法,正常显示浮点数
  32. doubleValidator.setDecimals(2) # 设置精度,小数点后两位
  33. # 正则校验器,字符和数字
  34. reg = QRegExp('[a-zA-Z0-9]+') # 正则表达式,匹配范围内的值,至少有1次匹配成功
  35. regExpValidator = QRegExpValidator() # 创建正则表达式的校验器
  36. regExpValidator.setRegExp(reg) # 将正则表达式和正则校验器绑定在一起
  37. # 把创建的3个校验器和3个文本输入框绑定
  38. intLineEdit.setValidator(intValidator) # 只有文本控件才能设置校验器
  39. doubleLineEdit.setValidator(doubleValidator)
  40. regExpLineEdit.setValidator(regExpValidator)
  41. # 应用表单布局
  42. self.setLayout(formlayout)
  43. pass
  44. pass
  45. if __name__ == '__main__': # 只有这个文件单独执行才会调用该语句
  46. app = QApplication(sys.argv) # 传入参数
  47. main = QLineEditValidator()
  48. main.show()
  49. sys.exit(app.exec_()) # 进入程序的主循环

结果

第三章 基本窗口控件 - 图16

使用掩码限制QLineEdit控件的输入

不理解什么是必须输入的,允许输入的?
字符 含义
A ASCII字母字符是必须输入的(A-Z、a-z)
a ASCII字母字符是允许输入的,但不是必须的(A-Z、a-z)
N ASCII字母字符是必须输入的(A-Z、a-z、0-9)
n ASCII字母字符是允许输入的,但不是必须的(A-Z、a-z、0-9)
X 任何字符都是必须输入的
x 任何字符都是允许输入的,但不是必须输入的
9 ASCII数字字符是必须输入的(0-9)
0 ASCII数字字符是允许输入的,但不是必须的(0-9)
D ASCII数字字符是必须输入的(1-9)
d ASCII数字字符是允许输入的,但不是必须的(1-9)
# ASCII数字字符或加减符号是允许输入的,但不是必须的
H 十六进制格式字符是必须输入的(A-F、a-f、0-9)
h 十六进制格式字符是允许输入的,但不是必须输入的(A-F、a-f、0-9)
B 二进制格式字符是必须输入的(0-1)
b 二进制格式字符是允许输入的,但不是必须的(0-1)
> 所有的字母字符都大写
< 所有的字母字符都是小写
! 关闭大小写转换
\ 使用”\”转义上面列出的字符

代码

  1. import sys
  2. from PyQt5.QtWidgets import *
  3. class QLineEditMask(QWidget):
  4. def __init__(self):
  5. super(QLineEditMask, self).__init__()
  6. self.initUI()
  7. pass
  8. def initUI(self):
  9. self.setWindowTitle('用掩码限制QLineEdit控件的输入')
  10. # 创建四个控件
  11. ipLineEdit = QLineEdit()
  12. macLineEdit = QLineEdit()
  13. dateLineEdit = QLineEdit()
  14. licenseEdit = QLineEdit()
  15. #设置掩码
  16. ipLineEdit.setInputMask('000.000.00.00;_') # 192.168.21.45,当没有输入时是下划线,0:ASCII数字字符是允许输入的,但不是必须的(0-9)
  17. macLineEdit.setInputMask('HH:HH:HH:HH:HH:HH;_') # mac地址是两个两个的,H:十六进制格式字符是必须输入的(A-F、a-f、0-9)
  18. dateLineEdit.setInputMask('0000-00-00') # 设置日期
  19. licenseEdit.setInputMask('>AAAAA-AAAAA-AAAAA-AAAAA;#') # >:设置所有的字母字符都大写,A:ASCII字母字符是必须输入的(A-Z、a-z)
  20. # 创建表单布局,把三个控件加入到表单中
  21. formlayout = QFormLayout()
  22. formlayout.addRow('数字掩码 :', ipLineEdit)
  23. formlayout.addRow('Mac掩码 :', macLineEdit)
  24. formlayout.addRow('日期掩码 :', dateLineEdit)
  25. formlayout.addRow('许可证掩码:', licenseEdit)
  26. # 应用表单布局
  27. self.setLayout(formlayout)
  28. pass
  29. pass
  30. if __name__ == '__main__': # 只有这个文件单独执行才会调用该语句
  31. app = QApplication(sys.argv) # 传入参数
  32. main = QLineEditMask()
  33. main.show()
  34. sys.exit(app.exec_()) # 进入程序的主循环

结果

第三章 基本窗口控件 - 图17

QLineEdit控件综合案例

代码

  1. import sys
  2. from PyQt5.QtWidgets import *
  3. from PyQt5.QtGui import *
  4. from PyQt5.QtCore import Qt
  5. class QLineEditDemo(QWidget):
  6. def __init__(self): # 实例化对象的时候自动调用,完成一些初始化设置
  7. super(QLineEditDemo, self).__init__()
  8. self.initUI()
  9. pass
  10. def initUI(self):
  11. self.setWindowTitle('QLineEdit控件综合案例')
  12. # 创建多个QLineEdit控件
  13. edit1 = QLineEdit()
  14. edit2 = QLineEdit()
  15. edit3 = QLineEdit()
  16. edit4 = QLineEdit()
  17. edit5 = QLineEdit()
  18. # 使用整数校验器
  19. edit1.setValidator(QIntValidator()) # 使用整数校验器
  20. edit1.setMaxLength(4) # 最多不超过四位
  21. edit1.setAlignment(Qt.AlignRight) # 设置文本对齐方式为右对齐
  22. edit1.setFont(QFont('Arial', 20)) # 设置字体为Arial,字号为20
  23. # 使用浮点校验器
  24. edit2.setValidator(QDoubleValidator(0.99, 99.99, 2)) # 范围(0.99,99.99)精度是2
  25. # 使用掩码
  26. edit3.setInputMask('99_9999_999999;#')
  27. # 用信号绑定事件
  28. edit4.textChanged.connect(self.textChanged)
  29. # 使用密码类型的回显模式,绑定事件
  30. edit5.setEchoMode(QLineEdit.Password)
  31. edit5.editingFinished.connect(self.enterPress)
  32. # 设置为只读模式
  33. edit6 = QLineEdit('Hello PyQt5')
  34. edit6.setReadOnly(True)
  35. # 创建表单布局,将控件放在表单中
  36. formLayout = QFormLayout()
  37. formLayout.addRow('整数校验器', edit1)
  38. formLayout.addRow('浮点数校验器', edit2)
  39. formLayout.addRow('Input Mask', edit3)
  40. formLayout.addRow('文本变化', edit4)
  41. formLayout.addRow('密码', edit5)
  42. formLayout.addRow('只读', edit6)
  43. # 应用表单布局
  44. self.setLayout(formLayout)
  45. pass
  46. def textChanged(self, text):
  47. print('输入的内容:' + text)
  48. pass
  49. def enterPress(self):
  50. print('已输入的值')
  51. pass
  52. pass
  53. if __name__ == '__main__': # 只有这个文件单独执行才会调用该语句
  54. app = QApplication(sys.argv) # 传入参数
  55. main = QLineEditDemo()
  56. main.show()
  57. sys.exit(app.exec_()) # 进入程序的主循环

结果

第三章 基本窗口控件 - 图18

使用QLineEdit控件输入多行文本

代码

结果

按钮控件QPushButton

画板

在QPushButton上显示文本

代码

  1. # 按钮可以支持图像
  2. # 按钮可以支持开关
  3. import sys
  4. from PyQt5.QtWidgets import *
  5. from PyQt5.QtGui import *
  6. from PyQt5.QtCore import *
  7. class QPushButtonDemo(QDialog):
  8. def __init__(self):
  9. super(QPushButtonDemo, self).__init__()
  10. self.initUI()
  11. pass
  12. def initUI(self):
  13. self.setWindowTitle('QPushButton Demo')
  14. # 创建Button控件
  15. self.button1 = QPushButton('第一个按钮')
  16. # 使用垂直布局
  17. layout = QVBoxLayout()
  18. # 设置第一个按钮
  19. self.button1.setText('First Button') # 用setTex来获得文本
  20. self.button1.setCheckable(True) # 要设置开关,先要设置为可复选的
  21. self.button1.toggle() # 用来设置开关,按一下不会自动的弹起来
  22. self.button1.clicked.connect(lambda: self.whichButton(self.button1)) # 用lambda表达式调用whichButton方法,不写的话是内部自动调用
  23. self.button1.clicked.connect(self.buttonState) # 用lambda表达式调用whichButton方法,不写的话是内部自动调用
  24. # 将按钮加到布局中
  25. layout.addWidget(self.button1)
  26. # 应用垂直布局
  27. self.setLayout(layout)
  28. # 使信号连接
  29. pass
  30. def whichButton(self,btn):
  31. '''
  32. 知道哪个按钮被单击了,因为有多个信号同时使用这个槽,通过传参数确定
  33. :return: 返回被单击的按钮
  34. '''
  35. print('被单机的按钮是<' + btn.text() + '>')
  36. pass
  37. def buttonState(self):
  38. if self.button1.isChecked():
  39. print('button1已经被选中')
  40. else:
  41. print('button1未被选中')
  42. pass
  43. pass
  44. pass
  45. if __name__ == '__main__': # 只有这个文件单独执行才会调用该语句
  46. app = QApplication(sys.argv) # 传入参数
  47. main = QPushButtonDemo()
  48. main.show()
  49. sys.exit(app.exec_()) # 进入程序的主循环

结果

第三章 基本窗口控件 - 图20

在QPushButton上显示图像

代码

  1. # 按钮可以支持图像
  2. import sys
  3. from PyQt5.QtWidgets import *
  4. from PyQt5.QtGui import *
  5. class QPushButtonDemo(QDialog):
  6. def __init__(self):
  7. super(QPushButtonDemo, self).__init__()
  8. self.initUI()
  9. pass
  10. def initUI(self):
  11. self.setWindowTitle('QPushButton Demo')
  12. # 创建Button控件
  13. self.button1 = QPushButton('图像按钮')
  14. # 使用垂直布局
  15. layout = QVBoxLayout()
  16. # 设置第一个按钮,在QPushButton上显示图像
  17. self.button1.setIcon(QIcon(QPixmap('./images/camera.ico')))
  18. # 将按钮加到布局中
  19. layout.addWidget(self.button1)
  20. # 绑定槽
  21. self.button1.clicked.connect(lambda: self.whichButton(self.button1)) # 用lambda表达式调用whichButton方法,不写的话是内部自动调用
  22. # 应用垂直布局
  23. self.setLayout(layout)
  24. self.resize(400, 300)
  25. pass
  26. def whichButton(self,btn):
  27. '''
  28. 知道哪个按钮被单击了,因为有多个信号同时使用这个槽,通过传参数确定
  29. :return: 返回被单击的按钮
  30. '''
  31. print('被单机的按钮是<' + btn.text() + '>')
  32. pass
  33. def buttonState(self):
  34. if self.button1.isChecked():
  35. print('button1已经被选中')
  36. else:
  37. print('button1未被选中')
  38. pass
  39. pass
  40. pass
  41. if __name__ == '__main__': # 只有这个文件单独执行才会调用该语句
  42. app = QApplication(sys.argv) # 传入参数
  43. main = QPushButtonDemo()
  44. main.show()
  45. sys.exit(app.exec_()) # 进入程序的主循环

结果

第三章 基本窗口控件 - 图21

让按钮不可用

代码

  1. # 让按钮不可用
  2. import sys
  3. from PyQt5.QtWidgets import *
  4. from PyQt5.QtGui import *
  5. class QPushButtonDemo(QDialog):
  6. def __init__(self):
  7. super(QPushButtonDemo, self).__init__()
  8. self.initUI()
  9. pass
  10. def initUI(self):
  11. self.setWindowTitle('QPushButton Demo')
  12. # 创建Button控件
  13. self.button1 = QPushButton('不可用的按钮')
  14. self.button1.setEnabled(False) # 设置按钮不可用
  15. # 使用垂直布局
  16. layout = QVBoxLayout()
  17. # 将按钮加到布局中
  18. layout.addWidget(self.button1)
  19. # 应用垂直布局
  20. self.setLayout(layout)
  21. self.resize(400, 300)
  22. pass
  23. if __name__ == '__main__': # 只有这个文件单独执行才会调用该语句
  24. app = QApplication(sys.argv) # 传入参数
  25. main = QPushButtonDemo()
  26. main.show()
  27. sys.exit(app.exec_()) # 进入程序的主循环

结果

第三章 基本窗口控件 - 图22

设置默认的按钮

没有任何按钮被选中,点击回车就是默认按钮被按下。

代码

  1. # 设置默认按钮
  2. import sys
  3. from PyQt5.QtWidgets import *
  4. from PyQt5.QtGui import *
  5. class QPushButtonDemo(QDialog):
  6. def __init__(self):
  7. super(QPushButtonDemo, self).__init__()
  8. self.initUI()
  9. pass
  10. def initUI(self):
  11. self.setWindowTitle('QPushButton Demo')
  12. # 创建Button控件
  13. self.button1 = QPushButton('&MyButton') # 添加热键Alt+M
  14. # 设置默认按钮,一个窗口只能有一个
  15. self.button1.setDefault(True)
  16. # 使用垂直布局
  17. layout = QVBoxLayout()
  18. # 设置第一个按钮,在QPushButton上显示图像
  19. self.button1.setIcon(QIcon(QPixmap('./images/camera.ico')))
  20. # 将按钮加到布局中
  21. layout.addWidget(self.button1)
  22. # 绑定槽
  23. self.button1.clicked.connect(lambda: self.whichButton(self.button1)) # 用lambda表达式调用whichButton方法,不写的话是内部自动调用
  24. # 应用垂直布局
  25. self.setLayout(layout)
  26. self.resize(400, 300)
  27. pass
  28. def whichButton(self,btn):
  29. '''
  30. 知道哪个按钮被单击了,因为有多个信号同时使用这个槽,通过传参数确定
  31. :return: 返回被单击的按钮
  32. '''
  33. print('被单机的按钮是<' + btn.text() + '>')
  34. pass
  35. pass
  36. if __name__ == '__main__': # 只有这个文件单独执行才会调用该语句
  37. app = QApplication(sys.argv) # 传入参数
  38. main = QPushButtonDemo()
  39. main.show()
  40. sys.exit(app.exec_()) # 进入程序的主循环

结果

第三章 基本窗口控件 - 图23

单选按钮控件

代码

结果

复选框控件

代码

结果

下拉列表控件

代码

结果

计数器控件

代码

结果

滑块控件

代码

结果

已经发生的事情没有办法改变,想好了补救措施,时间到了就去做,想再多浪费再多的时间也没有用。还不如花时间做好当下的事情。