PyQt5高級窗口控件詳解:停靠窗口、多文檔界面與滾動條

掌握PyQt5的高級窗口控件,讓你的GUI應用具備專業級的布局與交互體驗

在PyQt5應用開發中,高效管理窗口布局和實現復雜交互功能是提升用戶體驗的關鍵。本文將深入解析三個核心高級控件:停靠窗口(QDockWidget)、多文檔界面(MDI)和滾動條(QScrollBar),通過代碼示例帶你快速掌握它們的實戰應用。

QDockWidget:靈活可停靠的窗口控件

QDockWidget是PyQt5中用于創建可停靠子窗口的核心控件,它可以在主窗口內自由浮動或停靠在指定區域,為專業級應用提供靈活的布局方案。

方法描述
setWidget()在Dock囗區域設置QWidget
setFloating()設置Dock窗口是否可以浮動,如果設置為True,則表示可以浮動
setAllowedAreas()設置窗口可以停靠的區域:LeftDockWidgetArea,左邊停靠區域;RightDockWidgetArea,右邊停靠區域;TopDockWidgetArea,頂品停靠區域;BottomDockWidgetArea,部停靠區域;NoDockWidgetArea,不顯示Widget;
setFeatures()設置停靠窗口的功能屬性:DockWidgetClosable,可關閉;DockWidgetMovable,可移動;DockWidgetFloatabIe,可漂浮;DockWidgetVcrticaITitIeBar,在左邊顯示垂直的標簽欄;AllDockWidgetFeatures,具有前三種屬性的所有功能;NoDockWidgetFeatures,無法關團,不能移動,不能漂浮;

QDockWidget的使用

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *class DockDemo(QMainWindow):def __init__(self,parent=None):super(DockDemo,self).__init__(parent)layout=QHBoxLayout()bar=self.menuBar()file=bar.addMenu("File")file.addAction("New")file.addAction("save")file.addAction("quit")self.items=QDockWidget("Dockable",self)self.listWidget=QListWidget()self.listWidget.addItem("item1")self.listWidget.addItem("item2")self.listWidget.addItem("item3")self.items.setWidget(self.listWidget)self.items.setFloating(False)self.setCentralWidget(QTextEdit())self.addDockWidget(Qt.RightDockWidgetArea,self.items)self.setLayout(layout)self.setWindowTitle("Dock 例子")if __name__ == '__main__':app=QApplication(sys.argv)demo=DockDemo()demo.show()sys.exit(app.exec_())

運行結果

VeryCapture_20250522221236

MDI多文檔界面:高效管理多個子窗口

MDI(Multiple Document Interface)允許在單個主窗口容器內管理多個文檔窗口,相比獨立的SDI窗口,它能顯著節省系統資源并提供更集成的用戶體驗。

QMdiArea核心方法

一個典型的GUI應用程序可能有多個窗口,選項卡控件和堆棧窗口控件允許一
次使用其中的一個窗口。然而,很多時候這種方法不是很有用,因為其他窗口的視
圖是隱藏的。

一種同時顯示多個窗口的方法是,創建多個獨立的窗口,這些獨立的窗口被稱
為SDI(SingleDocumentlnterface,單文檔界面),每個窗口都可以有自己的菜單系
統、工具欄等。這需要占用較多的內存資源。

MDI(Multiple Document lnterface,多文檔界面)應用程序占用較少的內存資
源,子窗口都可以放在主窗口容器中,這個容器控件被稱為QMdiArea。

QMidArea控件通常占據在QMainWindow對象的中央位置,了窗口在這個區域
是QMdiSubWindow類的實例,可以設置任何QWidget作為子窗口對象的內部控件,
子窗口在MDI區域進行級聯排列布局。

QMdiArea類和QMdiSubWindow類中的常用方法如表5-16所示。

方法描述
addSubWindow()將一個小控件添加在MDI區域作為一個新的子窗囗
removeSubWindow()刪除一個子窗囗中的小控件
setActiveSubWindow()激活一個子窗口
caseadeSubWindows()安排子窗口在MDI區域級聯顯示
tileSubWindows()安排子窗口在MDI區域平鋪顯示
closeActiveSubWindow()關閉活動的子窗口
subWindowList()返回MDI區域的子窗口列表
setWidget()設置一個小控件作為QMdiSubwindow實例對象的內部件

多重文檔界面

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *class MainWindow(QMainWindow):count=0def __init__(self,parent=None):super(MainWindow,self).__init__(parent)self.mdi=QMdiArea()self.setCentralWidget(self.mdi)bar=self.menuBar()file=bar.addMenu("File")file.addAction("New")file.addAction("cascade")file.addAction("Tiled")file.triggered[QAction].connect(self.windowaction)self.setWindowTitle("MDI demo")def windowaction(self,q):print("triggered")if q.text()=="New":MainWindow.count=MainWindow.count+1sub=QMdiSubWindow()sub.setWidget(QTextEdit())sub.setWindowTitle("subwindow"+str(MainWindow.count))self.mdi.addSubWindow(sub)sub.show()if q.text()=="cascade":self.mdi.cascadeSubWindows()if q.text()=="Tiled":self.mdi.tileSubWindows()if __name__ == '__main__':app=QApplication(sys.argv)demo=MainWindow()demo.show()sys.exit(app.exec_())

運行結果

VeryCapture_20250522225618

QScrollBar:實現精確的滾動控制

QScrollBar不僅提供基本的滾動功能,還能作為交互式控件用于數值調整,特別適合需要精確控制的場景(如顏色選擇器)。

核心信號說明

方法描述
valueChanged當滑動條的值改變時發射此信號
sliderMoved當用戶拖動滑塊時發射此信號

QScrollBar
?

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
?
class Example(QWidget):def __init__(self):super(Example,self).__init__()self.initUI()
?def initUI(self):hbox=QHBoxLayout()self.l1=QLabel("拖動滑動條去改變顏色")self.l1.setFont(QFont("Arial",16))hbox.addWidget(self.l1)self.s1=QScrollBar()self.s1.setMaximum(255)self.s1.sliderMoved.connect(self.sliderval)self.s2=QScrollBar()self.s2.setMaximum(255)self.s2.sliderMoved.connect(self.sliderval)self.s3=QScrollBar()self.s3.setMaximum(255)self.s3.sliderMoved.connect(self.sliderval)hbox.addWidget(self.s1)hbox.addWidget(self.s2)self.setGeometry(300,300,300,200)self.setWindowTitle("QScrollBar 例子")self.setLayout(hbox)
?def sliderval(self):print(self.s1.value(),self.s2.value(),self.s3.value())palette=QPalette()c=QColor(self.s1.value(),self.s2.value(),self.s2.value(),255)palette.setColor(QPalette.Foreground,c)self.l1.setPalette(palette)
?
if __name__ == '__main__':app=QApplication(sys.argv)demo=Example()demo.show()sys.exit(app.exec_())

運行效果
?
VeryCapture_20250522231305
代碼分析:
在這個例了中,設置了三個滑動條來控制標簽中所顯示文字的字體顏色的RGB
值。
當移動滑塊時,將sliderMoved信號與槽函數sliderval()連接起來。

總結:高級控件的應用場景

PyQt5中的高級窗口控件為開發專業級GUI應用提供了強大支持:

  • QDockWidget - 適用于需要靈活布局的開發環境(如IDE、圖形設計軟件)

  • MDI界面 - 適合多文檔處理應用(如文本編輯器、電子表格、CAD軟件)

  • QScrollBar - 不僅實現滾動功能,還可用于創建自定義控制面板(如調色板、參數調節器)

掌握這些控件的高級用法,能夠顯著提升應用的用戶體驗和專業感。建議在實際項目中根據具體需求組合使用這些控件,構建出既美觀又高效的GUI界面。

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

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

相關文章

50天50個小項目 (Vue3 + Tailwindcss V4) ? | DrawingApp(畫板組件)

&#x1f4c5; 我們繼續 50 個小項目挑戰&#xff01;—— DrawingApp組件 倉庫地址&#xff1a;https://github.com/SunACong/50-vue-projects 項目預覽地址&#xff1a;https://50-vue-projects.vercel.app/ 使用 Vue 3 的 Composition API&#xff08;<script setup>…

Eureka、Nacos、LoadBalance、OpenFeign?之間的區別聯系和協作 (附代碼講解)

這篇文章聊聊微服務里的這幾個老伙計&#xff1a;Eureka、Nacos、LoadBalance、OpenFeign。咱們做微服務開發&#xff0c;總會跟這幾個組件打交道&#xff1a;Eureka、Nacos、Spring Cloud LoadBalancer、OpenFeign。它們各司其職又互相配合&#xff0c;今天就把它們的關系、用…

JavaSE-繼承

繼承&#xff08;inheritance&#xff09;繼承的意義我們首先來看下面兩個類&#xff1a;public class Dog {public String name;public int age;public void eat(){System.out.println(this.name"正在吃飯");}public void bark(){System.out.println(this.name"…

第二屆虛擬現實、圖像和信號處理國際學術會議(VRISP 2025)

重要信息 官網&#xff1a;www.icvisp.net 時間&#xff1a;2025年8月1-3日 地點&#xff1a;中國-長沙 簡介 近年來&#xff0c;虛擬現實技術取得了顯著進步&#xff0c;與5G、云計算和物聯網等新一代信息技術的融合加速&#xff0c;推動了其在硬件、軟件和內容應用等方面…

SpringBoot+Mybatis+MySQL+Vue+ElementUI前后端分離版:整體布局、架構調整(二)

目錄 一、前言 二、后端調整 1.實體類調整 2.菜單相關接口 3.用戶相關接口 4.新增工具類 5.新增菜單樹返回類 6.配置類、攔截器 三、前端調整 1.請求調整 2.頁面布局、樣式調整 1.user.vue 2.index.vue 3.請求攔截 四、開發過程中的問題 五、附&#xff1a…

vue3官方文檔學習心得

這幾天抽空把vue3的文檔整個看了一遍。簡介 | Vue.js 23年寫過一個vue2的項目&#xff0c;24年寫了一個vue3的項目&#xff0c;頁面功能比較簡單&#xff0c;用幾個簡單的API&#xff0c;watch、watchEffect、ref、reactive就能實現的業務功能。 寫了幾年的react的&#xff0…

Pycharm恢復默認設置,配置導致復制粘貼等不能使用

在file 種找到manage IDE settings在manage IDE settings中找到restore default settings

【王樹森推薦系統】召回12:曝光過濾 Bloom Filter

概述 曝光過濾通常是在召回階段做&#xff0c;具體的方法就是用 Bloom Filter 曝光過濾問題 如果用戶看過某個物品&#xff0c;則不再把該物品曝光給用戶。原因是同一個物品重復曝光給用戶會損害用戶體驗&#xff0c;但也不是所有推薦系統都有曝光過濾&#xff0c;像 youtube 這…

基于STM32單片機的心率血氧監測系統設計(STM32代碼編寫+手機APP設計+PCB設計+Proteus仿真)

系列文章目錄 文章目錄 系列文章目錄前言1 資料獲取與演示視頻1.1 資料介紹1.2 資料獲取1.3 演示視頻 2 系統框架3 硬件3.1 主控制器3.2 顯示屏3.3 WIFI模塊3.4心率血氧傳感器 4 設計PCB4.1 安裝下載立創EDA專業版4.2 畫原理圖4.4 使用嘉立創下單助手進行下單&#xff0c;打板。…

main(int argc,char **agrv)的含義

今天和大家討論一個常見的但是不容易深入了解的知識點。那就是 main 函數聲明中使用到的 argc 和 argv 的含義。通常我們寫主函數的時候一般都是直接使用int main() 或者 void main() 來聲明 main 函數。但是你知道嗎&#xff1f;在c89/c99的語言標準中&#xff0c;main函數的聲…

如何簡單實現發版不影響客戶使用?nginx負載

nginx負載發版不影響客戶使用 1.需要二臺服務器 2.二臺服務器均是正式環境配置 3.服務器Nginx配置修改 發版順序&#xff1a;先在服務器2發版&#xff0c;發布成功后&#xff0c;再改服務器Nginx配置&#xff0c;重新加載nginx&#xff1b;然后在服務器再發版&#xff0c;發布成…

qt筆記(1)——Qtablewidget使用

1.基礎使用方法 &#xff08;略&#xff09; 2.坑和注意點 2.1 設置一個單元格的編輯屬性 在代碼中&#xff0c;想要修改一個單元格的編輯屬性&#xff0c;需要對這個item的flags進行設置&#xff1b;注意對一個tablewidget的一個item成員進行設置后&#xff0c;進行一次編…

字符串的模糊匹配方法介紹

字符串的模糊匹配方法介紹 目錄字符串的模糊匹配方法介紹一、編輯距離&#xff08;Levenshtein Distance&#xff09;復雜度分析二、Jaro-Winkler 距離復雜度分析三、最長公共子序列&#xff08;LCS&#xff09;復雜度分析四、模糊搜索&#xff08;Fuzzy Search&#xff09;復雜…

ActiveMQ在Spring Boot中的詳細使用指南

?? 目錄 ?? ActiveMQ簡介 什么是ActiveMQ? 核心概念 ??? 基礎架構組件 ?? 重要概念解釋 ActiveMQ vs 其他消息中間件 ?? 環境搭建 1. ActiveMQ服務端安裝 Docker方式(推薦初學者) 手動安裝方式 2. 驗證安裝 訪問Web管理界面 連接參數 測試連接 ?…

二元一次方程

前言 最近剛學二元一次方程&#xff0c;想寫一篇專欄熟悉一下本文寫給初一的同學看&#xff0c;學過的就劃了吧二元一次方程 兩個未知數最高項次數為 111 次為整式方程二元一次方程的解不唯一&#xff0c;但是二元一次方程可以用一個未知數來表達另一個未知數eg:eg:eg: xy1x y…

AI編程的未來是智能體原生開發?

目錄 前言 一、從“串行”到“并行”&#xff1a;什么是智能體原生開發&#xff1f; 1.1 傳統模式&#xff08;串行思維&#xff09; 1.2 智能體原生模式&#xff08;并行思維&#xff09; 二、程序員的新角色&#xff1a;從代碼手藝人到系統思想家 三、軟件開發的終局&a…

【牛客刷題】小紅的與運算

文章目錄 一、題目介紹1.1 題目描述1.2 輸入描述1.3 輸出描述1.4 示例二、 解題思路2.1 核心算法設計2.2 性能優化關鍵2.3 算法流程圖三、解法實現3.1 解法一:基礎實現3.1.1 初級版本分析3.2 解法二:優化版本(推薦)3.2.1 優化版本分析四、總結與拓展4.1 關鍵優化技術4.2 算…

spring中 方法上@Transation實現原理

Spring中Transactional注解方法實現原理Spring的Transactional注解在方法級別實現事務管理的原理主要基于動態代理和攔截器機制&#xff0c;以下是其核心實現流程&#xff1a;1. 代理創建階段當Spring容器啟動時&#xff0c;會為帶有Transactional注解的類創建代理對象&#xf…

qt-C++語法筆記之Stretch與Spacer的關系分析

qt-C語法筆記之Stretch與Spacer的關系分析 code review! 文章目錄qt-C語法筆記之Stretch與Spacer的關系分析1. Stretch&#xff08;拉伸因子&#xff09;2. Horizontal Spacer 和 Vertical Spacer3. Stretch 和 Spacer 的關系4. 實際應用中的選擇5. 注意事項6. 代碼與 Qt Desig…

Qwen3技術綜述

1. 引入 2025年5月&#xff0c;qwen推出了旗艦模型&#xff08;flagship model&#xff09;Qwen3-235B-A22B。并以Apache 2.0版權發布&#xff08;可自由商業使用&#xff0c;修改代碼和商用要包含原始版權&#xff09;。本文對其技術報告中提到的數據處理技術與模型結構進行綜…