十一、PyQt5 之 容器

一、选项卡控件(QTabWidget)

# !/usr/bin/python
# -*- coding:utf-8 -*-

"""
选项卡控件: QTabWidget
"""
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *


class TabWidgetDemo(QTabWidget):
    def __init__(self):
        super(TabWidgetDemo, self).__init__()

        self.setWindowTitle("选项卡控件: QTabWidget")
        # 创建用于显示控件的窗口
        self.tab1 = QWidget()
        self.tab2 = QWidget()
        self.tab3 = QWidget()
        # 将窗口与选项卡绑定
        self.addTab(self.tab1, "选项卡1")
        self.addTab(self.tab2, "选项卡2")
        self.addTab(self.tab3, "选项卡3")

        self.tab1UI()
        self.tab2UI()
        self.tab3UI()

    def tab1UI(self):
        layout = QFormLayout()
        layout.addRow("姓名", QLineEdit())
        layout.addRow("地址", QLineEdit())
        # 动态修改选项卡1的名称
        self.setTabText(0, "联系方式")
        # 给tab1 装载页面
        self.tab1.setLayout(layout)

    def tab2UI(self):
        layout = QFormLayout()
        sex = QHBoxLayout()
        sex.addWidget(QRadioButton(""))
        sex.addWidget(QRadioButton(""))
        layout.addRow(sex)
        layout.addRow("生日", QLineEdit())
        self.setTabText(1, "个人详细信息")
        self.tab2.setLayout(layout)

    def tab3UI(self):
        layout = QHBoxLayout()
        layout.addWidget(QLabel("科目"))
        layout.addWidget((QCheckBox("Python")))
        layout.addWidget(QCheckBox("C++"))
        self.setTabText(2, "学习")
        self.tab3.setLayout(layout)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = TabWidgetDemo()
    main.show()
    sys.exit(app.exec_())

二、堆栈窗口控件(QSTackedWidget)

# !/usr/bin/python
# -*- coding:utf-8 -*-

"""
堆栈窗口控件 (QSTackedWidget)

堆栈窗口控件和选项卡控件相似,不同的是选项卡控件可以理解为初始化的时候就将所有信息都加在到页面上
而堆栈事件是根据自己的点击事件的索引来分别渲染到页面上,猜测这样消耗的资源更少
"""

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *


class StackedExample(QWidget):
    def __init__(self):
        super(StackedExample, self).__init__()
        self.setGeometry(300, 50, 10, 10)
        self.setWindowTitle("堆栈窗口控件(QStackedWidget)")

        self.list = QListWidget()
        self.list.insertItem(0, "联系方式")
        self.list.insertItem(1, "个人信息")
        self.list.insertItem(2, "教育程度")

        # 创建三个窗口
        self.stack1 = QWidget()
        self.stack2 = QWidget()
        self.stack3 = QWidget()

        self.stack1UI()
        self.stack2UI()
        self.stack3UI()

        # 创建堆栈窗口对象
        self.stack = QStackedWidget()
        self.stack.addWidget(self.stack1)
        self.stack.addWidget(self.stack2)
        self.stack.addWidget(self.stack3)

        hbox = QHBoxLayout()
        hbox.addWidget(self.list)
        hbox.addWidget(self.stack)
        self.setLayout(hbox)

        # 为列表添加切换索引事件
        self.list.currentRowChanged.connect(self.display)

    def display(self, index):
        self.stack.setCurrentIndex(index)

    def stack1UI(self):
        layout = QFormLayout()
        layout.addRow("姓名", QLineEdit())
        layout.addRow("地址", QLineEdit())
        self.stack1.setLayout(layout)

    def stack2UI(self):
        layout = QFormLayout()
        sex = QHBoxLayout()
        sex.addWidget(QRadioButton(""))
        sex.addWidget(QRadioButton(""))
        layout.addRow(sex)
        layout.addRow("生日", QLineEdit())
        self.stack2.setLayout(layout)

    def stack3UI(self):
        layout = QHBoxLayout()
        layout.addWidget(QLabel("科目"))
        layout.addWidget((QCheckBox("Python")))
        layout.addWidget(QCheckBox("C++"))
        self.stack3.setLayout(layout)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = StackedExample()
    demo.show()
    sys.exit(app.exec_())

三、停靠控件(QDockWidget)

# !/usr/bin/python
# -*- coding:utf-8 -*-

"""
停靠事件 (QDockWidget)
类似于 Visual Studio 那些可以拖动的区域
"""

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)
        self.setWindowTitle("停靠控件(QDockWidget)")

        layout = QHBoxLayout()
        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.setCentralWidget(QLineEdit())
        # 设置停靠空控件默认处于悬浮状态
        self.items.setFloating(True)
        # 将元素停靠在页面右侧
        self.addDockWidget(Qt.RightDockWidgetArea, self.items)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = DockDemo()
    demo.show()
    sys.exit(app.exec_())

四、容纳多文档窗口(QMdiArea、QMdiSubWindow)

# !/usr/bin/python
# -*- coding:utf-8 -*-

"""
容纳多文档的窗口

QMdiArea       容纳多文档窗口的类
QMdiSubWindow  创建窗口的类
"""

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *


class MultiWindows(QMainWindow):
    count = 0

    def __init__(self, parent=None):
        super(MultiWindows, self).__init__(parent)
        self.setWindowTitle("容纳多文档的窗口")

        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.connect(self.windowaction)

    def windowaction(self, q):
        print(q.text())
        if q.text() == "New":
            MultiWindows.count = MultiWindows.count + 1
            sub = QMdiSubWindow()
            sub.setWidget(QTextEdit())
            sub.setWindowTitle("子窗口" + str(MultiWindows.count))
            self.mdi.addSubWindow(sub)
            sub.show()
        elif q.text() == "cascade":
            self.mdi.cascadeSubWindows()
        elif q.text() == "Tiled":
            self.mdi.tileSubWindows()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = MultiWindows()
    demo.show()
    sys.exit(app.exec_())

五、滚动条控件(QScrollBar)

# !/usr/bin/python
# -*- coding:utf-8 -*-

"""
滚动条控件(QScrollBar)

1. 通过滚动条值的变化控制其他控件状态的变化
2. 通过滚动条值的变化控制控件位置的变化
"""

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *


class ScrollBar(QWidget):
    def __init__(self):
        super(ScrollBar, self).__init__()
        self.initUI()

    def initUI(self):
        hbox = QHBoxLayout()
        self.label = QLabel('拖动滚动条去改变文字颜色')
        hbox.addWidget(self.label)

        self.scrollbar1 = QScrollBar()
        self.scrollbar1.setMaximum(255)
        self.scrollbar1.sliderMoved.connect(self.sliderMoved)

        self.scrollbar2 = QScrollBar()
        self.scrollbar2.setMaximum(255)
        self.scrollbar2.sliderMoved.connect(self.sliderMoved)

        self.scrollbar3 = QScrollBar()
        self.scrollbar3.setMaximum(255)
        self.scrollbar3.sliderMoved.connect(self.sliderMoved)

        self.scrollbar4 = QScrollBar()
        self.scrollbar4.setMaximum(255)
        self.scrollbar4.sliderMoved.connect(self.sliderMoved1)

        hbox.addWidget(self.scrollbar1)
        hbox.addWidget(self.scrollbar2)
        hbox.addWidget(self.scrollbar3)
        hbox.addWidget(self.scrollbar4)
        self.setGeometry(300, 300, 300, 200)

        self.setLayout(hbox)
        # 保留当前滚动条的位置
        self.y = self.label.pos().y()

    def sliderMoved(self):
        print(self.scrollbar1.value(), self.scrollbar2.value(), self.scrollbar3.value())
        palette = QPalette()
        c = QColor(self.scrollbar1.value(), self.scrollbar2.value(), self.scrollbar3.value(), 255)  # 255 代表透明度
        palette.setColor(QPalette.Foreground, c)
        self.label.setPalette(palette)

    # 移动滚动条,移动label的位置
    def sliderMoved1(self):
        self.label.move(self.label.x(), self.y + self.scrollbar4.value())


if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = ScrollBar()
    demo.show()
    sys.exit(app.exec_())

 

posted on 2022-07-09 11:27  软饭攻城狮  阅读(234)  评论(0)    收藏  举报

导航