文章目录
一、经常用到的控件总结
1、布局
(1)垂直布局
right_layout = QVBoxLayout()
(2)水平布局
main_layout = QHBoxLayout()
以上这两种好像没什么需要叙述的,布局控件可以让界面看起来更美观,并且在拖动以及最大最小化的时候,免受窗口变形的影响。
2、按钮
api: QPushButton
使用方法:
self.load_button = QPushButton('加载图片') # 创建按钮
self.load_button.clicked.connect(self.load_image) # 将按钮链接到load_image方法(函数)
imageload_layout.addWidget(self.load_button) # 添加到布局
3、单行文本框
api: QLineEdit
使用方法:
self.status_input = QLineEdit() # 创建状态框
imageload_layout.addWidget(self.status_input) # 添加到布局
right_layout.addLayout(imageload_layout) # 添加到布局
注释:
QLineEdit 是 Qt 框架中的一个类,用于创建一个单行文本框。Qt 是一个广泛使用的跨平台图形用户界面(GUI)库,QLineEdit 是其中的一个控件,用于接收和显示用户输入的文本。它可以用于各种应用程序中,例如表单输入、搜索框、过滤器等。
QLineEdit 的基本特性
文本输入:允许用户输入单行文本。
显示文本:可以显示文本,并允许用户编辑。
占位符文本:可以设置占位符文本,提示用户应该输入什么内容。
文本格式化:支持设置文本格式,例如密码模式(即隐藏文本)或限制输入字符类型。
信号和槽机制:支持 Qt 的信号和槽机制,可以用来响应文本改变、焦点变化等事件。
常用方法和属性
setText(text):设置文本框的文本。
text():获取文本框中的文本。
setPlaceholderText(text):设置占位符文本。
setReadOnly(bool):设置文本框是否只读。
setEchoMode(mode):设置回显模式,例如设置为 QLineEdit.Password 可以隐藏输入的文本(用于密码输入)。
4、QLabel文本显示
api: QLabel('Hello, World!')
使用方法:
(1)显示文本:
label = QLabel('Hello, World!')
(2)显示图像:
你可以使用 QLabel 来显示图像,通过设置其 pixmap 属性来加载图像文件。
from PyQt5.QtGui import QPixmap
label = QLabel()
pixmap = QPixmap('image.png')
label.setPixmap(pixmap)
(3)富文本
QLabel 支持 HTML 格式的文本,可以用来显示格式化文本,例如带有不同字体颜色或样式的文本。
label = QLabel('<b>Hello, <font color="red">World!</font></b>')
(4)文本对齐
你可以设置 QLabel 中文本的对齐方式(如左对齐、右对齐、居中对齐等)。
label.setAlignment(Qt.AlignCenter)
5、QTextEdit文本编辑
api: text_edit = QTextEdit()
text_edit.setText("This is a QTextEdit widget.")
二、插件使用
1、图片阅读器方法
class ImageViewer(QGraphicsView):
def __init__(self):
super().__init__()
self.setRenderHint(QPainter.Antialiasing) # 启用抗锯齿,减少图像边缘的锯齿状效果
self.setRenderHint(QPainter.SmoothPixmapTransform) # 启用平滑图像变换,避免图像在缩放的时候出现模糊和失真
self.setScene(QGraphicsScene()) # 这是用于显示图像项的容器
self.image_item = None #
self.setDragMode(QGraphicsView.ScrollHandDrag) # 允许用户通过拖动视图来滚动查看图像。
self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) # 禁用水平和垂直滚动条
self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
def load_image(self, file_path): # 定义一个名为 load_image 的方法,用于加载图像
pixmap = QPixmap(file_path) # 创建一个 QPixmap 对象 pixmap,从指定的文件路径加载图像。
# 如果 image_item 已经存在(即当前有图像显示在视图中),则从场景中移除该图像项,以准备显示新图像。
if self.image_item:
self.scene().removeItem(self.image_item)
self.image_item = self.scene().addPixmap(pixmap) # 将新的图像项添加到场景中
# 置图像项的变换模式为 Qt.SmoothTransformation,以确保图像在缩放时的平滑效果。
self.image_item.setTransformationMode(Qt.SmoothTransformation)
# 设置场景的矩形区域 sceneRect 为图像的矩形区域,确保整个图像在视图中可见。
self.setSceneRect(QRectF(pixmap.rect()))
# 调整视图的缩放级别,使图像在视图中适合显示,同时保持图像的纵横比
self.fitInView(self.sceneRect(), Qt.KeepAspectRatio)
# 重写 wheelEvent 方法以处理鼠标滚轮事件。event 是 QWheelEvent 对象,表示滚轮事件的详细信息。
def wheelEvent(self, event: QWheelEvent):
factor = 1.2
if event.angleDelta().y() < 0:
factor = 1 / factor
self.scale(factor, factor)
#
def mousePressEvent(self, event: QMouseEvent):
if event.button() == Qt.LeftButton and (event.modifiers() & Qt.ControlModifier):
self.setDragMode(QGraphicsView.ScrollHandDrag)
else:
super().mousePressEvent(event)
def mouseReleaseEvent(self, event: QMouseEvent):
if event.button() == Qt.LeftButton and (event.modifiers() & Qt.ControlModifier):
self.setDragMode(QGraphicsView.NoDrag)
else:
super().mouseReleaseEvent(event)
class MainWindow(QMainWindow):
def __init__(self):
……
self.image_viewer = ImageViewer()
main_layout.addWidget(self.image_viewer, 3)
right_layout = QVBoxLayout()
……
def load_image(self):
file_path, _ = QFileDialog.getOpenFileName(self, 'Open Image File', '', 'Images (*.png *.xpm *.jpg *.bmp)')
if file_path:
self.image_viewer.load_image(file_path)
self.status_input.setText(file_path)
self.textbox.append("加载状态:image\n图片路径:{}".format(file_path))
这个代码定义了一个自定义的 QGraphicsView 子类,名为 ImageViewer。它用于显示和操作图像,提供了基本的图像查看功能和一些用户交互的自定义行为。
ImageViewer 继承自QGraphicsView。设置了抗锯齿和光滑变换的渲染提示,以提高图像的显示质量。创建了一个空的QGraphicsScene用于显示图像。初始化时禁用了水平和垂直滚动条,并设置了拖动模式为ScrollHandDrag。
三、PyQT软件制作常用框架
1、普遍型
import sys
import json
import requests
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QTextEdit
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('PyQt与接口连接示例')
self.setGeometry(100, 100, 400, 300)
# 创建布局
self.layout = QVBoxLayout()
# 创建按钮
self.button = QPushButton('发送请求', self)
self.button.clicked.connect(self.send_request) # 按钮点击事件
# 创建文本框
self.text_edit = QTextEdit(self)
self.text_edit.setReadOnly(True) # 设置文本框为只读
# 将按钮和文本框添加到布局
self.layout.addWidget(self.button)
self.layout.addWidget(self.text_edit)
# 设置窗口的布局
self.setLayout(self.layout)
def send_request(self):
# 定义接口 URL
url = "http://10.195.156.127:4000/#/?name=RI9uGsnxjx9xK5pwpTtBYw%3D%3D"
# 创建要发送的 JSON 数据
data = {
"key1": "value1",
"key2": "value2"
}
# 发送 POST 请求,假设接口接受 POST 请求,并发送 JSON 数据
try:
headers = {'Content-Type': 'application/json'} # 设置请求头
response = requests.post(url, json=data, headers=headers)
if response.status_code == 200:
# 如果接口返回成功,显示返回的 JSON 数据
self.text_edit.setPlainText(json.dumps(response.json(), indent=4))
else:
self.text_edit.setPlainText(f"请求失败,状态码: {response.status_code}")
except Exception as e:
self.text_edit.setPlainText(f"请求发生错误: {e}")
if __name__ == '__main__':
app = QApplication(sys.argv)
# 创建窗口实例
window = MyWindow()
window.show()
# 运行 PyQt 应用程序
sys.exit(app.exec_())
该布局就是经典的MainWindow+main函数调用的方法。
一般情况下,pyQT的基本结构为:
class MyWindow(Qwidget):
def __init__(self):
super().__init__()
self.setWindowTitle("软件名称")
self.setGeometry(100, 100, 400, 300) # 前两个参数表示窗口左上角坐标(x, y),后两个参数是窗口的宽度和高度
# 创建布局
self.layout = QVBoxLayout() # 创建一个垂直布局
# 创建控件
self.button = QPushButton("发送请求", self) # 创建按钮
self.button.clicked.connect(self.send_request) # 按钮绑定事件
self.txtarea = QTextEdit(self)
self.texarea.setReadOnly(True) # 设置文本框为只读
# 将按钮和文本框添加到布局里边
……
self.setLayout(self.layout)
def send_request(self):
# 返回数据
self.txtarea.setPlainText(json.dumps(response.json(), indent=4))
if __name__ == '__main__':
app = QApplication(sys.argv)
# 创建窗口实例
window = MyWindow()
window.show()
# 运行 PyQt 应用程序
sys.exit(app.exec_())
如果想设置窗口一上来就是居中的,那么应该把MyWindow中的初始化函数更改一下:
# ---------------------------------------------------------
# 窗口居中
# ---------------------------------------------------------
self.setWindowTitle('PyQt与接口连接示例')
self.setGeometry(0, 0, 400, 300) # 初始化窗口大小
# 获取屏幕分辨率
screen = QDesktopWidget().screenGeometry()
screen_width = screen.width()
screen_height = screen.height()
# 获取窗口的宽度和高度
window_width = 400
window_height = 300
# 计算窗口的左上角位置,使其居中
x = (screen_width - window_width) // 2
y = (screen_height - window_height) // 2
# 设置窗口居中
self.setGeometry(x, y, window_width, window_height)
6万+

被折叠的 条评论
为什么被折叠?



