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

更新於 發佈於 閱讀時間約 14 分鐘

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

1. 使用 QComboBox(下拉框)

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

範例:使用 QComboBox

raw-image

下拉選擇,選項二,觸發事件(要用函式function包著),顯示選擇的內容

raw-image


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 用來顯示表格資料,你可以定義行數和列數,並在單元格中顯示內容。

raw-image


範例:使用 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 建立多窗口

raw-image

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

raw-image
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)。

raw-image

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

raw-image


範例:使用 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 的頁面切換,實現了多頁面應用的效果。如果你想要更多控件或功能,可以在不同頁面中進行擴展。

留言
avatar-img
留言分享你的想法!
avatar-img
螃蟹_crab的沙龍
143會員
253內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
螃蟹_crab的沙龍的其他內容
2025/02/10
在 PyQt 中,信號與槽(Signal & Slot)機制是用來實現物件間通信的核心機制。 當信號被發射時,槽函數(Slot)根據預先連接的規則被調用。這一過程有時候會呈現出「排隊」的現象,即信號並非立即執行,而是先放入事件隊列,等待事件循環(Event Loop)逐一處理。 本文將介紹其原理
Thumbnail
2025/02/10
在 PyQt 中,信號與槽(Signal & Slot)機制是用來實現物件間通信的核心機制。 當信號被發射時,槽函數(Slot)根據預先連接的規則被調用。這一過程有時候會呈現出「排隊」的現象,即信號並非立即執行,而是先放入事件隊列,等待事件循環(Event Loop)逐一處理。 本文將介紹其原理
Thumbnail
2025/01/19
PyQt 中的 pyqtSignal 和 pyqtSlot 教學 在使用 PyQt5 開發 GUI 程式時,信號 (Signal) 和 槽 (Slot) 是重要的機制,用於元件之間的通訊。 PyQt 提供了 pyqtSignal 和 pyqtSlot 來自定義信號和槽,進一步實現更靈活的功能。
Thumbnail
2025/01/19
PyQt 中的 pyqtSignal 和 pyqtSlot 教學 在使用 PyQt5 開發 GUI 程式時,信號 (Signal) 和 槽 (Slot) 是重要的機制,用於元件之間的通訊。 PyQt 提供了 pyqtSignal 和 pyqtSlot 來自定義信號和槽,進一步實現更靈活的功能。
Thumbnail
2024/11/16
本篇文章將帶你一步步建立一個簡單的 PyQt5 GUI 應用程式,通過 yt-dlp 來下載 YT 視頻。你可以在這個應用中輸入視頻的 URL,並即時看到下載進度。 GUI介面 下載到開啟的資料夾路徑 前置條件 在開始之前,請確保你已經安裝了以下軟體和庫: 安裝 Python 確保你
Thumbnail
2024/11/16
本篇文章將帶你一步步建立一個簡單的 PyQt5 GUI 應用程式,通過 yt-dlp 來下載 YT 視頻。你可以在這個應用中輸入視頻的 URL,並即時看到下載進度。 GUI介面 下載到開啟的資料夾路徑 前置條件 在開始之前,請確保你已經安裝了以下軟體和庫: 安裝 Python 確保你
Thumbnail
看更多
你可能也想看
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
File - 文件 New Text File - 新文字檔 (Ctrl+N) New File... - 新檔案... (Ctrl+Alt+Windows+N) New Window - 新視窗 (Ctrl+Shift+N) New Window with Profile - 具有設定檔的
Thumbnail
File - 文件 New Text File - 新文字檔 (Ctrl+N) New File... - 新檔案... (Ctrl+Alt+Windows+N) New Window - 新視窗 (Ctrl+Shift+N) New Window with Profile - 具有設定檔的
Thumbnail
PyQt 中的 pyqtSignal 和 pyqtSlot 教學 在使用 PyQt5 開發 GUI 程式時,信號 (Signal) 和 槽 (Slot) 是重要的機制,用於元件之間的通訊。 PyQt 提供了 pyqtSignal 和 pyqtSlot 來自定義信號和槽,進一步實現更靈活的功能。
Thumbnail
PyQt 中的 pyqtSignal 和 pyqtSlot 教學 在使用 PyQt5 開發 GUI 程式時,信號 (Signal) 和 槽 (Slot) 是重要的機制,用於元件之間的通訊。 PyQt 提供了 pyqtSignal 和 pyqtSlot 來自定義信號和槽,進一步實現更靈活的功能。
Thumbnail
用 PyInstaller 打包一個簡單計算機應用 (GUI 使用 PyQt5) 本教學將帶您使用 PyQt5 建立一個簡單的計算機應用,並透過 PyInstaller 將其打包成執行檔(EXE)。 1. 安裝所需環境 在開始之前,請確保您已安裝以下工具: 必要套件 Python: 建
Thumbnail
用 PyInstaller 打包一個簡單計算機應用 (GUI 使用 PyQt5) 本教學將帶您使用 PyQt5 建立一個簡單的計算機應用,並透過 PyInstaller 將其打包成執行檔(EXE)。 1. 安裝所需環境 在開始之前,請確保您已安裝以下工具: 必要套件 Python: 建
Thumbnail
本文利用pyqt5,使用pyttsx3將QLineEdit(單行輸入框)的字串,轉成語音呈現出來。
Thumbnail
本文利用pyqt5,使用pyttsx3將QLineEdit(單行輸入框)的字串,轉成語音呈現出來。
Thumbnail
本篇文章將教你如何使用Python和PyQt5來建立一個GUI應用程式。PyQt5是一個相當流行的Python模組,透過這個文章你將學習如何使用它來建立一個互動式的應用程式。
Thumbnail
本篇文章將教你如何使用Python和PyQt5來建立一個GUI應用程式。PyQt5是一個相當流行的Python模組,透過這個文章你將學習如何使用它來建立一個互動式的應用程式。
Thumbnail
Qt是軟體開發領域中非常著名的C++視覺化開發平台,能夠為應用程式開發者提供建立專業圖形化使用者介面所需的所有功能。QT有很完整的硬體、作業系統、視窗元件的處理,它是完全物件導向的,很容易擴充,並且可應用於元件程式設計,也是目前流行的Linux 桌面環境KDE 的基礎。
Thumbnail
Qt是軟體開發領域中非常著名的C++視覺化開發平台,能夠為應用程式開發者提供建立專業圖形化使用者介面所需的所有功能。QT有很完整的硬體、作業系統、視窗元件的處理,它是完全物件導向的,很容易擴充,並且可應用於元件程式設計,也是目前流行的Linux 桌面環境KDE 的基礎。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News