欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > Python----PyQt开发(PyQt高级:组件大小,界面位置,按钮,文本显示,文本输入,字体大小)

Python----PyQt开发(PyQt高级:组件大小,界面位置,按钮,文本显示,文本输入,字体大小)

2025/2/12 0:12:09 来源:https://blog.csdn.net/weixin_64110589/article/details/145555535  浏览:    关键词:Python----PyQt开发(PyQt高级:组件大小,界面位置,按钮,文本显示,文本输入,字体大小)

一、大小

setMinimumSize(width, height)

描述:

        设置控件的最小尺寸。控件不会被缩小到比这个尺寸更小的大小。

参数:

        width: 最小宽度(以像素为单位)。
        height: 最小高度(以像素为单位)。

button.setMinimumSize(100, 50)  # 设置按钮的最小大小为宽100高50像素
setMaximumSize(width, height)

描述:

        设置控件的最大尺寸。控件不会被扩大到比这个尺寸更大的大小。

参数:

        width: 最大宽度(以像素为单位)。
        height: 最大高度(以像素为单位)。

button.setMaximumSize(200, 100)  # 设置按钮的最大大小为宽200高100像素
setFixedSize(width, height)

描述:

        设置控件的固定尺寸。控件的大小将被固定,不可调整。

参数:

        width: 固定宽度(以像素为单位)。
        height: 固定高度(以像素为单位)。

button.setFixedSize(150, 75)  # 设置按钮的固定大小为宽150高75像素
resize(width, height)

描述:

        调整控件的当前大小。与 setFixedSize 不同,此方法允许控件在其最小和最大尺寸范围内调整大小。

参数:

        width: 新宽度(以像素为单位)。
        height: 新高度(以像素为单位)。

button.resize(120, 60)  # 调整按钮的大小为宽120高60像素
size()

描述:

        获取控件的当前大小,返回一个 QSize 对象,包含控件的当前宽度和高度。

返回值: 

        QSize 对象。

current_size = button.size()  # 获取按钮的当前大小  
print("Width:", current_size.width(), "Height:", current_size.height())
minimumSize()

描述:

        获取控件设置的最小大小,返回一个 QSize 对象。

返回值: 

        QSize 对象。 

min_size = button.minimumSize()  # 获取按钮的最小大小  
print("Minimum Width:", min_size.width(), "Minimum Height:", min_size.height())
 maximumSize()

描述:

        获取控件设置的最大大小,返回一个 QSize 对象。

返回值: 

        QSize 对象。

max_size = button.maximumSize()  # 获取按钮的最大大小  
print("Maximum Width:", max_size.width(), "Maximum Height:", max_size.height())
setContentsMargins(left, top, right, bottom)

描述:

        设置控件内容与边缘之间的边距。边距影响控件的可用绘制区域。

参数:

        left: 左边距(以像素为单位)。
        top: 上边距(以像素为单位)。
        right: 右边距(以像素为单位)。
        bottom: 下边距(以像素为单位)。 

widget.setContentsMargins(10, 10, 10, 10)  # 设置所有边距为10像素

二、位置

2.1、设置窗口在桌面的显示位置 

        要在桌面上设置窗口的位置,可以使用 move(x, y) 方法。

参数:

        x: 窗口左上角的水平位置(以像素为单位)。
        y: 窗口左上角的垂直位置(以像素为单位)。

import sys  
from PyQt5.QtWidgets import QApplication, QWidget  app = QApplication(sys.argv)  # 创建窗口实例  
window = QWidget()  
window.setWindowTitle("My Window")  # 设置窗口位置 (100, 100) 在桌面上  
window.move(100, 100)  # 设置窗口大小  
window.resize(400, 300)  # 显示窗口  
window.show()  
sys.exit(app.exec_())

2.2、窗口位置居中

cursor_pos = QCursor.pos()

QCursor.pos():

        描述: 这个静态方法返回当前鼠标光标的位置,返回的是一个 QPoint 对象,表示光标在屏幕上的坐标(以像素为单位)。
        用途: 你可以用这个位置来确定光标当前在哪个屏幕上,或者在鼠标悬停时获取控件的位置信息。

current_screen = app.screenAt(cursor_pos)

app.screenAt(cursor_pos):

        描述: screenAt() 方法用于返回当前光标所在位置的屏幕对象。这个方法是 QApplication 类的一部分,接受一个 QPoint 参数(光标位置),并返回一个 QScreen 对象。
        用途: 通过这个方法,你可以获取到光标所在的屏幕的信息,例如屏幕的尺寸、分辨率等。

screen_ret = current_screen.availableGeometry()

current_screen.availableGeometry():

        描述: 这个方法返回一个 QRect 对象,表示当前屏幕上可用的几何区域(即可以用来放置窗口的区域),通常不包括任务栏、菜单栏等占用屏幕空间的部分。
        用途: 你可以使用这个信息来决定窗口的位置和大小,确保窗口不会被任务栏或其他系统界面元素遮挡。 

from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QCursor
import sysif __name__ == '__main__':# 创建 QApplication 实例,管理 GUI 应用程序的控制流程和主设置app = QApplication(sys.argv)# 创建主窗口 (QWidget)windows = QWidget()# 设置窗口标题为 '设置居中'windows.setWindowTitle('设置居中')# 获取当前鼠标光标在屏幕上的位置cursor_pos = QCursor.pos()# 在光标位置获取对应的屏幕current_screen = app.screenAt(cursor_pos)if current_screen is not None:# 获取当前屏幕的可用几何区域(大小和位置)creen_ret = current_screen.availableGeometry()# 计算屏幕宽度和高度的一半width = creen_ret.width() * 0.5height = creen_ret.height() * 0.5# 将窗口调整为屏幕可用宽度和高度的一半windows.resize(width, height)# 将窗口移动到屏幕的中心位置windows.move(width * 0.5, height * 0.5)# 打印当前屏幕的可用几何区域(用于调试)print(creen_ret)  # 输出 QRect(矩形区域)表示可用几何区域print(creen_ret.width())  # 输出可用区域的宽度print(creen_ret.height())  # 输出可用区域的高度print(creen_ret.left())  # 输出可用区域的左侧位置print(creen_ret.top())  # 输出可用区域的顶部位置left=creen_ret.left()top=creen_ret.top()# 显示主窗口windows.show()# 启动应用程序的事件循环app.exec()

三、按钮--QPushButton

        QPushButton 是一个可以被用户点击的按钮。可以通过 setText("Button Text") 设置按钮的文本,通过连接信号(如 clicked)来定义按钮被点击时触发的行为。

from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QTextBrowser  # 导入所需的PyQt5模块  
import sys  # 导入sys模块以处理命令行参数和退出程序  class Wight(QWidget):  # 定义一个名为 Wight 的类,继承自 QWidget  def __init__(self):  super().__init__()  # 调用父类的构造函数,初始化父类的属性  self.ui_init()  # 调用自定义的 UI 初始化方法  self.setWindowTitle('按钮')  # 设置窗口的标题  self.resize(800, 800)  # 设置窗口的大小为800x800像素  self.move(555, 255)  # 设置窗口在屏幕上的位置,坐标为(555, 255)  def ui_init(self):  # 初始化用户界面  self.show_btn = QPushButton(self)  # 创建一个 QPushButton 实例,并将其设置为当前窗口的子控件  self.show_btn.setText('按钮')  # 设置按钮的文本为"按钮"  self.show_btn.setGeometry(350, 50, 100, 100)  # 设置按钮的位置和大小,位置(350, 50),宽100高100像素  self.show_btn.clicked.connect(lambda: print("这是一个按钮的点击事件"))  # 当按钮被点击时,输出提示信息  if __name__ == '__main__':  app = QApplication(sys.argv)  # 创建 QApplication 实例,传递命令行参数  w = Wight()  # 创建 Wight 窗口实例  w.show()  # 显示窗口  app.exec()  # 进入应用程序主循环,等待事件处理

四、QTextBrowser

        QTextBrowser 是一个用于显示和编辑富文本的控件,支持HTML格式。它可以显示多行文本并允许添加链接。

from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QTextBrowser  # 导入所需的 PyQt5 模块  
import sys  # 导入 sys 模块以处理命令行参数和退出程序  class Wight(QWidget):  # 定义一个名为 Wight 的类,继承自 QWidget  def __init__(self):  super().__init__()  # 调用父类的构造函数,初始化父类(QWidget)的属性  self.ui_init()  # 调用自定义的 UI 初始化方法  self.setWindowTitle('文本介绍')  # 设置窗口的标题为 "文本介绍"  self.resize(800, 800)  # 设置窗口的大小为 800x800 像素  self.move(555, 255)  # 设置窗口在屏幕上的位置,坐标为 (555, 255)  def ui_init(self):  # 初始化用户界面  self.show_text = QTextBrowser(self)  # 创建一个 QTextBrowser 实例,并将其设置为当前窗口的子控件  self.show_text.setGeometry(175, 200, 400, 400)  # 设置 QTextBrowser 的位置和大小,位置 (175, 200),宽 400 高 400 像素  # 设置文本内容,介绍 QPushButton 的用法  self.show_text.setText(  'QPushButton 是一个可以被用户点击的按钮。'  '可以通过 setText("Button Text") 设置按钮的文本,'  '通过连接信号(如 clicked)来定义按钮被点击时触发的行为。'  )  if __name__ == '__main__':  app = QApplication(sys.argv)  # 创建 QApplication 实例,传递命令行参数  w = Wight()  # 创建 Wight 窗口实例  w.show()  # 显示窗口  app.exec()  # 进入应用程序主循环,等待事件处理

五、QPushButton与QTextBrowser结合

        这是一个按钮与文本结合使用的,它将会以故宫位主要材料,通过点击按钮使文本出现故宫的介绍为主要内容,将会通过两种形式呈现这一方法的实现

5.1、纯编程

from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QTextBrowser  # 导入所需的 PyQt5 模块  
import sys  # 导入 sys 模块以处理命令行参数和退出程序  class Wight(QWidget):  # 定义一个名为 Wight 的类,继承自 QWidget  def __init__(self):  super().__init__()  # 调用父类的构造函数,初始化父类(QWidget)的属性  self.ui_init()  # 调用自定义的 UI 初始化方法  self.setWindowTitle('故宫介绍')  # 设置窗口的标题为 "故宫介绍"  self.resize(800, 800)  # 设置窗口的大小为 800x800 像素  self.move(555, 255)  # 设置窗口在屏幕上的位置,坐标为 (555, 255)  self.slot_init()  # 调用槽函数初始化方法,连接按钮的信号  def ui_init(self):  # 初始化用户界面  self.show_btn = QPushButton(self)  # 创建一个 QPushButton 实例,并将其设置为当前窗口的子控件  self.show_btn.setText('按钮')  # 设置按钮的文本为 "按钮"  self.show_btn.setGeometry(350, 50, 100, 100)  # 设置按钮的位置和大小,位置 (350, 50),宽 100 高 100 像素  self.show_text = QTextBrowser(self)  # 创建一个 QTextBrowser 实例,用于显示文本  self.show_text.setGeometry(75, 200, 600, 400)  # 设置 QTextBrowser 的位置和大小,位置 (75, 200),宽 600 高 400 像素  def slot_init(self):  # 初始化信号与槽的连接  self.show_btn.clicked.connect(self.show_info)  # 当按钮被点击时,连接到 show_info 方法  def show_info(self):  # 定义显示故宫介绍的文本  data = '''  
故宫又称紫禁城。中国古代讲究“天人合一”的规划理念,  
用天上的星辰与都城规划相对应,以突出政权的合法性和  
皇权的至高性。天帝居住在紫微宫,而人间皇帝自诩为受  
命于天的“天子”,其居所应象征紫微宫以与天帝对应,  
《后汉书》载“天有紫微宫,是上帝之所居也。王者立宫,  
象而为之”。紫微、紫垣、紫宫等便成了帝王宫殿的代  
称。由于封建皇宫在古代属于禁地,常人不能进入,故称为  
“紫禁”。明朝初期同外禁垣一起统称“皇城”,大约明朝中晚  
期,与外禁垣区分开来,即宫城叫“紫禁城”,外禁垣为“皇城”。  
'''  self.show_text.setText(data)  # 将文本内容设置到 QTextBrowser 中显示  if __name__ == '__main__':  app = QApplication(sys.argv)  # 创建 QApplication 实例,传递命令行参数  w = Wight()  # 创建 Wight 窗口实例  w.show()  # 显示窗口  app.exec()  # 进入应用程序主循环,等待事件处理

5.2、通过Designer 设计,代码完成交互

# -*- coding: utf-8 -*-# Form implementation generated from reading ui file 'untitled.ui'
#
# Created by: PyQt5 UI code generator 5.15.9
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.from PyQt5 import QtCore, QtGui, QtWidgetsclass Ui_Form(object):def setupUi(self, Form):Form.setObjectName("Form")Form.resize(534, 393)self.show_btn = QtWidgets.QPushButton(Form)self.show_btn.setGeometry(QtCore.QRect(60, 160, 71, 51))self.show_btn.setObjectName("show_btn")self.textBrowser = QtWidgets.QTextBrowser(Form)self.textBrowser.setGeometry(QtCore.QRect(180, 30, 321, 341))self.textBrowser.setObjectName("textBrowser")self.retranslateUi(Form)QtCore.QMetaObject.connectSlotsByName(Form)def retranslateUi(self, Form):_translate = QtCore.QCoreApplication.translateForm.setWindowTitle(_translate("Form", "Form"))self.show_btn.setText(_translate("Form", "故宫按钮"))

from  untitled import Ui_Form
import  sys
from  PyQt5.QtWidgets import  QApplication,QWidgetclass Mywindows(QWidget,Ui_Form):def __init__(self):super().__init__()self.setupUi(self)self.setWindowTitle('我是故宫')self.solt_init()def solt_init(self):self.show_btn.clicked.connect(self.show_info)def show_info(self):data = '''故宫又称紫禁城。中国古代讲究“天人合一”的规划理念,用天上的星辰与都城规划相对应,以突出政权的合法性和皇权的至高性。天帝居住在紫微宫,而人间皇帝自诩为受命于天的“天子”,其居所应象征紫微宫以与天帝对应,《后汉书》载“天有紫微宫,是上帝之所居也。王者立宫,象而为之”。紫微、紫垣、紫宫等便成了帝王宫殿的代称。由于封建皇宫在古代属于禁地,常人不能进入,故称为“紫禁”。明朝初期同外禁垣一起统称“皇城”,大约明朝中晚期,与外禁垣区分开来,即宫城叫“紫禁城”,外禁垣为“皇城”。'''self.textBrowser.setText(data)if __name__ == '__main__':app=QApplication(sys.argv)w=Mywindows()w.show()app.exec()

 

六、QLineEdit

        QLineEdit 是一个用户输入单行文本的控件。可以通过设置文本、获取用户输入及处理文本输入的信号来使用。

from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QTextBrowser, QLineEdit  # 导入所需的 PyQt5 模块
import sys  # 导入 sys 模块以处理命令行参数和退出程序class Wight(QWidget):  # 定义一个名为 Wight 的类,继承自 QWidgetdef __init__(self):super().__init__()  # 调用父类的构造函数,初始化父类的属性self.ui_init()  # 调用自定义的 UI 初始化方法self.setWindowTitle('文本输入')  # 设置窗口的标题为 "文本输入"self.resize(800, 800)  # 设置窗口的大小为 800x800 像素self.move(555, 255)  # 设置窗口在屏幕上的位置,坐标为 (555, 255)def ui_init(self):# 初始化用户界面self.line_edit = QLineEdit(self)  # 创建一个 QLineEdit 实例,用于文本输入self.line_edit.setPlaceholderText("Enter something...")  # 设置占位符提示文本# 连接 'returnPressed' 信号到处理方法self.line_edit.returnPressed.connect(self.print_input)  # 当按下 Enter 键时调用 print_input 方法def print_input(self):# 获取输入框中的文本并打印到控制台input_text = self.line_edit.text()  # 获取当前输入的文本print(input_text)  # 输出到控制台if __name__ == '__main__':app = QApplication(sys.argv)  # 创建 QApplication 实例,传递命令行参数w = Wight()  # 创建 Wight 窗口实例w.show()  # 显示窗口app.exec()  # 进入应用程序主循环,等待事件处理

七、QPushButton与QTextBrowser与QLineEdit结合

         这是一个按钮、文本和文本输入结合使用的,它将会以注册账号,清除内容为主编写,然后将改账号密码储存到一个txt文本中。其中会添加注册账号时的一些限制

1、清除clear()

self.username_text.clear()
self.pwd_text.clear()

2、隐藏密码

self.pwd_text.setEchoMode(QLineEdit.Password)

3、验证器

int_valider=QtGui.QIntValidator()#整数验证器
# int_valider = QtGui.QRegExpValidator()#正则验证器
# int_valider = QtGui.QDoubleValidator()#浮点数验证器

reg_exp=QtCore.QRegExp("^\d{0,11}$")
reg_valider=QtGui.QRegExpValidator(reg_exp,self.username_text)
self.username_text.setValidator(reg_valider)
self.username_text.setValidator(int_valider)

import sys  # 导入 sys 模块以处理命令行参数和退出程序  
from PyQt5 import QtGui, QtCore  # 从 PyQt5 导入图形界面和核心功能模块  
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLabel, QMessageBox, QLineEdit  # 导入所需的 PyQt5 控件  class MyQwindow(QWidget):  # 定义一个名为 MyQwindow 的类,继承自 QWidget  def __init__(self):  super().__init__()  # 调用父类的构造函数,初始化父类的属性  self.setWindowTitle('标题---注册界面')  # 设置窗口的标题  self.resize(550, 240)  # 设置窗口的大小为 550x240 像素  self.move(1000, 500)  # 设置窗口在屏幕上的位置  self.uit_init()  # 调用用户界面初始化方法  self.slot_init()  # 调用信号与槽初始化方法  def uit_init(self):  # 初始化用户界面组件  self.username = QLabel('账号:', self)  # 创建一个标签用于显示“账号”  self.username.setGeometry(10, 20, 100, 50)  # 设置标签的位置和大小  self.username_text = QLineEdit(self)  # 创建一个 QLineEdit 用于输入用户名  self.username_text.setGeometry(80, 20, 220, 50)  # 设置输入框的位置和大小  self.username_text.setMaxLength(10)  # 设置输入的最大长度为 10  int_valider = QtGui.QIntValidator()  # 创建整数验证器,限制输入为整数  # int_valider = QtGui.QRegExpValidator()  # 这是正则表达式验证器# int_valider = QtGui.QDoubleValidator()  # 这是浮点数验证器reg_exp = QtCore.QRegExp("^\d{0,11}$")  # 定义一个正则表达式,支持 0 到 11 位数字  reg_valider = QtGui.QRegExpValidator(reg_exp, self.username_text)  # 创建正则表达式验证器  self.username_text.setValidator(reg_valider)  # 为用户名输入框设置正则验证器  self.username_text.setValidator(int_valider)  # 为用户名输入框设置整数验证器(此行会覆盖正则验证器)  self.username_btn = QPushButton(self)  # 创建一个按钮用于“注册”  self.username_btn.setText('注册')  # 设置按钮的文本为“注册”  self.username_btn.setGeometry(350, 20, 150, 50)  # 设置按钮的位置和大小  self.pwd = QLabel('密码:', self)  # 创建一个标签用于显示“密码”  self.pwd.setGeometry(10, 80, 100, 50)  # 设置标签的位置和大小  self.pwd_text = QLineEdit(self)  # 创建一个 QLineEdit 用于输入密码  self.pwd_text.setGeometry(80, 80, 220, 50)  # 设置输入框的位置和大小  self.pwd_text.setEchoMode(QLineEdit.Password)  # 设置输入框为密码模式,输入内容以星号形式显示  self.clear_btn = QPushButton(self)  # 创建一个按钮用于“清空”  self.clear_btn.setText('清空')  # 设置按钮的文本为“清空”  self.clear_btn.setGeometry(350, 80, 150, 50)  # 设置按钮的位置和大小  def slot_init(self):  # 初始化信号与槽的连接  self.username_btn.clicked.connect(self.reg_slot)  # 当“注册”按钮被点击时,连接到 reg_slot 方法  self.clear_btn.clicked.connect(self.clear_slot)  # 当“清空”按钮被点击时,连接到 clear_slot 方法  def reg_slot(self):  # 注册按钮的槽函数,处理注册逻辑  username = self.username_text.text()  # 获取用户名输入框中的文本  pwd = self.pwd_text.text()  # 获取密码输入框中的文本  # 验证输入  if username == '' and pwd == '':  QMessageBox.warning(self, '注册', '用户名或密码不能为空')  # 提示用户用户名和密码不能为空  elif 0 < len(username) < 10:  QMessageBox.warning(self, '注册', '用户名长度不符合标准')  # 提示用户用户名长度不符合标准  elif 0 < len(pwd) < 6:  QMessageBox.warning(self, '注册', '密码长度不符合标准')  # 提示用户密码长度不符合标准  else:  # 如果输入有效,将信息写入文件  with open('user.txt', 'a+', encoding='utf-8') as f:  info = f'账号:{username}, 密码:{pwd}\n'  # 格式化要写入的信息  f.write(info)  # 将信息写入文件  QMessageBox.warning(self, '注册', '恭喜你注册完成')  # 提示用户注册成功  def clear_slot(self):  # 清空输入框的槽函数  self.username_text.clear()  # 清空用户名输入框  self.pwd_text.clear()  # 清空密码输入框  if __name__ == '__main__':  app = QApplication(sys.argv)  # 创建 QApplication 实例,传递命令行参数  windows = MyQwindow()  # 创建 MyQwindow 窗口实例  windows.show()  # 显示窗口  sys.exit(app.exec_())  # 进入应用程序主循环,并确保程序正常退出

 

简易计算器 

from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QTextBrowser, QLabel, QMessageBox, QLineEdit
import sysclass MyQwindow(QWidget):def __init__(self):super().__init__()self.setWindowTitle('标题---计算器')self.resize(550, 280)self.move(1000, 500)self.uit_init()self.slot_init()def uit_init(self):self.inp = QLabel('输入:', self)self.inp.setGeometry(10, 20, 50, 50)self.inp_text = QLineEdit(self)self.inp_text.setGeometry(80, 20, 400, 50)self.inp_btn = QPushButton(self)self.inp_btn.setText('计算')self.inp_btn.setGeometry(100, 80, 150, 50)self.output = QTextBrowser(self)self.output.setGeometry(80, 160, 400, 100)self.clear_btn=QPushButton(self)self.clear_btn.setText('清空')self.clear_btn.setGeometry(300,80,150,50)def slot_init(self):self.inp_btn.clicked.connect(self.show_slot)self.clear_btn.clicked.connect(self.clear_slot)def show_slot(self):data = self.inp_text.text()self.output.setText(str(eval(data)))def clear_slot(self):self.inp_text.clear()if __name__ == '__main__':app = QApplication(sys.argv)windows = MyQwindow()windows.show()# app.exec()sys.exit(app.exec_())

 

八、修改文本中文字大小 

self.text2.setFont(QFont('Arial',25))

from PyQt5.QtGui import QFont
from PyQt5.QtWidgets import QApplication, QWidget, QTextBrowser
import  sys
class Wight(QWidget):def __init__(self):super().__init__()self.ui_init()self.setWindowTitle('文本')self.resize(800,800)self.move(555,255)def ui_init(self):self.text=QTextBrowser(self)self.text.setGeometry(0, 0, 600, 100)self.text.setText('修改文字之前')self.text2=QTextBrowser(self)self.text2.setGeometry(0, 100, 600, 400)self.text2.setFont(QFont('Arial',25))self.text2.setText('修改文字之后')if __name__ == '__main__':app=QApplication(sys.argv)w=Wight()w.show()app.exec()

 

九、思维导图 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com