zoukankan      html  css  js  c++  java
  • PyQt5 控件学习(一个一个学习之QAbstractButton)

    QAbstractButton :

    前面说的QObject 和 QWidget 是最主要的两个基类。它们都是gui (Graphical User Interface)编程中的控件的共性。下面就说下他们的子类的学习。

    但是,学习它们子类的时候,我们不是按照它们的继承关系来学习的,而是按照控件的功能来学习的!

    主要分为两部分:基础控件和高级控件

    下面看按钮:

    我们不是直接学QPushButton ,而是要先学它继承的类----QAbstactButton。

    QAbstractButton描述:

    它是所有按钮控件的基类,它提供按钮的通用功能。

    QAbstractButton抽象类:

    我们学习的时候,并不是直接使用这个类别,它是抽象类,我们是借助它的子类来学习的。

    它是没法直接使用的。

    下面验证它不能直接被使用:

     1 from PyQt5.Qt import * #刚开始学习可以这样一下导入
     2 import sys
     3 #1,创建app
     4 app  = QApplication(sys.argv)
     5 
     6 
     7 #2,控件的操作:
     8 #创建控件
     9 window = QWidget()
    10 
    11 
    12 #设置控件
    13 window.setWindowTitle("QAbstractButton的学习")
    14 window.resize(500,500)
    15 
    16 # btn  = QPushButton(window)
    17 btn = QAbstractButton(window)
    18 btn.setText("按钮")
    19 
    20 
    21 #展示控件
    22 window.show()
    23 
    24 #3,进入消息循环
    25 sys.exit(app.exec_())
    26 
    27 '''
    28 TypeError: PyQt5.QtWidgets.QAbstractButton represents a C++ abstract class 
    29     and cannot be instantiated
    30     报错,这样的c++ 抽象类时无法直接被实例化的。只能被继承使用
    31 '''
    抽象类不能直接被使用

    而且,如果使用抽象类的话,就必须让子类实现抽象类中所有的抽象方法,否则报错:

     1 from PyQt5.Qt import * #刚开始学习可以这样一下导入
     2 import sys
     3 
     4 class Btn(QAbstractButton):
     5     pass
     6 
     7 #1,创建app
     8 app  = QApplication(sys.argv)
     9 
    10 
    11 #2,控件的操作:
    12 #创建控件
    13 window = QWidget()
    14 
    15 
    16 #设置控件
    17 window.setWindowTitle("QAbstractButton的学习")
    18 window.resize(500,500)
    19 
    20 btn = Btn(window)
    21 btn.setText("按钮")
    22 
    23 
    24 #展示控件
    25 window.show()
    26 
    27 #3,进入消息循环
    28 sys.exit(app.exec_())
    29 
    30 '''
    31 NotImplementedError: QAbstractButton.paintEvent() is abstract
    32         and must be overridden
    33         这时的错误是,没有实现里面的抽象方法造成的。
    34         它的意思是必须重写  paintEvent() 方法。
    35 '''
    View Code
     1 from PyQt5.Qt import * #刚开始学习可以这样一下导入
     2 import sys
     3 
     4 class Btn(QAbstractButton):
     5     def paintEvent(self, event):
     6         print("绘制按钮")
     7 
     8 #1,创建app
     9 app  = QApplication(sys.argv)
    10 
    11 
    12 #2,控件的操作:
    13 #创建控件
    14 window = QWidget()
    15 
    16 
    17 #设置控件
    18 window.setWindowTitle("QAbstractButton的学习")
    19 window.resize(500,500)
    20 
    21 btn = Btn(window)
    22 btn.setText("按钮")
    23 
    24 
    25 #展示控件
    26 window.show()
    27 
    28 #3,进入消息循环
    29 sys.exit(app.exec_())
    30 
    31 '''
    32 
    33 '''
    实现paintEvent() 方法

    但是,没有什么效果,下面先加点暂时还不讲的代码(后面讲绘图会说 ):

     1 from PyQt5.Qt import * #刚开始学习可以这样一下导入
     2 import sys
     3 
     4 class Btn(QAbstractButton):
     5     def paintEvent(self, event):
     6         print("绘制按钮")
     7         painter = QPainter(self) # 它里面的参数是 QPaintDevice “纸”,所有控件都可以当做纸,因为QWidget也继承了QPaintDevice
     8             #这时就有了画家和 纸
     9 
    10         #给画家支笔
    11         pen = QPen(QColor(100,10,155),10)  #笔的颜色和宽度
    12         painter.setPen(pen)
    13 
    14 
    15         #画家开始画
    16         painter.drawText(25,25,self.text())
    17 
    18         painter.drawEllipse(0,0,100,100)
    19 
    20 #1,创建app
    21 app  = QApplication(sys.argv)
    22 
    23 
    24 #2,控件的操作:
    25 #创建控件
    26 window = QWidget()
    27 
    28 
    29 #设置控件
    30 window.setWindowTitle("QAbstractButton的学习")
    31 window.resize(500,500)
    32 
    33 btn = Btn(window)
    34 
    35 btn.setText("按钮")
    36 btn.resize(100,100)
    37 
    38 
    39 #展示控件
    40 window.show()
    41 
    42 #3,进入消息循环
    43 sys.exit(app.exec_())
    44 
    45 '''
    46 
    47 '''
    View Code

    那么我们自定义的Btn类对象的按钮能不能接收到用户的点击事件呢?

    是可以的。

     1 from PyQt5.Qt import * #刚开始学习可以这样一下导入
     2 import sys
     3 
     4 class Btn(QAbstractButton):
     5     def paintEvent(self, event):
     6         # print("绘制按钮")
     7         painter = QPainter(self) # 它里面的参数是 QPaintDevice “纸”,所有控件都可以当做纸,因为QWidget也继承了QPaintDevice
     8             #这时就有了画家和 纸
     9 
    10         #给画家支笔
    11         pen = QPen(QColor(100,10,155),10)  #笔的颜色和宽度
    12         painter.setPen(pen)
    13 
    14 
    15         #画家开始画
    16         painter.drawText(25,25,self.text())
    17 
    18         painter.drawEllipse(0,0,100,100)
    19 
    20 #1,创建app
    21 app  = QApplication(sys.argv)
    22 
    23 
    24 #2,控件的操作:
    25 #创建控件
    26 window = QWidget()
    27 
    28 
    29 #设置控件
    30 window.setWindowTitle("QAbstractButton的学习")
    31 window.resize(500,500)
    32 
    33 btn = Btn(window)
    34 
    35 btn.setText("按钮")
    36 btn.resize(100,100)
    37 btn.pressed.connect(lambda :print("点击了这个按钮"))
    38 
    39 
    40 
    41 
    42 #展示控件
    43 window.show()
    44 
    45 #3,进入消息循环
    46 sys.exit(app.exec_())
    47 
    48 '''
    49 
    50 '''
    View Code

    其实,QPushButton ,也就是大概这个样子继承QAbstarctButton 然后绘制按钮的。

    总结:QAbstactButton 不能直接使用,要通过继承它来使用,而且必须要实现它的抽象方法。

    所以一般情况下,我们是不重写它,只有当我们对已有类不满意时,可以使用它。

    下面我们说QAbstractButton 的时候,是用已有的类来做讲解,而不是直接使用自己定义去继承它,然后自己写上面的那个QPaintEvent() 方法。(麻烦)

    一:QAbstractButton功能作用之提示文本:

    直接通过案例来!

     1 from PyQt5.Qt import * #刚开始学习可以这样一下导入
     2 import sys
     3 #1,创建app
     4 app  = QApplication(sys.argv)
     5 
     6 
     7 #2,控件的操作:
     8 #创建控件
     9 window = QWidget()
    10 
    11 
    12 #设置控件
    13 window.setWindowTitle("QAbstractButton提示文本")
    14 window.resize(500,500)
    15 
    16 
    17 btn = QPushButton(window)
    18 btn.setText("1")
    19 
    20 def btn_pressed_slot():
    21     num = int(btn.text())+1
    22     btn.setText(str(num))
    23 
    24 btn.pressed.connect(btn_pressed_slot)  # 用clicked 也可以
    25 
    26 
    27 #展示控件
    28 window.show()
    29 
    30 #3,进入消息循环
    31 sys.exit(app.exec_())
    点击按钮加1

    二:QAbstractButton功能作用之图标相关:

    API:

     1 from PyQt5.Qt import * #刚开始学习可以这样一下导入
     2 import sys
     3 #1,创建app
     4 app  = QApplication(sys.argv)
     5 
     6 
     7 #2,控件的操作:
     8 #创建控件
     9 window = QWidget()
    10 
    11 
    12 #设置控件
    13 window.setWindowTitle("QAbstractButton提示文本")
    14 window.resize(500,500)
    15 
    16 
    17 btn = QPushButton(window)
    18 btn.setText("1")
    19 
    20 def btn_pressed_slot():
    21     num = int(btn.text())+1
    22     btn.setText(str(num))
    23 
    24 btn.pressed.connect(btn_pressed_slot)  # 用clicked 也可以
    25 
    26 ############################图标相关API###############################
    27 
    28 icon = QIcon("icon.ico")
    29 btn.setIcon(icon)
    30 
    31 size = QSize(50,50)
    32 btn.setIconSize(size)
    33 
    34 #获取图标
    35 print(btn.icon())  #<PyQt5.QtGui.QIcon object at 0x000001D7C7CB3B88>
    36 print(btn.iconSize())  #PyQt5.QtCore.QSize(50, 50)
    37 
    38 
    39 ############################图标相关API###############################
    40 
    41 
    42 
    43 
    44 #展示控件
    45 window.show()
    46 
    47 #3,进入消息循环
    48 sys.exit(app.exec_())
    View Code

    三:QAbstractButton功能作用之快捷键:

    操作一个按钮的几种常用方式:

    1,直接鼠标点击

    2,当按钮获取焦点后,通过空格键触发

    3,按钮没有后去焦点,通过快捷键来触发。

    前面的两种都是默认成立的,下面看快捷键:

    主要分两种:

    先看第一种,是显示文本的:

     1 from PyQt5.Qt import * #刚开始学习可以这样一下导入
     2 import sys
     3 #1,创建app
     4 app  = QApplication(sys.argv)
     5 
     6 
     7 #2,控件的操作:
     8 #创建控件
     9 window = QWidget()
    10 
    11 
    12 #设置控件
    13 window.setWindowTitle("QAbstractButton提示文本")
    14 window.resize(500,500)
    15 
    16 
    17 ############################快捷键设置方式,用& ###############################
    18 btn = QPushButton(window)
    19 btn.move(100,100)
    20 btn.setText("按钮2&abc")
    21 #它的快捷键只能是  alt 加相应的字母    
    22 ############################快捷键设置方式,用& ###############################
    23 
    24 btn = QPushButton(window)
    25 btn.setText("1")
    26 
    27 def btn_pressed_slot():
    28     num = int(btn.text())+1
    29     btn.setText(str(num))
    30 
    31 btn.pressed.connect(btn_pressed_slot)  # 用clicked 也可以
    32 
    33 ############################图标相关API###############################
    34 
    35 icon = QIcon("icon.ico")
    36 btn.setIcon(icon)
    37 
    38 size = QSize(50,50)
    39 btn.setIconSize(size)
    40 
    41 #获取图标
    42 print(btn.icon())  #<PyQt5.QtGui.QIcon object at 0x000001D7C7CB3B88>
    43 print(btn.iconSize())  #PyQt5.QtCore.QSize(50, 50)
    44 
    45 
    46 ############################图标相关API###############################
    47 
    48 
    49 
    50 
    51 #展示控件
    52 window.show()
    53 
    54 #3,进入消息循环
    55 sys.exit(app.exec_())
    快捷键之要显示文本的按钮

    第二种,没有显示文本的:(这时不一定是alt + 其他 ,例如:ctrl +a )

     1 from PyQt5.Qt import * #刚开始学习可以这样一下导入
     2 import sys
     3 #1,创建app
     4 app  = QApplication(sys.argv)
     5 
     6 
     7 #2,控件的操作:
     8 #创建控件
     9 window = QWidget()
    10 
    11 
    12 #设置控件
    13 window.setWindowTitle("QAbstractButton提示文本")
    14 window.resize(500,500)
    15 
    16 
    17 ############################快捷键设置方式,用& ###############################
    18 # btn1 = QPushButton(window)
    19 # btn1.move(100,100)
    20 # btn1.setText("按钮2&abc")
    21 #它的快捷键只能是  alt 加相应的字母    
    22 ############################快捷键设置方式,用& ###############################
    23 
    24 
    25 ############################快捷键设置方式,用setShortcut()###############################
    26 btn2 = QPushButton(window)
    27 btn2.setText("1")
    28 btn2.setShortcut("Ctrl+a")  
    29 
    30 
    31 ############################快捷键设置方式,用setShortcut()###############################
    32 
    33 
    34 btn2.pressed.connect(lambda :print("btn2被点"))  # 用clicked 也可以
    35 
    36 ############################图标相关API###############################
    37 
    38 icon = QIcon("icon.ico")
    39 btn2.setIcon(icon)
    40 
    41 size = QSize(50,50)
    42 btn2.setIconSize(size)
    43 
    44 ############################图标相关API###############################
    45 
    46 
    47 
    48 
    49 #展示控件
    50 window.show()
    51 
    52 #3,进入消息循环
    53 sys.exit(app.exec_())
    使用setShortcut() 来设置

    四:QAbstractButton功能作用之自动重复:

    自动重复指的是,如果用户按住某个键不松开的话,就不断的自动重复它,不断触发它所对应的槽函数。

    API:

     1 from PyQt5.Qt import * #刚开始学习可以这样一下导入
     2 import sys
     3 #1,创建app
     4 app  = QApplication(sys.argv)
     5 
     6 
     7 #2,控件的操作:
     8 #创建控件
     9 window = QWidget()
    10 
    11 
    12 #设置控件
    13 window.setWindowTitle("QAbstractButton提示文本")
    14 window.resize(500,500)
    15 
    16 btn = QPushButton(window)
    17 btn.pressed.connect(lambda :print("我是按钮"))
    18 
    19 
    20 icon = QIcon("icon.ico")
    21 btn.setIcon(icon)
    22 
    23 size = QSize(50,50)
    24 btn.setIconSize(size)
    25 
    26 ############################自动重复相关###############################
    27 #查看是否自动重复
    28 print(btn.autoRepeat())
    29 
    30 #设置自动重复
    31 btn.setAutoRepeat(True)
    32 
    33 btn.setAutoRepeatDelay(2000)  #初次检测延迟为2s
    34 
    35 btn.setAutoRepeatInterval(1000)  #重复检测间隔为1s
    36 
    37 
    38 print(btn.autoRepeatDelay())   #首次延迟
    39 print(btn.autoRepeatInterval()) #以后的触发间隔
    40 
    41 
    42 
    43 ############################自动重复相关###############################
    44 
    45 
    46 
    47 #展示控件
    48 window.show()
    49 
    50 #3,进入消息循环
    51 sys.exit(app.exec_())
    自动重复相关

    自动重复案例:

     1 from PyQt5.Qt import * #刚开始学习可以这样一下导入
     2 import sys
     3 #1,创建app
     4 app  = QApplication(sys.argv)
     5 
     6 
     7 #2,控件的操作:
     8 #创建控件
     9 window = QWidget()
    10 
    11 
    12 #设置控件
    13 window.setWindowTitle("QAbstractButton提示文本")
    14 window.resize(500,500)
    15 
    16 
    17 btn = QPushButton(window)
    18 btn.setText("1")
    19 
    20 def btn_pressed_slot():
    21     num = int(btn.text())+1
    22     btn.setText(str(num))
    23 
    24 ############################自动重复案例###############################
    25 btn.pressed.connect(btn_pressed_slot)  # 用clicked 也可以
    26 btn.setAutoRepeat(True)
    27 ############################自动重复案例###############################
    28 
    29 
    30 
    31 #展示控件
    32 window.show()
    33 
    34 #3,进入消息循环
    35 sys.exit(app.exec_())
    36 
    37 点击按钮加1
    View Code

    五:QAbstractButton功能作用之状态:

    API

    API之isDown():

    是否按下指的是按键按下去,不松手。

     1 from PyQt5.Qt import * #刚开始学习可以这样一下导入
     2 import sys
     3 #1,创建app
     4 app  = QApplication(sys.argv)
     5 
     6 
     7 #2,控件的操作:
     8 #创建控件
     9 window = QWidget()
    10 
    11 
    12 #设置控件
    13 window.setWindowTitle("QAbstractButton之按钮的状态")
    14 window.resize(500,500)
    15 
    16 push_button = QPushButton(window)
    17 push_button.setText("这是QPushButton")
    18 push_button.move(100,50)
    19 
    20 radio_button = QRadioButton(window)
    21 radio_button.setText("这是QRadioButton")
    22 radio_button.move(100,100)
    23 
    24 check_box = QCheckBox(window)
    25 check_box.setText("这是QCheckBox")
    26 check_box.move(100,150)
    27 
    28 ############################设置三个按钮为被按下的状态###############################
    29 
    30 push_button.setDown(True)
    31 radio_button.setDown(True)
    32 check_box.setDown(True)
    33 
    34 ############################设置三个按钮为被按下的状态###############################
    35 
    36 
    37 
    38 
    39 
    40 #展示控件
    41 window.show()
    42 
    43 #3,进入消息循环
    44 sys.exit(app.exec_())
    设置三个按钮为被按下的状态

    而且,根据按钮的状态可以通过qss来设置它的样式,

    例如:

     1 from PyQt5.Qt import * #刚开始学习可以这样一下导入
     2 import sys
     3 #1,创建app
     4 app  = QApplication(sys.argv)
     5 
     6 
     7 #2,控件的操作:
     8 #创建控件
     9 window = QWidget()
    10 
    11 
    12 #设置控件
    13 window.setWindowTitle("QAbstractButton之按钮的状态")
    14 window.resize(500,500)
    15 
    16 push_button = QPushButton(window)
    17 push_button.setText("这是QPushButton")
    18 push_button.move(100,50)
    19 
    20 radio_button = QRadioButton(window)
    21 radio_button.setText("这是QRadioButton")
    22 radio_button.move(100,100)
    23 
    24 check_box = QCheckBox(window)
    25 check_box.setText("这是QCheckBox")
    26 check_box.move(100,150)
    27 
    28 push_button.setDown(True)
    29 radio_button.setDown(True)
    30 check_box.setDown(True)
    31 
    32 ############################给qpushbutton加个样式###############################
    33 
    34 push_button.setStyleSheet("QPushButton:pressed {background-color:red;}")
    35 #样式的意思是,当push_button 被按下的时候是红色,  不被按下不起作用。
    36 
    37 
    38 ############################给qpushbutton加个样式###############################
    39 
    40 
    41 
    42 
    43 
    44 #展示控件
    45 window.show()
    46 
    47 #3,进入消息循环
    48 sys.exit(app.exec_())
    View Code

    API之isChecked():

    先看,三个按钮是否可以被选中。

     1 from PyQt5.Qt import * #刚开始学习可以这样一下导入
     2 import sys
     3 #1,创建app
     4 app  = QApplication(sys.argv)
     5 
     6 
     7 #2,控件的操作:
     8 #创建控件
     9 window = QWidget()
    10 
    11 
    12 #设置控件
    13 window.setWindowTitle("QAbstractButton之按钮的状态")
    14 window.resize(500,500)
    15 
    16 push_button = QPushButton(window)
    17 push_button.setText("这是QPushButton")
    18 push_button.move(100,50)
    19 
    20 radio_button = QRadioButton(window)
    21 radio_button.setText("这是QRadioButton")
    22 radio_button.move(100,100)
    23 
    24 check_box = QCheckBox(window)
    25 check_box.setText("这是QCheckBox")
    26 check_box.move(100,150)
    27 
    28 push_button.setDown(True)
    29 radio_button.setDown(True)
    30 check_box.setDown(True)
    31  
    32 ###########################################################
    33 print(push_button.isCheckable())  #False
    34 print(radio_button.isCheckable()) #True
    35 print(check_box.isCheckable())    #True
    36 
    37 ###########################################################
    38 
    39 
    40 #展示控件
    41 window.show()
    42 
    43 #3,进入消息循环
    44 sys.exit(app.exec_())
    View Code

    这说明push_button 默认是不可以被选中的,但是我们可以通过setCheckable(True) 来设置它被选中,(具体的样式好坏可以通过qss 来设置)。

    是否被选中和设置选中:

     1 from PyQt5.Qt import * #刚开始学习可以这样一下导入
     2 import sys
     3 #1,创建app
     4 app  = QApplication(sys.argv)
     5 
     6 
     7 #2,控件的操作:
     8 #创建控件
     9 window = QWidget()
    10 
    11 
    12 #设置控件
    13 window.setWindowTitle("QAbstractButton之按钮的状态")
    14 window.resize(500,500)
    15 
    16 push_button = QPushButton(window)
    17 push_button.setText("这是QPushButton")
    18 push_button.move(100,50)
    19 
    20 radio_button = QRadioButton(window)
    21 radio_button.setText("这是QRadioButton")
    22 radio_button.move(100,100)
    23 
    24 check_box = QCheckBox(window)
    25 check_box.setText("这是QCheckBox")
    26 check_box.move(100,150)
    27 
    28 push_button.setDown(True)
    29 radio_button.setDown(True)
    30 check_box.setDown(True)
    31 
    32 ############################是否被选中以及设置选中它###############################
    33 print(push_button.isChecked())
    34 print(radio_button.isChecked())
    35 print(check_box.isChecked())
    36 
    37 push_button.setChecked(True)
    38 radio_button.setChecked(True)
    39 check_box.setChecked(True)
    40 
    41 ############################是否被选中以及设置选中它###############################
    42 
    43 
    44 
    45 #展示控件
    46 window.show()
    47 
    48 #3,进入消息循环
    49 sys.exit(app.exec_())
    View Code

    使用toggle() 来切换选中与非选中两种状态。

     1 from PyQt5.Qt import * #刚开始学习可以这样一下导入
     2 import sys
     3 #1,创建app
     4 app  = QApplication(sys.argv)
     5 
     6 
     7 #2,控件的操作:
     8 #创建控件
     9 window = QWidget()
    10 
    11 
    12 #设置控件
    13 window.setWindowTitle("QAbstractButton之按钮的状态")
    14 window.resize(500,500)
    15 
    16 
    17 
    18 
    19 push_button = QPushButton(window)
    20 push_button.setText("这是QPushButton")
    21 push_button.move(100,50)
    22 push_button.setCheckable(True)
    23 
    24 radio_button = QRadioButton(window)
    25 radio_button.setText("这是QRadioButton")
    26 radio_button.move(100,100)
    27 
    28 check_box = QCheckBox(window)
    29 check_box.setText("这是QCheckBox")
    30 check_box.move(100,150)
    31 
    32 push_button.setDown(True)
    33 radio_button.setDown(True)
    34 check_box.setDown(True)
    35 
    36 ############################切换按钮###############################
    37 btn = QPushButton(window)
    38 btn.setText("切换状态按钮")
    39 
    40 def btn_pressed_slot():
    41     push_button.toggle()
    42     radio_button.toggle()
    43     check_box.toggle()
    44 
    45 btn.pressed.connect(btn_pressed_slot)
    46 
    47 ############################切换按钮###############################
    48 
    49 
    50 #展示控件
    51 window.show()
    52 
    53 #3,进入消息循环
    54 sys.exit(app.exec_())
    toggle 切换按钮的选中状态

    其实,如果没有toggle ,我们也很容易做,

     1 from PyQt5.Qt import * #刚开始学习可以这样一下导入
     2 import sys
     3 #1,创建app
     4 app  = QApplication(sys.argv)
     5 
     6 
     7 #2,控件的操作:
     8 #创建控件
     9 window = QWidget()
    10 
    11 
    12 #设置控件
    13 window.setWindowTitle("QAbstractButton之按钮的状态")
    14 window.resize(500,500)
    15 
    16 
    17 
    18 
    19 push_button = QPushButton(window)
    20 push_button.setText("这是QPushButton")
    21 push_button.move(100,50)
    22 push_button.setCheckable(True)
    23 
    24 radio_button = QRadioButton(window)
    25 radio_button.setText("这是QRadioButton")
    26 radio_button.move(100,100)
    27 
    28 check_box = QCheckBox(window)
    29 check_box.setText("这是QCheckBox")
    30 check_box.move(100,150)
    31 
    32 push_button.setDown(True)
    33 radio_button.setDown(True)
    34 check_box.setDown(True)
    35 
    36 ############################切换按钮###############################
    37 btn = QPushButton(window)
    38 btn.setText("切换状态按钮")
    39 
    40 def btn_pressed_slot():
    41     push_button.setChecked(not push_button.isChecked())
    42     radio_button.setChecked(not radio_button.isChecked())
    43     check_box.setChecked(not check_box.isChecked())
    44     
    45 
    46 btn.pressed.connect(btn_pressed_slot)
    47 
    48 ############################切换按钮###############################
    49 
    50 
    51 #展示控件
    52 window.show()
    53 
    54 #3,进入消息循环
    55 sys.exit(app.exec_())
    View Code

    API之能用与否

     1 from PyQt5.Qt import * #刚开始学习可以这样一下导入
     2 import sys
     3 #1,创建app
     4 app  = QApplication(sys.argv)
     5 
     6 
     7 #2,控件的操作:
     8 #创建控件
     9 window = QWidget()
    10 
    11 
    12 #设置控件
    13 window.setWindowTitle("QAbstractButton之按钮的状态")
    14 window.resize(500,500)
    15 
    16 
    17 
    18 
    19 push_button = QPushButton(window)
    20 push_button.setText("这是QPushButton")
    21 push_button.move(100,50)
    22 push_button.setCheckable(True)
    23 
    24 radio_button = QRadioButton(window)
    25 radio_button.setText("这是QRadioButton")
    26 radio_button.move(100,100)
    27 
    28 check_box = QCheckBox(window)
    29 check_box.setText("这是QCheckBox")
    30 check_box.move(100,150)
    31 
    32 push_button.setDown(True)
    33 radio_button.setDown(True)
    34 check_box.setDown(True)
    35 
    36 ############################设置 不能用###############################
    37 push_button.setEnabled(False)
    38 radio_button.setEnabled(False)
    39 check_box.setEnabled(False )
    40 
    41 ############################设置 不能用###############################
    42 
    43 
    44 #展示控件
    45 window.show()
    46 
    47 #3,进入消息循环
    48 sys.exit(app.exec_())
    View Code

    虽然这时候,我们通过setEnabled(False) 使得三个控件不可用了,但是如果用代码setChecked()还是可以操控三个按钮的。

    六:QAbstractButton功能作用之排他性:

    排他性:就是类似于男女性别的设置。

    API :

     1 from PyQt5.Qt import * #刚开始学习可以这样一下导入
     2 import sys
     3 #1,创建app
     4 app  = QApplication(sys.argv)
     5 
     6 
     7 #2,控件的操作:
     8 #创建控件
     9 window = QWidget()
    10 
    11 
    12 #设置控件
    13 window.setWindowTitle("QAbstractButton之按钮的状态")
    14 window.resize(500,500)
    15 
    16 
    17 ############################排他性###############################
    18 for i in range(3):
    19     btn = QPushButton(window)
    20     btn.setText("btn"+str(i))
    21     btn.move(50*i,50*i)
    22 
    23     btn.setCheckable(True)  # 先要让它能够被选中
    24     print(btn.autoExclusive())  #默认都是不排他的
    25 
    26 
    27 ############################排他性###############################
    28 
    29 
    30 #展示控件
    31 window.show()
    32 
    33 #3,进入消息循环
    34 sys.exit(app.exec_())
    默认是不排他的。

    设置排他:

     1 from PyQt5.Qt import * #刚开始学习可以这样一下导入
     2 import sys
     3 #1,创建app
     4 app  = QApplication(sys.argv)
     5 
     6 
     7 #2,控件的操作:
     8 #创建控件
     9 window = QWidget()
    10 
    11 
    12 #设置控件
    13 window.setWindowTitle("QAbstractButton之按钮的状态")
    14 window.resize(500,500)
    15 
    16 
    17 ############################排他性###############################
    18 for i in range(3):
    19     btn = QPushButton(window)
    20     btn.setText("btn"+str(i))
    21     btn.move(50*i,50*i)
    22 
    23     btn.setCheckable(True)  # 先要让它能够被选中
    24     # print(btn.autoExclusive())  #默认都是不排他的
    25     btn.setAutoExclusive(True)  
    26 
    27 ############################排他性###############################
    28 
    29 
    30 #展示控件
    31 window.show()
    32 
    33 #3,进入消息循环
    34 sys.exit(app.exec_())
    View Code
     1 from PyQt5.Qt import * #刚开始学习可以这样一下导入
     2 import sys
     3 #1,创建app
     4 app  = QApplication(sys.argv)
     5 
     6 
     7 #2,控件的操作:
     8 #创建控件
     9 window = QWidget()
    10 
    11 
    12 #设置控件
    13 window.setWindowTitle("QAbstractButton之按钮的状态")
    14 window.resize(500,500)
    15 
    16 
    17 ############################排他性###############################
    18 for i in range(3):
    19     btn = QRadioButton(window)
    20     btn.setText("btn"+str(i))
    21     btn.move(50*i,50*i)
    22 
    23     print(btn.autoExclusive())  # Qradiobutton 默认排他
    24     
    25     
    26 
    27 ############################排他性###############################
    28 
    29 
    30 #展示控件
    31 window.show()
    32 
    33 #3,进入消息循环
    34 sys.exit(app.exec_())
    QRadioButton 默认排他
     1 from PyQt5.Qt import * #刚开始学习可以这样一下导入
     2 import sys
     3 #1,创建app
     4 app  = QApplication(sys.argv)
     5 
     6 
     7 #2,控件的操作:
     8 #创建控件
     9 window = QWidget()
    10 
    11 
    12 #设置控件
    13 window.setWindowTitle("QAbstractButton之按钮的状态")
    14 window.resize(500,500)
    15 
    16 
    17 ############################排他性###############################
    18 for i in range(3):
    19     btn = QCheckBox(window)
    20     btn.setText("btn"+str(i))
    21     btn.move(50*i,50*i)
    22 
    23     print(btn.autoExclusive())  # Qradiobutton 默认排他
    24 
    25 ############################排他性###############################
    26 
    27 #展示控件
    28 window.show()
    29 
    30 #3,进入消息循环
    31 sys.exit(app.exec_())
    QCheckBox默认不排他

    七:QAbstractButton功能作用之点击:

    这是用代码模拟用户的点击。

    它的应用场景:假设已经有个按钮和三个槽函数已经连接好了,当点击时会触发三个槽函数,

    但是我们现在想不点击也能触发这三个槽函数。这可以是可以,但是有的时候槽函数不能别获取到(可能别人写的是个匿名函数)。所以这时就要用代码去模拟用户对这个按钮的点击

     1 from PyQt5.Qt import * #刚开始学习可以这样一下导入
     2 import sys
     3 #1,创建app
     4 app  = QApplication(sys.argv)
     5 
     6 
     7 #2,控件的操作:
     8 #创建控件
     9 window = QWidget()
    10 
    11 
    12 #设置控件
    13 window.setWindowTitle("模拟用户点击按钮")
    14 window.resize(500,500)
    15 
    16 
    17 btn = QPushButton(window)
    18 btn.setText("按钮")
    19 btn.move(200,200)
    20 btn.pressed.connect(lambda :print("按钮被点击了"))
    21 
    22 
    23 ############################模拟用户点击###############################
    24 # btn.click()
    25 # btn.click()
    26 
    27 btn.animateClick(2000)  # 长按2s ,让按钮被选中2s,之后再消失,按钮有生命2s 
    28                                 # 2s的动画效果
    29 
    30 ############################模拟用户点击###############################
    31 
    32 
    33 #展示控件
    34 window.show()
    35 
    36 #3,进入消息循环
    37 sys.exit(app.exec_())
    点击和带有动画效果的点击

    八:QAbstractButton功能作用之有效区域设定:

     1 from PyQt5.Qt import * #刚开始学习可以这样一下导入
     2 import sys
     3 
     4 class Btn(QPushButton):
     5     # def hitButton(self, QPoint):
     6     def hitButton(self, point):
     7         print(point)  #用户点击按钮之后,这个函数会将用户点击的点传出来
     8         return True # True代表用户点击的用效
     9 
    10 
    11 #1,创建app
    12 app  = QApplication(sys.argv)
    13 
    14 
    15 #2,控件的操作:
    16 #创建控件
    17 window = QWidget()
    18 
    19 
    20 #设置控件
    21 window.setWindowTitle("QAbstactButton 有效区域")
    22 window.resize(500,500)
    23 
    24 btn = Btn(window)
    25 btn.setText("按钮")
    26 
    27 
    28 
    29 
    30 
    31 
    32 
    33 #展示控件
    34 window.show()
    35 
    36 #3,进入消息循环
    37 sys.exit(app.exec_())
    重写hitButton 获取用户点击的点坐标
     1 from PyQt5.Qt import * #刚开始学习可以这样一下导入
     2 import sys
     3 
     4 class Btn(QPushButton):
     5     # def hitButton(self, QPoint):
     6     def hitButton(self, point):
     7         print(point)  #用户点击按钮之后,这个函数会将用户点击的点传出来
     8         # return True # True代表用户点击的用效 ,会触发信号的发射
     9         return False  # 这时代表点击无效,不会触发信号
    10 
    11 
    12 #1,创建app
    13 app  = QApplication(sys.argv)
    14 
    15 
    16 #2,控件的操作:
    17 #创建控件
    18 window = QWidget()
    19 
    20 
    21 #设置控件
    22 window.setWindowTitle("QAbstactButton 有效区域")
    23 window.resize(500,500)
    24 
    25 btn = Btn(window)
    26 btn.setText("按钮")
    27 btn.pressed.connect(lambda :print("按钮被点击"))
    28 
    29 
    30 
    31 
    32 
    33 
    34 #展示控件
    35 window.show()
    36 
    37 #3,进入消息循环
    38 sys.exit(app.exec_())
    在hitButton()根据它的返回值来决定是否触发信号

    现在的需求是点击按钮的右半部分才有效,左半部分无效。

     1 from PyQt5.Qt import * #刚开始学习可以这样一下导入
     2 import sys
     3 
     4 
     5 ############################点击右半部分才有效###############################
     6 class Btn(QPushButton):
     7     # def hitButton(self, QPoint):
     8     def hitButton(self, point):
     9         print(point)  #用户点击按钮之后,这个函数会将用户点击的点传出来
    10         if point.x() >self.width()/2:
    11             return True
    12         return False
    13 
    14 ############################点击右半部分才有效###############################
    15 
    16 
    17 
    18 
    19 #1,创建app
    20 app  = QApplication(sys.argv)
    21 
    22 
    23 #2,控件的操作:
    24 #创建控件
    25 window = QWidget()
    26 
    27 
    28 #设置控件
    29 window.setWindowTitle("QAbstactButton 有效区域")
    30 window.resize(500,500)
    31 
    32 btn = Btn(window)
    33 btn.setText("按钮")
    34 btn.pressed.connect(lambda :print("按钮被点击"))
    35 
    36 
    37 
    38 
    39 
    40 
    41 #展示控件
    42 window.show()
    43 
    44 #3,进入消息循环
    45 sys.exit(app.exec_())
    View Code

     1 from PyQt5.Qt import * #刚开始学习可以这样一下导入
     2 import sys
     3 
     4 
     5 ############################点击内切圆内才有效###############################
     6 class Btn(QPushButton):
     7     # def hitButton(self, QPoint):
     8     def hitButton(self, point):
     9         print(point)  #用户点击按钮之后,这个函数会将用户点击的点传出来
    10         cir_x = self.width()/2
    11         cir_y = self.height()/2
    12 
    13         hit_x = point.x()
    14         hit_y = point.y()
    15 
    16         if pow(hit_x-cir_x,2)+pow(hit_y-cir_y,2) >pow(self.width()/2,2):
    17             return False
    18         return True
    19 ############################点击内切圆内才有效###############################
    20 
    21 
    22 
    23 
    24 #1,创建app
    25 app  = QApplication(sys.argv)
    26 
    27 
    28 #2,控件的操作:
    29 #创建控件
    30 window = QWidget()
    31 
    32 
    33 #设置控件
    34 window.setWindowTitle("QAbstactButton 有效区域")
    35 window.resize(500,500)
    36 
    37 btn = Btn(window)
    38 btn.setText("按钮")
    39 btn.pressed.connect(lambda :print("按钮被点击"))
    40 btn.resize(200,200)
    41 
    42 
    43 
    44 
    45 
    46 #展示控件
    47 window.show()
    48 
    49 #3,进入消息循环
    50 sys.exit(app.exec_())
    View Code

    我们也可以把那个内切圆画出来:

      1 from PyQt5.Qt import * #刚开始学习可以这样一下导入
      2 import sys
      3 
      4 
      5 class Btn(QPushButton):
      6     # def hitButton(self, QPoint):
      7     def hitButton(self, point):
      8         print(point)  #用户点击按钮之后,这个函数会将用户点击的点传出来
      9         cir_x = self.width()/2
     10         cir_y = self.height()/2
     11 
     12         hit_x = point.x()
     13         hit_y = point.y()
     14 
     15         if pow(hit_x-cir_x,2)+pow(hit_y-cir_y,2) >pow(self.width()/2,2):
     16             return False
     17         return True
     18 ############################画内切圆###############################
     19     def paintEvent(self, event):
     20 
     21         painter = QPainter(self) # 它里面的参数是 QPaintDevice “纸”,所有控件都可以当做纸,因为QWidget也继承了QPaintDevice
     22         #这时就有了画家和 纸
     23 
     24         #给画家支笔
     25         pen = QPen(QColor(100,10,155),4)  #笔的颜色和宽度
     26         painter.setPen(pen)
     27 
     28 
     29         #画家开始画
     30         painter.drawEllipse(self.rect()) #这就是两个点,四个值
     31 
     32 
     33 
     34 ############################画内切圆###############################
     35 
     36 
     37 #1,创建app
     38 app  = QApplication(sys.argv)
     39 
     40 
     41 #2,控件的操作:
     42 #创建控件
     43 window = QWidget()
     44 
     45 
     46 #设置控件
     47 window.setWindowTitle("QAbstactButton 有效区域")
     48 window.resize(500,500)
     49 
     50 btn = Btn(window)
     51 btn.setText("按钮")
     52 btn.pressed.connect(lambda :print("按钮被点击"))
     53 btn.resize(200,200)
     54 
     55 
     56 
     57 
     58 
     59 #展示控件
     60 window.show()
     61 
     62 #3,进入消息循环
     63 sys.exit(app.exec_())from PyQt5.Qt import * #刚开始学习可以这样一下导入
     64 import sys
     65 
     66 
     67 class Btn(QPushButton):
     68     # def hitButton(self, QPoint):
     69     def hitButton(self, point):
     70         print(point)  #用户点击按钮之后,这个函数会将用户点击的点传出来
     71         cir_x = self.width()/2
     72         cir_y = self.height()/2
     73 
     74         hit_x = point.x()
     75         hit_y = point.y()
     76 
     77         if pow(hit_x-cir_x,2)+pow(hit_y-cir_y,2) >pow(self.width()/2,2):
     78             return False
     79         return True
     80 ############################画内切圆###############################
     81     def paintEvent(self, event):
     82 
     83         painter = QPainter(self) # 它里面的参数是 QPaintDevice “纸”,所有控件都可以当做纸,因为QWidget也继承了QPaintDevice
     84         #这时就有了画家和 纸
     85 
     86         #给画家支笔
     87         pen = QPen(QColor(100,10,155),4)  #笔的颜色和宽度
     88         painter.setPen(pen)
     89 
     90 
     91         #画家开始画
     92         painter.drawEllipse(self.rect()) #这就是两个点,四个值
     93 
     94 
     95 
     96 ############################画内切圆###############################
     97 
     98 
     99 #1,创建app
    100 app  = QApplication(sys.argv)
    101 
    102 
    103 #2,控件的操作:
    104 #创建控件
    105 window = QWidget()
    106 
    107 
    108 #设置控件
    109 window.setWindowTitle("QAbstactButton 有效区域")
    110 window.resize(500,500)
    111 
    112 btn = Btn(window)
    113 btn.setText("按钮")
    114 btn.pressed.connect(lambda :print("按钮被点击"))
    115 btn.resize(200,200)
    116 
    117 
    118 
    119 
    120 
    121 #展示控件
    122 window.show()
    123 
    124 #3,进入消息循环
    125 sys.exit(app.exec_())
    View Code

    问题:此时原有的文本就没有了,

    调用父类中的方法就行了:

     1 from PyQt5.Qt import * #刚开始学习可以这样一下导入
     2 import sys
     3 
     4 
     5 class Btn(QPushButton):
     6     # def hitButton(self, QPoint):
     7     def hitButton(self, point):
     8         print(point)  #用户点击按钮之后,这个函数会将用户点击的点传出来
     9         cir_x = self.width()/2
    10         cir_y = self.height()/2
    11 
    12         hit_x = point.x()
    13         hit_y = point.y()
    14 
    15         if pow(hit_x-cir_x,2)+pow(hit_y-cir_y,2) >pow(self.width()/2,2):
    16             return False
    17         return True
    18 ############################画内切圆###############################
    19     def paintEvent(self, event):
    20         ###########################################################
    21         super().paintEvent(event) 
    22         ###########################################################
    23         
    24         painter = QPainter(self) # 它里面的参数是 QPaintDevice “纸”,所有控件都可以当做纸,因为QWidget也继承了QPaintDevice
    25         #这时就有了画家和 纸
    26 
    27         #给画家支笔
    28         pen = QPen(QColor(100,10,155),4)  #笔的颜色和宽度
    29         painter.setPen(pen)
    30 
    31 
    32         #画家开始画
    33         painter.drawEllipse(self.rect()) #这就是两个点,四个值
    34 ############################画内切圆###############################
    35 
    36 
    37 #1,创建app
    38 app  = QApplication(sys.argv)
    39 
    40 
    41 #2,控件的操作:
    42 #创建控件
    43 window = QWidget()
    44 
    45 
    46 #设置控件
    47 window.setWindowTitle("QAbstactButton 有效区域")
    48 window.resize(500,500)
    49 
    50 btn = Btn(window)
    51 btn.setText("按钮")
    52 btn.pressed.connect(lambda :print("按钮被点击"))
    53 btn.resize(200,200)
    54 
    55 
    56 
    57 
    58 
    59 #展示控件
    60 window.show()
    61 
    62 #3,进入消息循环
    63 sys.exit(app.exec_())
    View Code

    这就是在父类绘制的基础上,我们又绘制了个内切圆。

    九:QAbstractButton信号:

    pressed 和 released

     1 from PyQt5.Qt import * #刚开始学习可以这样一下导入
     2 import sys
     3 #1,创建app
     4 app  = QApplication(sys.argv)
     5 
     6 
     7 #2,控件的操作:
     8 #创建控件
     9 window = QWidget()
    10 
    11 
    12 #设置控件
    13 window.setWindowTitle("模拟用户点击按钮")
    14 window.resize(500,500)
    15 
    16 
    17 btn = QPushButton(window)
    18 btn.setText("按钮")
    19 btn.move(200,200)
    20 btn.pressed.connect(lambda :print("按钮鼠标被按下了"))
    21 
    22 btn.released.connect(lambda :print("按钮鼠标被释放"))  
    23 
    24 
    25 
    26 #展示控件
    27 window.show()
    28 
    29 #3,进入消息循环
    30 sys.exit(app.exec_())
    View Code

    需要注意的是,对于released ,如果鼠标不松开的时候,当鼠标离开了控件范围,这个信号也会被释放

    clicked 

     1 from PyQt5.Qt import * #刚开始学习可以这样一下导入
     2 import sys
     3 #1,创建app
     4 app  = QApplication(sys.argv)
     5 
     6 
     7 #2,控件的操作:
     8 #创建控件
     9 window = QWidget()
    10 
    11 
    12 #设置控件
    13 window.setWindowTitle("模拟用户点击按钮")
    14 window.resize(500,500)
    15 
    16 
    17 btn = QPushButton(window)
    18 btn.setText("按钮")
    19 btn.move(200,200)
    20 btn.pressed.connect(lambda :print("按钮鼠标被按下了"))
    21 
    22 btn.released.connect(lambda :print("按钮鼠标被释放"))
    23 
    24 btn.clicked.connect(lambda :print("按钮被点击"))
    25 
    26 
    27 #展示控件
    28 window.show()
    29 
    30 #3,进入消息循环
    31 sys.exit(app.exec_())
    View Code

    它要注意的是真正的clicked 指的是在控件的范围内,按下鼠标和松开鼠标。

    clicked 的应用场景是,如果我们点击一个按钮,后悔了之后,我们可以将鼠标移出来,这样就不会触发点击事件了。

    clicked 也往外传递一个参数,它表示的是当前按钮是否是被选中的状态:

     1 from PyQt5.Qt import * #刚开始学习可以这样一下导入
     2 import sys
     3 #1,创建app
     4 app  = QApplication(sys.argv)
     5 
     6 
     7 #2,控件的操作:
     8 #创建控件
     9 window = QWidget()
    10 
    11 
    12 #设置控件
    13 window.setWindowTitle("模拟用户点击按钮")
    14 window.resize(500,500)
    15 
    16 
    17 btn = QPushButton(window)
    18 btn.setText("按钮")
    19 btn.move(200,200)
    20 
    21 btn.pressed.connect(lambda :print("按钮鼠标被按下了"))
    22 
    23 btn.released.connect(lambda :print("按钮鼠标被释放"))
    24 
    25 
    26 ###########################################################
    27 btn.setCheckable(True)
    28 btn.clicked.connect(lambda  arg:print("按钮被点击",arg))
    29 ###########################################################
    30 
    31 
    32 
    33 #展示控件
    34 window.show()
    35 
    36 #3,进入消息循环
    37 sys.exit(app.exec_())
    View Code

    toggled信号:

    它也会往外传递个参数,用来反馈按钮是否被选中。(前提是按钮可以被选中,如果按钮本身不能被选中不会触发它。)

     1 from PyQt5.Qt import * #刚开始学习可以这样一下导入
     2 import sys
     3 #1,创建app
     4 app  = QApplication(sys.argv)
     5 
     6 
     7 #2,控件的操作:
     8 #创建控件
     9 window = QWidget()
    10 
    11 
    12 #设置控件
    13 window.setWindowTitle("模拟用户点击按钮")
    14 window.resize(500,500)
    15 
    16 
    17 btn = QPushButton(window)
    18 btn.setText("按钮")
    19 btn.move(200,200)
    20 
    21 btn.pressed.connect(lambda :print("按钮鼠标被按下了"))
    22 
    23 btn.released.connect(lambda :print("按钮鼠标被释放"))
    24 
    25 
    26 ###########################################################
    27 btn.toggled.connect(lambda arg :print("按钮选中状态发生改变",arg))
    28 #此时是不会触发它的,因为该按钮默认是不能被选中的。
    29 
    30 btn.setCheckable(True)
    31 
    32 ###########################################################
    33 
    34 
    35 
    36 
    37 #展示控件
    38 window.show()
    39 
    40 #3,进入消息循环
    41 sys.exit(app.exec_())
    View Code

    总结:

    以上就是QAbstractButton 的功能,信号!

    继续下个QPushButton:https://www.cnblogs.com/zach0812/p/11366762.html

    from PyQt5.Qt import * #刚开始学习可以这样一下导入
    import sys


    class Btn(QPushButton):
    # def hitButton(self, QPoint):
    def hitButton(self, point):
    print(point) #用户点击按钮之后,这个函数会将用户点击的点传出来
    cir_x = self.width()/2
    cir_y = self.height()/2

    hit_x = point.x()
    hit_y = point.y()

    if pow(hit_x-cir_x,2)+pow(hit_y-cir_y,2) >pow(self.width()/2,2):
    return False
    return True
    ############################画内切圆###############################
    def paintEvent(self, event):
    ###########################################################
    super().paintEvent(event)
    ###########################################################

    painter = QPainter(self) # 它里面的参数是 QPaintDevice “,所有控件都可以当做纸,因为QWidget也继承了QPaintDevice
    #这时就有了画家和 纸

    #给画家支笔
    pen = QPen(QColor(100,10,155),4) #笔的颜色和宽度
    painter.setPen(pen)


    #画家开始画
    painter.drawEllipse(self.rect()) #这就是两个点,四个值
    ############################画内切圆###############################


    #1,创建app
    app = QApplication(sys.argv)


    #2,控件的操作:
    #创建控件
    window = QWidget()


    #设置控件
    window.setWindowTitle("QAbstactButton 有效区域")
    window.resize(500,500)

    btn = Btn(window)
    btn.setText("按钮")
    btn.pressed.connect(lambda :print("按钮被点击"))
    btn.resize(200,200)





    #展示控件
    window.show()

    #3,进入消息循环
    sys.exit(app.exec_())
  • 相关阅读:
    Data Base mysql备份与恢复
    java 乱码问题解决方案
    【知识强化】第二章 物理层 2.1 通信基础
    【知识强化】第二章 进程管理 2.2 处理机调度
    【知识强化】第二章 进程管理 2.1 进程与线程
    【知识强化】第一章 操作系统概述 1.3 操作系统的运行环境
    【知识强化】第一章 网络体系结构 1.1 数据结构的基本概念
    【知识强化】第一章 网络体系结构 1.2 计算机网络体系结构与参考模型
    【知识强化】第一章 网络体系结构 1.1 计算机网络概述
    【知识强化】第一章 操作系统概述 1.1 操作系统的基本概念
  • 原文地址:https://www.cnblogs.com/zach0812/p/11360978.html
Copyright © 2011-2022 走看看