文章目錄
- 一、控件常用函數介紹
- 二、QFileDialog(文件類操作)
- 三、QMessageBox(對話框)
- 四、QTreeWidget(樹結構類操作)
- 4.1 樹結構的初始化
- 4.2 遞歸讀取完整樹結構
- 4.3 兩QTreeWidget滑輪同步滑動
- 4.4 信號槽綁定
- 五、QCombox改寫下拉多勾選框
- 六、QRadioButton(單選按鈕控件)
- 七、QTextEdit(多行文本框)
一、控件常用函數介紹
常用函數
函數 | 功能 |
---|---|
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 QFileDialogfile_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 QFileDialogsave_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 QFileDialogfile_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 兩QTreeWidget滑輪同步滑動
# 創建并初始化
self.tree1 = QtWidgets.QTreeWidget()
self.tree2 = QtWidgets.QTreeWidget()
for i in range(100):QtWidgets.QTreeWidgetItem(self.tree1).setText(0, str(i))QtWidgets.QTreeWidgetItem(self.tree2).setText(0, str(i))# 獲取水平滾動條
scoll1 = self.tree1.verticalScrollBar()
scoll2 = self.tree2.verticalScrollBar()
# 同步滾動
scoll1.valueChanged.connect(lambda val: scoll2.setValue(val))
scoll2.valueChanged.connect(lambda val: scoll1.setValue(val))
4.4 信號槽綁定
函數 | 含義 |
---|---|
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, QStandardItemclass 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 Falseif 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 Trueself.model().item(0).setCheckState(Qt.Checked)return Truereturn Falsedef 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} 的按鈕")# 單個按鈕事件綁定同上,略
七、QTextEdit(多行文本框)
QTextEdit是PyQt中用于多行文本編輯的控件,支持富文本格式(HTML)、純文本和高級文本編輯功能
函數 | 含義 |
---|---|
toPlainText() | 獲取純文本 |
append() | 在末尾添加文本 |
clear() | 清空文本 |
setHtml() | 設置HTML富文本 |
currentCharFormat() | 獲取當前文本格式 |
setReadOnly(True) | 設置為只讀 |
setLineWrapMode(QTextEdit.NoWrap) | 不自動換行 |
setTabStopDistance(40) | 設置Tab鍵寬度(像素) |
find() | 查找文本 |
textChanged.connect | 文本改變時觸發 |
cursorPositionChanged.connect | 光標位置改變時觸發 |
selectionChanged.connect | 選中文本改變時觸發 |
self.line_edit = QtWidgets.QTextEdit()
self.layout.addWidget(self.line_edit)# 追加內容
self.line_edit.append("hello")
# 獲取存文本
txt = self.line_edit.toPlainText()# 設置文字樣式并追加到末尾
txt_format = QtGui.QTextCharFormat()
txt_format.setFontWeight(QtGui.QFont.Bold) # 加粗
txt_format.setFontItalic(True) # 斜體
txt_format.setFontUnderline(True) # 下劃線
txt_format.setForeground(QtGui.QColor('red')) # 文字顏色
cursor = self.line_edit.textCursor()
cursor.movePosition(QtGui.QTextCursor.End)
cursor.setCharFormat(txt_format)
cursor.insertText("hello")
self.line_edit.setTextCursor(cursor)