進一步探討 PyQt5 的一些進階功能,具體包括如何使用更多的控件如 QComboBox(下拉框)、QTableWidget(表格),如何使用 QMainWindow 建立多窗口應用,及如何自訂樣式和設計。
1. 使用 QComboBox(下拉框)
QComboBox
是一個下拉框控件,用來顯示一組選項,使用者可以從中選擇一項。
範例:使用 QComboBox


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()
:綁定事件,當選擇改變時更新標籤。
2. 使用 QTableWidget(表格)
QTableWidget
用來顯示表格資料,你可以定義行數和列數,並在單元格中顯示內容。

範例:使用 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()
:為指定的單元格設置資料。
3. 使用 QMainWindow 建立多窗口應用
QMainWindow
是 PyQt5 中專門用來處理多窗口應用的基礎類,支援menu欄、工具欄、狀態欄等元素。
範例:使用 QMainWindow 建立多窗口

點擊新視窗,就會開啟新視窗

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。
4.多頁面切換範例
我們將構建一個應用,包含一個 QComboBox 作為下拉選單來切換不同的頁面,並且每個頁面展示不同的內容(例如 QTableWidget 和 QLabel)。

使用下拉式選單,即可切換頁面

範例:使用 QComboBox 切換多個頁面
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_())
2. 主要步驟解析:
- QComboBox:
- 下拉選單用來切換不同的頁面,選擇表格頁面或標籤頁面。
- 使用 addItem() 方法來添加選項。
- QStackedWidget:
- 用來存放多個頁面(可以是不同的控件,如表格、標籤等),並通過 setCurrentIndex() 來顯示當前選中的頁面。
- switch_page() 方法:
- 當下拉選單的選項改變時,currentIndexChanged 信號觸發,調用 switch_page() 方法來改變顯示的頁面。
- 頁面設置:
- 頁面 1 是一個 QTableWidget 表格,頁面 2 是一個 QLabel 顯示靜態文本。
總結
在這篇教學中,我們學習了如何使用 QComboBox
和 QTableWidget
這兩個常用控件,如何使用 QMainWindow
創建多窗口應用,並使用 QComboBox
控制 QStackedWidget
的頁面切換,實現了多頁面應用的效果。如果你想要更多控件或功能,可以在不同頁面中進行擴展。