【100天精通python】Day37:GUI界面編程_PyQT從入門到實戰(上)

目錄

?專欄導讀?

1 PyQt6 簡介:

1.1 安裝 PyQt6 和相關工具:

1.2 PyQt6 基礎知識:

1.2.1 Qt 的基本概念和組件:

1.2.2 創建和使用 Qt 窗口、標簽、按鈕等基本組件

1.2.3 布局管理器:垂直布局、水平布局、網格布局等:

2 事件處理和信號槽

2.1 事件和信號的概念

2.2 處理用戶輸入:鼠標點擊、鍵盤按鍵等

2.3 信號槽機制:連接信號和槽函數

3 Qt 界面設計

3.1 使用 Qt Designer 創建界面

3.2 設置界面樣式和主題:

3.3 自定義樣式表


?專欄導讀?

專欄訂閱地址:https://blog.csdn.net/qq_35831906/category_12375510.html


1 PyQt6 簡介:

????????PyQt6 是一個 Python 庫,提供了對 Qt 6 C++ 庫的 Python 綁定,使開發者能夠使用 Python 來創建豐富的圖形用戶界面應用程序。Qt 6 是一個廣泛使用的跨平臺應用程序框架,它提供了豐富的工具和組件,用于構建桌面、移動和嵌入式應用程序。PyQt6 允許開發者充分利用 Qt 6 的功能,同時使用 Python 進行開發。

1.1 安裝 PyQt6 和相關工具:

要安裝 PyQt6,可以使用以下命令:

pip install PyQt6

1.2 PyQt6 基礎知識:

1.2.1 Qt 的基本概念和組件:

  • QWidget:是所有 Qt 窗口部件的基類,它提供了基本的窗口功能。
  • QLabel:用于顯示文本或圖像。
  • QPushButton:用于創建按鈕。
  • QLineEdit:用于接收單行文本輸入。
  • QTextEdit:用于接收多行文本輸入。

1.2.2 創建和使用 Qt 窗口、標簽、按鈕等基本組件

以下示例展示了如何創建一個簡單的 PyQt6 窗口,并在窗口中添加一個標簽和按鈕:

import sys
from PyQt6.QtWidgets import QApplication, QMainWindow, QLabel, QPushButtonclass MyWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("PyQt6 Example")self.setGeometry(100, 100, 400, 300)label = QLabel("Hello, PyQt6!", self)label.move(150, 150)button = QPushButton("Click Me", self)button.setGeometry(150, 200, 100, 30)button.clicked.connect(self.on_button_click)def on_button_click(self):print("Button Clicked!")if __name__ == "__main__":app = QApplication(sys.argv)window = MyWindow()window.show()sys.exit(app.exec())

1.2.3 布局管理器:垂直布局、水平布局、網格布局等:

布局管理器用于組織和排列界面上的組件。以下是一個使用垂直布局和水平布局的示例:

import sys
from PyQt6.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QPushButton, QLabel, QWidgetclass MyWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("Layout Example")self.setGeometry(100, 100, 400, 300)main_widget = QWidget(self)self.setCentralWidget(main_widget)layout = QVBoxLayout()label = QLabel("Hello, PyQt6!", self)layout.addWidget(label)button = QPushButton("Click Me", self)layout.addWidget(button)main_widget.setLayout(layout)if __name__ == "__main__":app = QApplication(sys.argv)window = MyWindow()window.show()sys.exit(app.exec())

2 事件處理和信號槽

2.1 事件和信號的概念

????????在 PyQt6 中,事件是與用戶交互或系統操作相關的動作。信號是對象發出的事件通知,而槽是響應信號的函數。

2.2 處理用戶輸入:鼠標點擊、鍵盤按鍵等

????????你可以通過重寫 QWidget 的事件處理方法來處理不同的用戶輸入事件。例如,處理鼠標點擊事件:

import sys
from PyQt6.QtWidgets import QApplication, QMainWindow, QLabel
from PyQt6.QtCore import Qtclass MyWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("Event Handling Example")self.setGeometry(100, 100, 400, 300)self.label = QLabel("Click anywhere in the window", self)self.label.setAlignment(Qt.AlignmentFlag.AlignCenter)self.label.setGeometry(0, 100, 400, 50)def mousePressEvent(self, event):if event.button() == Qt.MouseButton.LeftButton:self.label.setText("Left mouse button clicked")elif event.button() == Qt.MouseButton.RightButton:self.label.setText("Right mouse button clicked")if __name__ == "__main__":app = QApplication(sys.argv)window = MyWindow()window.show()sys.exit(app.exec())

2.3 信號槽機制:連接信號和槽函數

使用信號槽機制,你可以在對象之間建立通信。以下是一個按鈕點擊信號與槽函數連接的示例:

import sys
from PyQt6.QtWidgets import QApplication, QMainWindow, QPushButton, QLabel, QLineEdit, QCheckBoxclass MyWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("Signal Slot Example")self.setGeometry(100, 100, 400, 300)# 創建一個標簽,用于顯示按鈕點擊次數self.label = QLabel("Click the button", self)self.label.setGeometry(150, 30, 150, 30)# 創建一個按鈕,并連接點擊事件到槽函數button = QPushButton("Click Me", self)button.setGeometry(150, 70, 100, 30)button.clicked.connect(self.on_button_click)self.counter = 0  # 記錄按鈕點擊次數的計數器# 創建一個復選框,用于啟用/禁用輸入框self.checkbox = QCheckBox("Enable Input", self)self.checkbox.setGeometry(100, 120, 200, 30)self.checkbox.toggled.connect(self.on_checkbox_toggled)# 創建一個文本標簽和輸入框self.input_label = QLabel("Enter text:", self)self.input_label.setGeometry(80, 160, 100, 30)self.input_text = QLineEdit(self)self.input_text.setGeometry(180, 160, 150, 30)self.input_text.setEnabled(False)  # 初始狀態下禁用輸入框self.input_text.textChanged.connect(self.on_text_changed)def on_button_click(self):self.counter += 1self.label.setText(f"Button Clicked {self.counter} times!")def on_checkbox_toggled(self, checked):# 當復選框狀態改變時,啟用/禁用輸入框self.input_text.setEnabled(checked)if not checked:self.input_text.clear()def on_text_changed(self, text):# 當輸入框文本改變時,更新標簽顯示的文本self.label.setText(f"Input Text: {text}")if __name__ == "__main__":app = QApplication(sys.argv)window = MyWindow()window.show()sys.exit(app.exec())

3 Qt 界面設計

3.1 使用 Qt Designer 創建界面

????????Qt Designer 是一個可視化的界面設計工具,它可以幫助你直觀地創建界面,然后將設計好的界面與 PyQt 代碼結合。以下是一個簡單的步驟來使用 Qt Designer:

使用Qt Designer創建界面:

  1. 打開 Qt Designer 工具。
  2. 設計界面:拖拽組件、設置屬性、布局等。
  3. 保存設計為 .ui 文件。
  4. 使用 pyuic 工具將 .ui 文件轉換為 Python 代碼。

如果你的 .ui 文件名為 my_ui.ui,你可以使用以下命令將其轉換為 Python 代碼:

pyuic6 my_ui.ui -o my_ui.py

3.2 設置界面樣式和主題:

????????你可以使用 Qt 的樣式表來自定義界面的外觀和風格。樣式表使用 CSS 類似的語法。以下是一個簡單的示例:

from PyQt6.QtWidgets import QApplication, QMainWindow, QPushButtonapp = QApplication([])# 創建窗口和按鈕
window = QMainWindow()
button = QPushButton("Styled Button")
window.setCentralWidget(button)# 設置樣式表
style = """QPushButton {background-color: #4CAF50;color: white;padding: 10px 20px;border: none;}
"""
button.setStyleSheet(style)window.show()
app.exec()

?示例2:

import sys
from PyQt6.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QLabel, QWidget
from PyQt6.QtGui import QPalette, QColor
from PyQt6.QtCore import Qtclass MyWindow(QMainWindow):def __init__(self):super().__init__()# 設置窗口標題和尺寸self.setWindowTitle("Styled Button Example")self.setGeometry(100, 100, 400, 300)# 創建中央部件self.central_widget = QWidget(self)self.setCentralWidget(self.central_widget)# 設置背景顏色palette = QPalette()palette.setColor(QPalette.ColorRole.Window, QColor(240, 240, 240))self.central_widget.setPalette(palette)# 創建垂直布局管理器layout = QVBoxLayout()self.central_widget.setLayout(layout)# 創建一個標簽,顯示按鈕點擊狀態self.label = QLabel("Button not clicked", self)layout.addWidget(self.label, alignment=Qt.AlignmentFlag.AlignCenter)# 設置按鈕樣式表style = """QPushButton {background-color: #3498db;color: white;padding: 10px 20px;border: none;border-radius: 5px;}QPushButton:hover {background-color: #2980b9;}"""self.button = QPushButton("Styled Button", self)self.button.setStyleSheet(style)layout.addWidget(self.button, alignment=Qt.AlignmentFlag.AlignCenter)self.button.clicked.connect(self.on_button_click)# 創建切換主題按鈕self.theme_button = QPushButton("Change Theme", self)layout.addWidget(self.theme_button, alignment=Qt.AlignmentFlag.AlignCenter)self.theme_button.clicked.connect(self.change_theme)def on_button_click(self):# 當按鈕被點擊時,更新標簽文本self.label.setText("Button clicked!")def change_theme(self):# 切換主題樣式表new_style = """QPushButton {background-color: #e74c3c;color: white;padding: 10px 20px;border: none;border-radius: 5px;}QPushButton:hover {background-color: #c0392b;}"""self.button.setStyleSheet(new_style)if __name__ == "__main__":# 創建應用程序實例并顯示窗口app = QApplication(sys.argv)window = MyWindow()window.show()sys.exit(app.exec())

?3.3 自定義樣式表

????????自定義樣式表是一種在Qt應用程序中使用CSS(層疊樣式表)語法來修改界面組件外觀的方式。通過自定義樣式表,你可以更改組件的背景、顏色、字體、邊框等,從而實現界面的個性化和美化。下面詳細解釋如何使用自定義樣式表,以及提供一個示例:

使用自定義樣式表:

  1. 基本語法: 自定義樣式表使用CSS語法來描述組件的外觀。通過設置屬性和值的方式,你可以定義按鈕、標簽、文本框等各種組件的外觀。

  2. 選擇器: 選擇器用于指定要應用樣式的組件。例如,使用 QPushButton 選擇器來指定樣式適用于按鈕組件。

  3. 屬性和值: 在選擇器中,你可以設置多個屬性和值,例如 background-colorcolorpadding 等。每個屬性用冒號 : 分隔,每個樣式聲明用分號 ; 分隔。

  4. 偽狀態選擇器: 你還可以使用偽狀態選擇器,例如 :hover 來定義鼠標懸停時的樣式。

?下面是一個示例,展示如何使用自定義樣式表來美化按鈕組件:

import sys
from PyQt6.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QLabel, QWidget
from PyQt6.QtGui import QPalette, QColor
from PyQt6.QtCore import Qtapp = QApplication(sys.argv)class MyWindow(QMainWindow):def __init__(self):super().__init__()# 設置窗口標題和尺寸self.setWindowTitle("Styled Interface Example")self.setGeometry(100, 100, 400, 300)# 創建中央部件self.central_widget = QWidget(self)self.setCentralWidget(self.central_widget)# 創建垂直布局管理器layout = QVBoxLayout()self.central_widget.setLayout(layout)# 創建一個標簽,顯示歡迎信息self.label = QLabel("Welcome to Styled Interface!", self)layout.addWidget(self.label, alignment=Qt.AlignmentFlag.AlignCenter)# 創建三個樣式化的按鈕并添加到布局self.button1 = QPushButton("Styled Button 1", self)layout.addWidget(self.button1)self.button1.setStyleSheet("background-color: #3498db; color: white; padding: 10px 20px; border: none; border-radius: 5px;")self.button2 = QPushButton("Styled Button 2", self)layout.addWidget(self.button2)self.button2.setStyleSheet("background-color: #e74c3c; color: white; padding: 10px 20px; border: none; border-radius: 5px;")self.button3 = QPushButton("Styled Button 3", self)layout.addWidget(self.button3)self.button3.setStyleSheet("background-color: #27ae60; color: white; padding: 10px 20px; border: none; border-radius: 5px;")# 創建切換主題按鈕并連接槽函數self.theme_button = QPushButton("Change Theme", self)layout.addWidget(self.theme_button)self.theme_button.clicked.connect(self.change_theme)def change_theme(self):# 切換按鈕的主題樣式表new_style = """QPushButton {background-color: #9b59b6;color: white;padding: 10px 20px;border: none;border-radius: 5px;}QPushButton:hover {background-color: #8e44ad;}"""self.button1.setStyleSheet(new_style)self.button2.setStyleSheet(new_style)self.button3.setStyleSheet(new_style)if __name__ == "__main__":# 創建應用程序實例并顯示窗口window = MyWindow()window.show()sys.exit(app.exec())

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/40802.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/40802.shtml
英文地址,請注明出處:http://en.pswp.cn/news/40802.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

typedef函數代碼段解釋以及部分Windows下的系統函數

文章目錄 1、typedef int (WINAPI* LPSDOLInitialize)(const SDOLAppInfo* pAppInfo)2、typedef int (WINAPI* LPSDOLGetModule)(REFIID riid, void** intf)3、typedef int (WINAPI* LPSDOLTerminal)();4、GetProcAddress運行時獲取一個動態鏈接庫(DLL)中…

mysql與redis區別

mysql和redis的數據庫類型 mysql是關系型數據庫,主要用于存放持久化數據,將數據存儲在硬盤中,讀取速度較慢。 redis是NOSQL,即非關系型數據庫,也是緩存數據庫,即將數據存儲在緩存中,緩存的讀取速…

網絡

mcq Java 傳輸層:拆分和組裝,完成端到端的消息傳遞,流量控制,差錯控制等 網絡層: 尋址、路由,復用,擁塞控制,完成源到宿的傳遞。 顯然A選項是錯誤的,有流量控制的是傳輸層…

JavaScript TypeScript

文章目錄 JavaScript語法事件處理與HTML和CSS集成前端框架和庫 TypeScript靜態類型檢查語法更好的可維護性 包管理工具npmpnpmyarnBower JavaScript JavaScript(簡稱JS)是一種廣泛應用于網頁開發的腳本語言。它被用來為網頁增加交互性和動態功能。以下是…

netty學習分享(一)

TCP與UDP TCP 是面向連接的、可靠的流協議,通過三次握手建立連接,通訊完成時要拆除連接。 UDP是面向無連接的通訊協議,UDP通訊時不需要接收方確認,屬于不可靠的傳輸,可能會出現丟包現象 端口號: 端口號用…

【微信小程序】記一次自定義微信小程序組件的思路

最近來個需求,要求給小程序的 modal 增加個關閉按鈕,上網一查發現原來 2018 年就有人給出解決方案了,于是總結下微信小程序自定義組件的思路:一句話,用 wxml css實現和原生組件類似的樣式和效果,之后用 JS…

【uniapp】uniapp設置安全區域:

文章目錄 一、效果圖:二、實現代碼: 一、效果圖: 二、實現代碼: {"path": "pages/index/index","style": {"navigationStyle": "custom","navigationBarTextStyle": "white","navigationBarTitle…

消息隊列學習筆記

消息隊列基礎 適合消息隊列解決的問題 異步處理:處理完關鍵步驟后直接返回結果,后續放入隊列慢慢處理流量控制: 使用消息隊列隔離網關和后端服務,以達到流量控制和保護后端服務的目的。能根據下游的處理能力自動調節流量&#x…

leetcode做題筆記79單詞搜索

給定一個 m x n 二維字符網格 board 和一個字符串單詞 word 。如果 word 存在于網格中,返回 true ;否則,返回 false 。 單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中“相鄰”單元格是那些水平相鄰或垂直相…

Matlab工具NIFTI包的基本功能函數

Matlab工具NIFTI包的基本功能函數 Nifti 格式最初是為神經影像學發明的。神經影像信息學技術計劃(NIFTI)將 NIfTI 格式預設為 ANALYZE7.5 格式的替代品。它最初的應用領域是神經影像,但是也被用在其他領域。這種格式的主要特點就是它包含兩個…

Docker基礎入門:常規軟件安裝與鏡像加載原理

Docker基礎入門:常規軟件安裝與鏡像加載原理 一、Docker常規軟件安裝1.1、部署nginx1.2、部署tomcat1.3、部署elasticsearch1.4、如何部署kibana-->連接elasticsearch1.5、部署可視化工具 二、 鏡像加載原理2.1、鏡像是什么2.2、Docker鏡像加速原理2.3、分層理解…

為什么我的集群一個 Spark Executor / Yarn Container 只分配一個vCore?

在很多集群里,在關閉了Spark的DynamicAllocation的前提下(避免自動申請空閑資源,干擾測試結果),都會觀察到:提交Spark作業時,申請 1 個 driver + n 個 executor 會在Yarn上對應創建 n+1 個 container,但是每個container只有一個vCore,通過--driver-cores和--executor-…

Grafana Prometheus 通過JMX監控kafka 【2023最新方式】

第三方kafka exporter方案 目前網上關于使用Prometheus 監控kafka的大部分資料都是使用一個第三方的 kafka exporter,他的原理大概就是啟動一個kafka客戶端,獲取kafka服務器的信息,然后提供一些metric接口供Prometheus使用,隨意它…

docker 安裝mysql8.0

1、拉取鏡像 docker pull mysql2、運行鏡像 docker run -d --restartalways --name mysql --privilegedtrue -p 3306:3306 -v /home/sunyuhua/docker/mysql/data:/var/lib/mysql -v /home/sunyuhua/docker/mysql/conf:/etc/mysql/conf.d -v /home/sunyuhua/docker/mysql/logs…

07_Hudi案例實戰、Flink CDC 實時數據采集、Presto、FineBI 報表可視化等

7.第七章 Hudi案例實戰 7.1 案例架構 7.2 業務數據 7.2.1 客戶信息表 7.2.2 客戶意向表 7.2.3 客戶線索表 7.2.4 線索申訴表 7.2.5 客戶訪問咨詢記錄表 7.3 Flink CDC 實時數據采集 7.3.1 開啟MySQL binlog 7.3.2 環境準備 7.3.3 實時采集數據 7.3.3.1 客戶信息表 7.3.3.2 客戶…

ubuntu安裝jdk、emqx、nginx

一、安裝jdk 要在Ubuntu上安裝JDK 1.8,您可以按照以下步驟進行操作: 打開終端(CtrlAltT)。確保您的系統已更新: sudo apt update sudo apt upgrade安裝OpenJDK 8: sudo apt install openjdk-8-jdk安裝完成…

.net core發布到IIS上出現 HTTP 錯誤 500.19

1.檢查.net core 環境運行環境是否安裝完成,類似如下環境 2.IIS是否安裝全 本次原因就是IIS未安裝全導致的 按照網上說的手動重啟iis(iisreset)也不行

基于C#的消息處理的應用程序 - 開源研究系列文章

今天講講基于C#里的基于消息處理的應用程序的一個例子。 我們知道,Windows操作系統的程序是基于消息處理的。也就是說,程序接收到消息代碼定義,然后根據消息代碼定義去處理對應的操作。前面有一個博文例子( C#程序的啟動顯示方案(無窗口進程發…

【數據結構】 ArrayList簡介與實戰

文章目錄 什么是ArrayListArrayList相關說明 ArrayList使用ArrayList的構造無參構造指定順序表初始容量利用其他 Collection 構建 ArrayListArrayList常見操作獲取list有效元素個數獲取和設置index位置上的元素在list的index位置插入指定元素刪除指定元素刪除list中index位置上…

機器學習基礎(二)

線性回歸 誤差是獨立并且具有相同的分布通常認為服從均值為0方差為的高斯分布。 損失函數(loss Function)/代價函數(Cost Function) 其實兩種叫法都可以,損失函數(loss function)或代價函數(cost function)是將隨機事件或其有關隨機變量的取值映射為非負實數以表示該隨…