PyQt常用控件的使用:QFileDialog、QMessageBox、QTreeWidget、QRadioButton等

一、控件常用函数介绍

常用函数

函数功能
setText(txt)设置内容
text()获取内容
setEnabled(bool)使按钮失效
setCheckable(bool)打开开关状态
setChecked(bool)设置按钮状态
(如果是按钮需要先设置setCheckable状态)
isChecked()获取按钮状态
(如果是按钮则需要先设置setCheckable状态)
setIcon(QIcon(QPixmap(“icon.jpg”)))设置图标
setIconSizeQSize(100, 100)设置图标的大小
setShortcut(“Alt+O”)设置快捷键
setStyleSheet(“x:x;x:x;”)设置样式(CSS)
setToolTip(text)设置气泡(悬停提示)

常见事件绑定函数

函数功能
clicked.connect()按钮单击(QPushButton, QRadioButton)
currentIndexChanged.connect()下拉框内容变化(QComboBox)
triggered.connect()菜单键点击(QAction)
setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
customContextMenuRequested.connect()
选项右击(QTreeWidget,自带参数pos)

部分函数默认自带参数,如果要额外带些参数,编写方式如下

self.tree_widget.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
self.tree_widget.customContextMenuRequested.connect(lambda pos: self.right_clicked_tree(pos, "abc"))

# pos为自带参数,txt为自定义参数
def right_clicked_tree(self, pos, txt):
    pass

二、QFileDialog(文件类操作)

QFileDialog:是 PyQt/PySide 中用于文件选择的标准对话框组件,它提供了打开/保存文件、选择目录等功能接口
选择创建文件。

获取文件路径
file_path, selected_filter = QFileDialog.getOpenFileName(parent=None, caption='', directory='', filter='',options=QFileDialog.Options())

参数:
parent:QWidget 父窗口,通常传入 self 或 None
caption:对话框标题
directory:初始显示目录(空字符串表示当前目录)
filter:文件类型过滤器
options:额外选项配置
返回值:
file_path:用户选择的文件路径(字符串),如果取消则为空字符串
selected_filter:用户选择的过滤器

from PyQt5.QtWidgets import QFileDialog

file_path, _ = QFileDialog.getOpenFileName(self, 'Open File', 'E:/Code', 'Text Files(*.txt *.csv);;All Files(*)')
if file_path:
    print("选择的文件:", file_path)

获取保存文件路径
file_path, selected_filter = QFileDialog.getSaveFileName(parent=None, caption='', directory='', filter='', options=QFileDialog.Options())

参数:
parent:QWidget 父窗口,通常传入 self 或 None
caption:对话框标题
directory:初始显示目录(空字符串表示当前目录)
filter:文件类型过滤器
options:额外选项配置
返回值:
file_path:指定的保存路径(字符串),如果取消则为空字符串
selected_filter:用户选择的过滤器

from PyQt5.QtWidgets import QFileDialog

save_path, filter_used = QFileDialog.getSaveFileName(None,"导出数据","data_export","CSV文件 (*.csv);;JSON文件 (*.json)")
if save_path:
    pass

获取文件夹路径
directory = QFileDialog.getExistingDirectory(parent=None, caption='', directory='', options=QFileDialog.Options())

参数:
parent:QWidget 父窗口,通常传入 self 或 None
caption:对话框标题
directory:初始显示目录(空字符串表示当前目录)
options:额外选项配置
返回值:
file_path:选择的目录路径(字符串),如果取消则为空字符串
dir_path = QFileDialog.getExistingDirectory( None, “选择目录”, “”)

from PyQt5.QtWidgets import QFileDialog

file_path = QFileDialog.getExistingDirectory(self, 'Open File', 'E:/Code')
if file_path:
    self.edit.setText(file_path)

三、QMessageBox(对话框)

QMessageBox:是PyQt/PySide中用于显示消息对话框的类,可以用来显示信息、警告、错误或提问。以下是QMessageBox的详细使用方法

QMessageBox常规用法:

from PyQt5.QtWidgets import QMessageBox

# 显示一个简单的信息对话框
QMessageBox.information(None, "标题", "这是一条信息消息")    # None可以是QWidget	父窗口 即QWidget窗口时使用self

# 显示警告对话框
QMessageBox.warning(None, "警告", "这是一个警告消息")

# 显示错误对话框
QMessageBox.critical(None, "错误", "这是一个错误消息")

# 显示提问对话框(最后一个参数为默认选项)
reply = QMessageBox.question(None, "问题", "你确定要继续吗?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if reply == QMessageBox.Yes:
    print("用户选择了是")
else:
    print("用户选择了否")

QMessageBox自定义用法:

图标类型含义
QMessageBox.NoIcon无图标
QMessageBox.Question问题图标
QMessageBox.Information信息图标
QMessageBox.Warning警告图标
QMessageBox.Critical错误图标
按钮类型
QMessageBox.Ok
QMessageBox.Open
QMessageBox.Save
QMessageBox.Cancel
QMessageBox.Close
QMessageBox.Yes
QMessageBox.No
QMessageBox.Abort
QMessageBox.Retry
QMessageBox.Ignore
msg_box = QMessageBox()
msg_box.setIcon(QMessageBox.Information)  # 设置图标类型
msg_box.setWindowTitle("自定义对话框")    # 设置标题
msg_box.setText("这是主要消息")           # 设置主要文本
msg_box.setInformativeText("这是附加信息") # 设置附加信息
msg_box.setDetailedText("这是详细文本\n可以有多行") # 设置详细文本

# 添加自定义按钮
msg_box.addButton("自定义按钮1", QMessageBox.AcceptRole)
msg_box.addButton("自定义按钮2", QMessageBox.RejectRole)

# 显示对话框
ret = msg_box.exec_()

if ret == QMessageBox.AcceptRole:
    print("点击了自定义按钮1")
else:
    print("点击了其他按钮")

四、QTreeWidget(树结构类操作)

QTreeWidget:是PyQt中用于显示树形结构数据的重要组件,它继承自QTreeView,提供了更简单易用的接口来处理树状数据。常用函数如下:

函数含义
root_tree.setColumnCount(2)设置列数(两列)
root_tree.setHeaderLabels([“名称”, “类型”])设置列标题
root_tree.setColumnWidth(0, 200)设置列宽(第一列宽度200)
root_tree.header().setSectionResizeMode(QtWidgets.QHeaderView.ResizeToContents)列宽自适应
root_tree.expandAll()全部展开
root_tree.collapseAll()全部收起
root_tree.invisibleRootItem().childCount()获取根节点的子节点数
root_tree.invisibleRootItem().child(i)获取根节点的某个子节点
item.childCount()获取当前节点的子节点数
item.child(i)获取当前节点的某个子节点
item.setText(0, “根节点”)设置内容
item.setIcon(0, QIcon(“”))设置图片
item.setCheckState(0, QtCore.Qt.Unchecked)设置选中状态
item.checkState(0)获取选中状态(参数表示哪列)
item.text(0)获取某列内容(参数表示哪列)
item.parent().text(column)获取父节点内容(参数表示哪列)

4.1 树结构的初始化

# 创建QTreeWidget对象
self.tree_widget = QTreeWidget()

# 设置列数、列标题、列宽
self.tree_widget.setColumnCount(2)
self.tree_widget.setHeaderLabels(["名称", "类型"])
self.tree_widget.setColumnWidth(0, 200)
self.tree_widget.setColumnWidth(1, 150)
# self.tree_widget.header().setSectionResizeMode(QtWidgets.QHeaderView.ResizeToContents)  # 列宽自适应

# 添加数据项(父节点)
root_item = QTreeWidgetItem(self.tree_widget)
root_item.setText(0, "根节点")
root_item.setText(1, "文件夹")
root_item.setCheckState(0, QtCore.Qt.Unchecked)  # 设置勾选状态(不勾选)  可省略

# 添加数据项(子节点)
child_item = QTreeWidgetItem(root_item)
child_item.setText(0, "子节点1")
child_item.setText(1, "文件")
child_item.setCheckState(0, QtCore.Qt.Unchecked)  # 设置勾选状态(不勾选)  可省略

self.tree_widget.expandAll()      # 所有节点展开
self.tree_widget.collapseAll()    # 所有节点收起

4.2 递归读取完整树结构

# 创建QTreeWidget实例
tree_widget = QTreeWidget()    # 初始化...略
# 获取不可见的根项
root = tree_widget.invisibleRootItem()
for i in range(root.childCount()):
    item = root.child(i)
    read_tree_item(item)

def read_tree_item(item):
    """递归读取树形项及其子项"""
    select_status = item.checkState(0)  # 获取勾选状态 (参数表示列索引)
    # 遍历读取每列信息
    for col in range(item.columnCount()):
        print(item.text(col))

    # 递归处理子项
    for child_index in range(item.childCount()):
        child = item.child(child_index)
        read_tree_item(child)

4.3 信号槽绑定

函数含义
itemSelectionChanged.connect()项选择变化
itemClicked.connect()项被点击
itemDoubleClicked.connect()项被双击
itemExpanded.connect()项展开
itemCollapsed.connect()项折叠
itemChanged.connect()项内容编辑
setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
customContextMenuRequested.connect(self.right_clicked_tree)
右击事件
itemChanged.connect()勾选状态变化事件

单击事件

self.tree_widget.itemClicked.connect(self.clicked_item)

def clicked_item(self, item, column):  # item: 点击项   column:列
    if item:
        # 当前节点信息
        item_text = item.text(column)   # item.text(0)
        # 获取父节点信息
        if item.parent():
            parent_text = item.parent().text(column)
        # 获取子节点信息
        for child_index in range(item.childCount()):
            child_text = item.child(child_index).text(column)

双击事件

self.tree_widget.itemDoubleClicked.connect(self.double_clicked_item)

def double_clicked_item(self, item, column):  # item: 点击项   column:列
    if item:
        # 当前节点信息
        item_text = item.text(column)   # item.text(0)
        # 获取父节点信息
        if item.parent():
            parent_text = item.parent().text(column)
        # 获取子节点信息
        for child_index in range(item.childCount()):
            child_text = item.child(child_index).text(column)

勾选状态事件

self.tree_widget.itemChanged.connect(self.item_changed)

def item_changed(self, item, column):  # item: 点击项   column:列
    if item.checkState(0) == Qt.Checked:
        print(f"项目 {item.text(0)} 被选中")
    else:
        print(f"项目 {item.text(0)} 取消选中")

右击菜单栏

如实现右击弹出菜单栏,将当前选选项移除

# 右击绑定事件
self.tree_widget.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
self.tree_widget.customContextMenuRequested.connect(self.right_clicked_tree)

def right_clicked_tree(self, pos):
    item = self.tree_widget.itemAt(pos)
    if item:
        menu = QMenu(self.tree_widget)
        remove_item = QAction("remove", self.tree_widget)
        remove_item.triggered.connect(lambda: self.remove_item(item))   # 移除事件绑定
        menu.addAction(remove_item)
        menu.exec_(QtGui.QCursor.pos())

# 移除当前项
def remove_item(self, item):
    if item.parent():
        item.parent().removeChild(item)
    else:
        index = self.tree_widget.indexOfTopLevelItem(item)
        self.tree_widget.takeTopLevelItem(index)

一般来说,直接使用Menu,对选项右击也会出发事件,这是需要对menu进行部分函数封装改写,忽略右击对菜单栏选项操作

class MyMenu(QtWidgets.QMenu):
    # 忽略右击选项
    def mousePressEvent(self, event):
        if event.button() == QtCore.Qt.LeftButton:
            super().mousePressEvent(event)
        else:
            event.ignore()

五、QCombox改写下拉多勾选框

一般来说QCombox只支持下拉选择一项选择,这里继承QCombox类,并对其封装改写,实现下拉多选框,即:可以选择多个选项,代码如下(这里添加了一个全选选项,需要放在开头)

from PyQt5.QtWidgets import QComboBox
from PyQt5.QtCore import Qt, QEvent
from PyQt5.QtGui import QFontMetrics, QStandardItem


class MyComboBox(QComboBox):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.setEditable(True)
        self.lineEdit().setReadOnly(True)
        self.model().dataChanged.connect(self.updateText)
        self.lineEdit().installEventFilter(self)
        self.view().viewport().installEventFilter(self)
        self.updateText()

    def eventFilter(self, object, event):
        if object == self.lineEdit():
            if event.type() == QEvent.MouseButtonRelease:
                self.shwPopup()
            return False
        if object == self.view().viewport():
            if event.type() == QEvent.MouseButtonRelease:
                index = self.view().indexAt(event.pos())
                item = self.model().item(index.row())
                if item.text() == "ALL" and item.checkState() == Qt.Checked:
                    [self.model().item(i).setCheckState(Qt.Unchecked) for i in range(self.model().rowCount())]
                elif item.text() == "ALL":
                    [self.model().item(i).setCheckState(Qt.Checked) for i in range(self.model().rowCount())]
                else:
                    item.setCheckState(Qt.Unchecked if item.checkState() == Qt.Checked else Qt.Checked)
                self.model().item(0).setCheckState(Qt.Unchecked)
                for i in range(1, self.model().rowCount()):
                    if self.model().item(i).checkState() != Qt.Checked:
                        self.model().item(i).setCheckState(Qt.Unchecked)
                        return True
                self.model().item(0).setCheckState(Qt.Checked)
                return True
        return False

    def updateText(self):
        text = ".".join([self.model().item(i).text() for i in range(self.model().rowCount())
                         if self.model().item(i).checkState() == Qt.Checked])
        elidedText = QFontMetrics(self.lineEdit().font()).elidedText(text, Qt.ElideRight, self.lineEdit().width())
        self.lineEdit().setText(elidedText)

    def addItem(self, text, data=None):
        item = QStandardItem()
        item.setText(text)
        item.setFlags(Qt.ItemIsEnabled|Qt.ItemIsUserCheckable)
        item.setData(Qt.Unchecked, Qt.CheckStateRole)
        self.model().appendRow(item)
        self.lineEdit().setText("")

    def currentText(self):
        res = [self.model().item(i).text() for i in range(self.model().rowCount())
               if self.model().item(i).checkState() == Qt.Checked]
        return res

六、QRadioButton(单选按钮控件)

QRadioButton是PyQt中常用的单选按钮控件,用于让用户在多个互斥选项中选择一个
(注:下方省略了将按钮放入布局中)

创建单选按钮并绑定信号

from PyQt5.QtWidgets import QRadioButton

# 创建单选按钮
radio1 = QRadioButton("选项1")
radio2 = QRadioButton("选项2")

# 设置默认选中
radio1.setChecked(True)

# 信号绑定
radio1.clicked.connect(self.on_radio_clicked)
radio2.clicked.connect(self.on_radio_clicked)
def on_radio_clicked(self):
    if radio1.isChecked():
        print("选项1被选中")
    elif radio2.isChecked():
        print("选项2被选中")

创建两组单选按钮组

from PyQt5.QtWidgets import QButtonGroup

# 创建按钮组一:二选一
button_group1 = QButtonGroup()
radio1 = QRadioButton("选项1")
button_group.addButton(radio1)
radio2 = QRadioButton("选项2")
button_group.addButton(radio2)
radio1.setChecked(True)  # 默认选中

# 创建按钮组二:二选一
button_group2 = QButtonGroup()
radio3 = QRadioButton("选项3")
button_group2.addButton(radio3, 3)
radio4 = QRadioButton("选项4")
button_group2.addButton(radio4, 4)
radio3.setChecked(True)  # 默认选中

# 按钮组事件绑定
button_group1.buttonClicked.connect(self.on_radio_group_clicked)
def on_radio_group_clicked(self, button):
    print(f"选中了: {button.text()}")
    
# id识别按钮  绑定按钮组的idClicked信号
button_group.idClicked.connect(self.on_radio_group_id_clicked)
def on_radio_group_id_clicked(self, id):
    print(f"选中了ID为 {id} 的按钮")

# 单个按钮事件绑定同上,略
<think>好的,我现在需要帮用户完成PyQt5基本窗口控件的详细介绍。用户已经写完了信号与槽、布局管理器的部分,接下来要介绍控件相关知识,再分类列举基本控件。首先,我得确定用户的需求是什么,可能他们需要结构清晰、内容全面的指南,方便读者学习使用PyQt5的各种控件。 首先,用户需要先介绍控件的相关知识。这部分应该包括控件的基本概念,比如控件在GUI中的作用,继承关系,还有通用的属性和方法。比如,QWidget是所有控件的基类,可能需要详细说明。然后,通用属性像尺寸、位置、样式表这些,用户可能希望举一些例子,比如设置字体、颜色等。另外,事件处理也是重点,比如鼠标事件、键盘事件,这部分需要结合信号与槽的机制来讲解,因为用户之前已经写过信号与槽,可以适当衔接。 接下来是分类列举基本控件。需要按照功能进行分类,比如显示类、输入类、按钮类、容器类、对话框类、高级控件。每个类别下要列出常用控件,比如QLabel、QLineEdit、QPushButton、QGroupBox、QMessageBox、QListView等。每个控件需要简要说明用途,并给出简单的代码示例,这样读者可以直观地看到如何使用。 用户可能需要确保内容结构清晰,所以需要分点分层次。可能需要用标题来分隔不同的部分,但根据用户的要求,系统级指令中提到使用中文,并且避免使用Markdown,所以需要用文字描述结构。比如用数字和项目符号来组织内容。 另外,用户希望先讲控件相关知识,再分类列举。所以在组织内容时,需要先有一个概述部分,解释控件的基本概念,然后进入分类介绍。每个控件需要包括作用、常用方法、示例代码。示例代码要简洁,能够展示控件的创建和基本使用,比如在窗口中添加一个QLabel,并设置文本和样式。 需要注意PyQt5的版本是否影响控件使用,但一般来说,基本控件在不同版本中变化不大,所以可能不需要特别说明版本问题。另外,要确保代码的正确性,比如正确的导入语句,正确的语法,比如使用setText()方法,设置样式表的方式等。 在事件处理部分,需要强调与信号与槽的连接,比如点击按钮触发槽函数,这样可以和用户之前写的信号与槽部分联系起来。比如,QPushButton的clicked信号连接到自定义的槽函数。 可能还需要提到一些常用方法,比如隐藏控件hide(),禁用控件setDisabled(),设置工具提示setToolTip(),这些通用方法对于用户理解控件的功能很有帮助。 在分类部分,需要合理划分控件类型。比如显示类控件包括QLabel、QLCDNumber,输入类包括QLineEdit、QTextEdit,按钮类包括QPushButton、QRadioButton,容器类如QGroupBox、QTabWidget,对话框类如QMessageBoxQFileDialog,高级控件如QListView、QTreeView。每个类别选几个典型控件,说明其用途和示例。 需要注意不要遗漏重要控件,但也不能过于冗长。保持每个控件的介绍简洁,但涵盖主要功能。比如QLineEdit可以提到输入验证,QTextEdit支持多行文本,QComboBox的下拉选项等。 最后,可能需要一个小结,总结控件的重要性,并预告接下来的内容,比如布局管理与控件的结合使用,或者更复杂的控件使用案例,这样可以引导读者继续学习。 现在检查是否有遗漏的部分,比如控件的样式设置,或者国际化支持,但可能这些属于进阶内容,用户目前只需要基本介绍。所以保持内容在基础层面,确保结构清晰,示例正确,语言简洁明了。</think>以下是为您整理的PyQt5基本窗口控件详解内容结构(约700字): 一、控件核心知识体系 1. 控件基础概念 - GUI应用程序的视觉化交互元素 - 继承关系:所有控件均派生自QWidget基类 - 功能划分:数据显示、用户输入、容器组织、信息反馈等 2. 通用控件属性(以QWidget为例) ```python widget.setFixedSize(200, 50) # 固定尺寸 widget.move(10, 20) # 绝对定位 widget.setStyleSheet("background: #F0F0F0; font-size: 14px") # 样式设置 widget.setToolTip("提示信息") # 悬浮提示 ``` 3. 事件处理机制 - 鼠标事件:mousePressEvent/mouseReleaseEvent - 键盘事件:keyPressEvent/keyReleaseEvent - 窗口事件:closeEvent/resizeEvent - 通过信号槽连接实现交互: ```python button.clicked.connect(self.handle_click) ``` 二、基础控件分类详解 1. 信息展示类 - QLabel:文本/图像展示 ```python label = QLabel("状态信息") label.setPixmap(QPixmap("icon.png")) label.setAlignment(Qt.AlignCenter) ``` - QLCDNumber:数字显示屏 ```python lcd = QLCDNumber() lcd.display(12.5) # 显示浮点数 ``` 2. 输入采集类 - QLineEdit:单行文本输入 ```python line_edit = QLineEdit() line_edit.setPlaceholderText("请输入姓名") line_edit.setMaxLength(20) ``` - QTextEdit:富文本编辑器 ```python text_edit = QTextEdit() text_edit.append("多行文本内容") ``` 3. 交互按钮类 - QPushButton:标准按钮 ```python btn = QPushButton("确认") btn.setIcon(QIcon("ok.png")) ``` - QRadioButton:单选按钮 ```python radio1 = QRadioButton("选项1") radio2 = QRadioButton("选项2") radio1.setChecked(True) # 默认选中 ``` 4. 容器组织类 - QGroupBox:分组容器 ```python group = QGroupBox("用户信息") group.setCheckable(True) # 可折叠分组 ``` - QTabWidget:选项卡容器 ```python tabs = QTabWidget() tabs.addTab(QWidget(), "基本信息") tabs.addTab(QWidget(), "高级设置") ``` 5. 对话框类 - QMessageBox:信息提示框 ```python QMessageBox.information(window, "提示", "保存成功") ``` - QFileDialog:文件选择 ```python path, _ = QFileDialog.getOpenFileName() ``` 6. 高级控件 - QComboBox:下拉选择框 ```python combo = QComboBox() combo.addItems(["选项1", "选项2", "选项3"]) ``` - QSlider:滑动条 ```python slider = QSlider(Qt.Horizontal) slider.setRange(0, 100) ``` 三、控件使用建议 1. 遵循"单一职责"原则,每个控件专注特定功能 2. 结合布局管理器实现自适应界面 3. 复杂界面采用容器控件分层组织 4. 重要操作需添加状态提示和输入验证 (后续可衔接:1. 控件与布局的配合技巧 2. 自定义控件开发 3. 典型控件组合案例)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值