PyQt5高级界而控件(容器:装载更多的控件QDockWidget)

QDockWidget

QDockWldget是一个可以停靠在QMainWindow内的窗口控件,它可以保持在浮动状态或者在指定位置作为子窗口附加到主窗口中。QMainWindow类的主窗口对

象保留有一个用于停靠窗口的区域,这个区域在控件的中央周围,如图5-34所示。

QDockWidget控件在主窗口内可以移动到新的区域。QDockWidget类中的常用

方法如表5-15所示。

方法 描述
setWidget() 在Dock囗区域设置QWidget
setFloating() 设置Dock窗口是否可以浮动,如果设置为True,则表示可以浮动
setAllowedAreas() 设置窗口可以停靠的区域:LeftDockWidgetArea,左边停靠区域;RightDockWidgetArea,右边停靠区域;TopDockWidgetArea,顶品停靠区域;BottomDockWidgetArea,部停靠区域;NoDockWidgetArea,不显示Widget;
setFeatures() 设置停靠窗口的功能属性:DockWidgetClosable,可关闭;DockWidgetMovable,可移动;DockWidgetFloatabIe,可漂浮;DockWidgetVcrticaITitIeBar,在左边显示垂直的标签栏;AllDockWidgetFeatures,具有前三种属性的所有功能;NoDockWidgetFeatures,无法关团,不能移动,不能漂浮;

QDockWidget的使用

python 复制代码
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_())

运行结果

代码分析

在这个例子中,顶层窗口是一个QMainWindow对象,QTextEdit对象是它的中

央小控件。

python 复制代码
self.setCentralWidget(QTextEdit())

首先,创建可停靠的窗口items。

python 复制代码
self.items=QDockWidget("Dockable",self)

然后,在停靠窗口items内添加QListWidget对象。

python 复制代码
self.listWidget.addItem("item1")
        self.listWidget.addItem("item2")
        self.listWidget.addItem("item3")
        self.items.setWidget(self.listWidget)

最后,将停靠窗口放置在中央小控件的右侧。

python 复制代码
 self.addDockWidget(Qt.RightDockWidgetArea,self.items)

多文档界面

一个典型的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实例对象的内部件

多重文档界面

python 复制代码
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class MainWindow(QMainWindow):
    count=0
    def __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+1
            sub=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_())

运行结果

代码分析:

在这个例子中,主窗口QMainWindow拥有一个菜单控件和MidArea控件。

python 复制代码
self.mdi=QMdiArea()
        self.setCentralWidget(self.mdi)
        bar=self.menuBar()
        file=bar.addMenu("File")
        file.addAction("New")
        file.addAction("cascade")
        file.addAction("Tiled")

当单击菜单控件时触发triggered信号,连接到槽函数windowaction()。

python 复制代码
file.triggered[QAction].connect(self.windowaction)

当选择菜单中的"New"动作时,会添加一个新的MDI,每个MDI都有标题,在主窗口内部会增加MDI的数量。

python 复制代码
 MainWindow.count=MainWindow.count+1
            sub=QMdiSubWindow()
            sub.setWidget(QTextEdit())
            sub.setWindowTitle("subwindow"+str(MainWindow.count))
            self.mdi.addSubWindow(sub)
            sub.show()

当选择菜单中的"cascade"和"Tiled"动作时,会在主窗口中显示子窗口的排

列方式一一级联显示子窗口或平铺显示子窗口。

python 复制代码
 if q.text()=="cascade":
            self.mdi.cascadeSubWindows()
        if q.text()=="Tiled":
            self.mdi.tileSubWindows()

QScrollBar

可以看到,前面介绍的几个窗口控件的共同点是新建一些窗口来装载更多的控

件,而QScrollBar提供了另一种思路:这个窗口控件提供了水平的或垂直的滚动条,

这样可以扩大当前窗口的有效装载面积,从而装载更多的控件。

QScrollBar类中的常用信号如表5-17所示。

方法 描述
valueChanged 当滑动条的值改变时发射此信号
sliderMoved 当用户拖动滑块时发射此信号

QScrollBar

python 复制代码
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_())

运行效果


代码分析:

在这个例了中,设置了三个滑动条来控制标签中所显示文字的字体颜色的RGB

值。

当移动滑块时,将sliderMoved信号与槽函数sliderval()连接起来。

相关推荐
MUTA️5 分钟前
pycharm中本地Docker添加解释器
ide·python·pycharm
Code季风13 分钟前
SQL关键字快速入门:HAVING 分组后的条件过滤
数据库·sql·mysql
想要成为计算机高手42 分钟前
4. isaac sim4.2 教程-Core API-Hello robot
人工智能·python·机器人·英伟达·isaac sim·仿真环境
程序猿ZhangSir1 小时前
Redis 缓存进阶篇,缓存真实数据和缓存文件指针最佳实现?如何选择?
数据库·redis·缓存
yjb.gz1 小时前
Oracle函数JSON_TABLE使用
数据库·oracle·json
Dubhehug1 小时前
4.B树和B+树的区别?为什么MySQL选择B+树作为索引?
数据库·b树·mysql·面试·b+树
陈敬雷-充电了么-CEO兼CTO1 小时前
复杂任务攻坚:多模态大模型推理技术从 CoT 数据到 RL 优化的突破之路
人工智能·python·神经网络·自然语言处理·chatgpt·aigc·智能体
YOLO大师2 小时前
华为OD机试 2025B卷 - 小明减肥(C++&Python&JAVA&JS&C语言)
c++·python·华为od·华为od机试·华为od2025b卷·华为机试2025b卷·华为od机试2025b卷
linux修理工2 小时前
n1 armbian 安装桌面环境并启用xrdp远程登录
linux·服务器·数据库
xiao5kou4chang6kai42 小时前
【Python-GEE】如何利用Landsat时间序列影像通过调和回归方法提取农作物特征并进行分类
python·gee·森林监测·洪涝灾害·干旱评估·植被变化