進一步探討 PyQt5 的一些進階功能,具體包括如何使用更多的控件如 QComboBox(下拉框)、QTableWidget(表格),如何使用 QMainWindow 建立多窗口應用,及如何自訂樣式和設計。
QComboBox
是一個下拉框控件,用來顯示一組選項,使用者可以從中選擇一項。
下拉選擇,選項二,觸發事件(要用函式function包著),顯示選擇的內容
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QComboBox, QLabel
def on_combobox_change():
selected_text = combo_box.currentText()
label.setText(f'你選擇了: {selected_text}')
app = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle('QComboBox 示例')
# 創建 QComboBox
combo_box = QComboBox()
combo_box.addItems(['選項 1', '選項 2', '選項 3'])
# 創建標籤來顯示選擇的結果
label = QLabel('尚未選擇')
# 垂直布局
layout = QVBoxLayout()
layout.addWidget(combo_box)
layout.addWidget(label)
window.setLayout(layout)
# 綁定選擇事件
combo_box.currentIndexChanged.connect(on_combobox_change)
window.show()
sys.exit(app.exec_())
QComboBox.addItems()
:用來添加下拉框的選項。currentIndexChanged.connect()
:綁定事件,當選擇改變時更新標籤。QTableWidget
用來顯示表格資料,你可以定義行數和列數,並在單元格中顯示內容。
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QTableWidget, QTableWidgetItem
app = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle('QTableWidget 示例')
# 創建 QTableWidget,設定行和列
table = QTableWidget()
table.setRowCount(3)
table.setColumnCount(3)
table.setHorizontalHeaderLabels(['列 1', '列 2', '列 3'])
# 設置表格中的值
table.setItem(0, 0, QTableWidgetItem('Row 1, Col 1'))
table.setItem(0, 1, QTableWidgetItem('Row 1, Col 2'))
table.setItem(0, 2, QTableWidgetItem('Row 1, Col 3'))
# 垂直布局
layout = QVBoxLayout()
layout.addWidget(table)
window.setLayout(layout)
window.show()
sys.exit(app.exec_())
setRowCount()
和 setColumnCount()
:設定表格的行數和列數。setItem()
:為指定的單元格設置資料。QMainWindow
是 PyQt5 中專門用來處理多窗口應用的基礎類,支援menu欄、工具欄、狀態欄等元素。
點擊新視窗,就會開啟新視窗
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QMenu, QAction
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle('QMainWindow 多窗口示例')
self.setGeometry(100, 100, 400, 300)
# 創建標籤並放入中心
label = QLabel('主視窗內容', self)
self.setCentralWidget(label)
# 創建menu欄
menu_bar = self.menuBar()
file_menu = menu_bar.addMenu('檔案')
# 創建menu選項
open_action = QAction('開啟新視窗', self)
open_action.triggered.connect(self.open_new_window)
file_menu.addAction(open_action)
def open_new_window(self):
self.new_window = QMainWindow()
self.new_window.setWindowTitle('新視窗')
self.new_window.setGeometry(200, 200, 200, 150)
label = QLabel('這是新視窗', self.new_window)
self.new_window.setCentralWidget(label)
self.new_window.show()
app = QApplication(sys.argv)
main_win = MainWindow()
main_win.show()
sys.exit(app.exec_())
QMainWindow
:用來創建應用的主視窗。setCentralWidget()
:用來設定主視窗中的核心內容。menuBar()
:創建應用的Menu。我們將構建一個應用,包含一個 QComboBox 作為下拉選單來切換不同的頁面,並且每個頁面展示不同的內容(例如 QTableWidget 和 QLabel)。
使用下拉式選單,即可切換頁面
python
複製程式碼import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QComboBox, QStackedWidget, QLabel, QTableWidget, QTableWidgetItem
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle('多頁面切換示例')
self.setGeometry(100, 100, 500, 400)
# 創建中央小部件
central_widget = QWidget()
self.setCentralWidget(central_widget)
# 創建 QComboBox (下拉選單) 用來切換頁面
self.combo_box = QComboBox()
self.combo_box.addItem('表格頁面')
self.combo_box.addItem('標籤頁面')
# 創建 QStackedWidget 用來包含多個頁面
self.stacked_widget = QStackedWidget()
# 頁面 1: QTableWidget 表格
table_widget = QTableWidget()
table_widget.setRowCount(3)
table_widget.setColumnCount(3)
table_widget.setHorizontalHeaderLabels(['列 1', '列 2', '列 3'])
table_widget.setItem(0, 0, QTableWidgetItem('Row 1, Col 1'))
table_widget.setItem(0, 1, QTableWidgetItem('Row 1, Col 2'))
table_widget.setItem(0, 2, QTableWidgetItem('Row 1, Col 3'))
# 頁面 2: QLabel 標籤頁面
label_page = QLabel('這是一個標籤頁面')
# 添加頁面到 QStackedWidget
self.stacked_widget.addWidget(table_widget)
self.stacked_widget.addWidget(label_page)
# 綁定 QComboBox 的切換事件
self.combo_box.currentIndexChanged.connect(self.switch_page)
# 垂直布局
layout = QVBoxLayout()
layout.addWidget(self.combo_box)
layout.addWidget(self.stacked_widget)
# 設置中央小部件的布局
central_widget.setLayout(layout)
def switch_page(self):
# 根據 QComboBox 的選擇來切換頁面
index = self.combo_box.currentIndex()
self.stacked_widget.setCurrentIndex(index)
app = QApplication(sys.argv)
main_window = MainWindow()
main_window.show()
sys.exit(app.exec_())
在這篇教學中,我們學習了如何使用 QComboBox
和 QTableWidget
這兩個常用控件,如何使用 QMainWindow
創建多窗口應用,並使用 QComboBox
控制 QStackedWidget
的頁面切換,實現了多頁面應用的效果。如果你想要更多控件或功能,可以在不同頁面中進行擴展。