更新於 2024/10/24閱讀時間約 14 分鐘

[PyQt5][Python] QMainWindow多窗口應用

進一步探討 PyQt5 的一些進階功能,具體包括如何使用更多的控件如 QComboBox(下拉框)、QTableWidget(表格),如何使用 QMainWindow 建立多窗口應用,及如何自訂樣式和設計。

1. 使用 QComboBox(下拉框)

QComboBox 是一個下拉框控件,用來顯示一組選項,使用者可以從中選擇一項。

範例:使用 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():綁定事件,當選擇改變時更新標籤。


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. 主要步驟解析:

  1. QComboBox:
    • 下拉選單用來切換不同的頁面,選擇表格頁面或標籤頁面。
    • 使用 addItem() 方法來添加選項。
  2. QStackedWidget:
    • 用來存放多個頁面(可以是不同的控件,如表格、標籤等),並通過 setCurrentIndex() 來顯示當前選中的頁面。
  3. switch_page() 方法:
    • 當下拉選單的選項改變時,currentIndexChanged 信號觸發,調用 switch_page() 方法來改變顯示的頁面。
  4. 頁面設置:
    • 頁面 1 是一個 QTableWidget 表格,頁面 2 是一個 QLabel 顯示靜態文本。



總結

在這篇教學中,我們學習了如何使用 QComboBoxQTableWidget 這兩個常用控件,如何使用 QMainWindow 創建多窗口應用,並使用 QComboBox 控制 QStackedWidget 的頁面切換,實現了多頁面應用的效果。如果你想要更多控件或功能,可以在不同頁面中進行擴展。

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.