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

更新於 2024/10/24閱讀時間約 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
128會員
209內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
螃蟹_crab的沙龍 的其他內容
以下是一個關於 PyQt5 基礎教學的簡單入門文,帶你一步步了解如何從零開始建立 PyQt5 應用程序。 1. 安裝 PyQt5 首先,確保你安裝了 PyQt5 庫。打開終端或命令提示符,輸入以下命令進行安裝: pip install pyqt5 2. 建立最簡單的 PyQt5 應用程序
以下是一個關於 PyQt5 基礎教學的簡單入門文,帶你一步步了解如何從零開始建立 PyQt5 應用程序。 1. 安裝 PyQt5 首先,確保你安裝了 PyQt5 庫。打開終端或命令提示符,輸入以下命令進行安裝: pip install pyqt5 2. 建立最簡單的 PyQt5 應用程序
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
上兩篇有關List的文章,此篇文上兩章的延續,整理一些常用的方法和操作。 [Python]List(列表)新增、修改、刪除元素 [Python基礎]容器 list(列表),tuple(元組) 還有一些常用的 list 方法和操作,讓你能更靈活地處理列表數據
Thumbnail
打開 jupyter notebook 寫一段 python 程式,可以完成五花八門的工作,這是玩程式最簡便的方式,其中可以獲得很多快樂,在現今這種資訊發達的時代,幾乎沒有門檻,只要願意,人人可享用。 下一步,希望程式可以隨時待命聽我吩咐,不想每次都要開電腦,啟動開發環境,只為完成一個重複性高
Thumbnail
在離線環境需要安裝Python套件時就相當的麻煩,需要先下載好套件包,在打指令安裝,若套件數量一多時就會相當麻煩。 本文將介紹如何利用兩行指令快速的安裝整個資料夾的套件。
Thumbnail
這個系列的教學會列出基本上所有常見的造型和一些基礎 , 讓各位可以自行搭配造型~在這個第四篇呢 , 我們會來一起了解:常見的窗口 / 框架造型定義他們的意思加了之後有什麼效果那就讓我們開始吧!
from win32com.client import Dispatch path = "D:\PROGRAMMING\PythonCode\pypptx\image1.png" # 启动PowerPoint应用程序 ppt = Dispatch('PowerPoint.Applicatio
Thumbnail
本文利用pyqt5,使用pyttsx3將QLineEdit(單行輸入框)的字串,轉成語音呈現出來。
Thumbnail
先前我們談論到靜態方法就像是定義工具箱一樣,那麼抽象方法就像是共用表格的概念,例如註冊帳號時會填寫的一些基本資料,就有包含制式的表格,裡面有需填寫的欄位,例如姓名,性別等。
Thumbnail
在C#的視窗應用程式中,右鍵選單(Context Menu)是一個方便的使用者介面元素。當中的項目可以包含各種功能,而有時我們可能需要在使用者點擊右鍵選單中的某個項目時,取得該項目的值。以下是一個簡單的教學,教你如何在C#中實現這個功能。
Thumbnail
本文將介紹自定函式及應用,利用程式範例解釋為什麼要用到自定函式 自定函式好處當然就是,讓你的程式碼看起來比較簡潔,在重複使用到的程式碼區塊,可以包裝成函式,讓你重複使用它。
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
上兩篇有關List的文章,此篇文上兩章的延續,整理一些常用的方法和操作。 [Python]List(列表)新增、修改、刪除元素 [Python基礎]容器 list(列表),tuple(元組) 還有一些常用的 list 方法和操作,讓你能更靈活地處理列表數據
Thumbnail
打開 jupyter notebook 寫一段 python 程式,可以完成五花八門的工作,這是玩程式最簡便的方式,其中可以獲得很多快樂,在現今這種資訊發達的時代,幾乎沒有門檻,只要願意,人人可享用。 下一步,希望程式可以隨時待命聽我吩咐,不想每次都要開電腦,啟動開發環境,只為完成一個重複性高
Thumbnail
在離線環境需要安裝Python套件時就相當的麻煩,需要先下載好套件包,在打指令安裝,若套件數量一多時就會相當麻煩。 本文將介紹如何利用兩行指令快速的安裝整個資料夾的套件。
Thumbnail
這個系列的教學會列出基本上所有常見的造型和一些基礎 , 讓各位可以自行搭配造型~在這個第四篇呢 , 我們會來一起了解:常見的窗口 / 框架造型定義他們的意思加了之後有什麼效果那就讓我們開始吧!
from win32com.client import Dispatch path = "D:\PROGRAMMING\PythonCode\pypptx\image1.png" # 启动PowerPoint应用程序 ppt = Dispatch('PowerPoint.Applicatio
Thumbnail
本文利用pyqt5,使用pyttsx3將QLineEdit(單行輸入框)的字串,轉成語音呈現出來。
Thumbnail
先前我們談論到靜態方法就像是定義工具箱一樣,那麼抽象方法就像是共用表格的概念,例如註冊帳號時會填寫的一些基本資料,就有包含制式的表格,裡面有需填寫的欄位,例如姓名,性別等。
Thumbnail
在C#的視窗應用程式中,右鍵選單(Context Menu)是一個方便的使用者介面元素。當中的項目可以包含各種功能,而有時我們可能需要在使用者點擊右鍵選單中的某個項目時,取得該項目的值。以下是一個簡單的教學,教你如何在C#中實現這個功能。
Thumbnail
本文將介紹自定函式及應用,利用程式範例解釋為什麼要用到自定函式 自定函式好處當然就是,讓你的程式碼看起來比較簡潔,在重複使用到的程式碼區塊,可以包裝成函式,讓你重複使用它。