【PyQt】切换界面的实现


前言

实现几个界面的切换展示的效果。


一、介绍

在 PyQt 中实现一个主界面包含其他子界面的操作,通常可以通过多种方式来完成,比如使用 QStackedWidgetQTabWidgetQDockWidget 或简单地通过改变中央控件(central widget)来实现。

二、代码

2.1 QStackedWidget

QStackedWidget 提供了一个堆栈的方式来管理多个窗口部件(widgets),但一次只能显示一个。这非常适合于实现向导界面或者选项卡式界面,但不想显示选项卡本身时。

2.1.1 代码

'''
#Author :总要写点什么
#Creattime:2024/8/24
#FileName:51-Qwidgets
#Description: 网上抄的代码
'''
from PyQt5.QtWidgets import QApplication, QMainWindow, QStackedWidget, QPushButton, QVBoxLayout, QWidget


class MainWindow ( QMainWindow ) :
    def __init__(self) :
        super ().__init__ ()

        # 创建 QStackedWidget
        self.stackedWidget = QStackedWidget()

        # 添加几个子界面
        self.page1 = QWidget ()
        self.page1Layout = QVBoxLayout ()
        self.page1Button = QPushButton ( "去到Page 2" )
        self.page1Layout.addWidget ( self.page1Button )
        self.page1.setLayout ( self.page1Layout )

        self.page2 = QWidget ()
        self.page2Layout = QVBoxLayout ()
        self.page2Button = QPushButton ( "去到Page 1" )
        self.page2Layout.addWidget(self.page2Button )
        self.page2.setLayout(self.page2Layout )

        # 槽函数
        self.page2Button.clicked.connect ( self.go_to_page_1 )
        self.page1Button.clicked.connect ( self.go_to_page_2 )

        # 将子界面添加到 QStackedWidget
        self.stackedWidget.addWidget ( self.page1 )
        self.stackedWidget.addWidget ( self.page2 )

        # 设置主窗口的中央控件为 QStackedWidget
        self.setCentralWidget ( self.stackedWidget )

    def go_to_page_1(self) :
        self.stackedWidget.setCurrentIndex(0)

    def go_to_page_2(self) :
        self.stackedWidget.setCurrentIndex(1)

if __name__ == '__main__':
    app = QApplication ( [] )
    window = MainWindow ()
    window.show ()
    app.exec_()

2.1.2 运行结果展示

主界面
在这里插入图片描述
也就是setCurrentIndex(0),从0开始没毛病。
点击按钮切换到setCurrentIndex(1)
在这里插入图片描述

2.2 QTabWidget

2.2.1 代码

from PyQt5.QtWidgets import QApplication, QMainWindow, QTabWidget, QWidget, QVBoxLayout, QLabel


class MainWindow ( QMainWindow ) :
    def __init__(self) :
        super ().__init__ ()

        # 设置窗口标题和大小
        self.setWindowTitle ( "QTabWidget 示例" )
        self.setGeometry ( 100, 100, 400, 300 )

        # 创建 QTabWidget
        self.tabWidget = QTabWidget ( self )
        self.setCentralWidget ( self.tabWidget )

        # 创建第一个选项卡
        self.tab1 = QWidget ()
        self.tab1Layout = QVBoxLayout ()
        self.label1 = QLabel ( "这是第一个选项卡", self.tab1 )
        self.tab1Layout.addWidget ( self.label1 )
        self.tab1.setLayout ( self.tab1Layout )
        self.tabWidget.addTab ( self.tab1, "选项卡 1" )

        # 创建第二个选项卡
        self.tab2 = QWidget ()
        self.tab2Layout = QVBoxLayout ()
        self.label2 = QLabel ( "这是第二个选项卡", self.tab2 )
        self.tab2Layout.addWidget ( self.label2 )
        self.tab2.setLayout ( self.tab2Layout )
        self.tabWidget.addTab ( self.tab2, "选项卡 2" )


if __name__ == '__main__':
    app = QApplication ( [] )
    window = MainWindow ()
    window.show ()
    app.exec_ ()

2.2.2 运行结果展示

选项1
在这里插入图片描述

选项2
在这里插入图片描述

2.3 QDockWidget

2.3.1 代码

'''
#Author :susocool
#Creattime:2024/8/26
#FileName:53-QDockWidget 示例
#Description:
'''
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QMainWindow, QTextEdit, QDockWidget, QVBoxLayout, QWidget


class MainWindow ( QMainWindow ) :
    def __init__(self) :
        super ().__init__ ()

        # 设置窗口标题和大小
        self.setWindowTitle ( "QDockWidget 示例" )
        self.setGeometry ( 100, 100, 800, 600 )

        # 创建两个 QTextEdit 控件作为停靠窗口的内容
        self.textEdit1 = QTextEdit()
        self.textEdit2 = QTextEdit()

        # 创建 QDockWidget 控件并设置其标题和内容
        self.dock1 = QDockWidget ( "停靠窗口 1", self )
        self.dock1.setWidget ( self.textEdit1 )

        self.dock2 = QDockWidget ( "停靠窗口 2", self )
        self.dock2.setWidget ( self.textEdit2 )

        # 将停靠窗口添加到主窗口
        # 默认情况下,停靠窗口会停靠在主窗口的左侧,但你可以通过 addDockWidget 的参数来改变它的位置
        self.addDockWidget ( Qt.LeftDockWidgetArea, self.dock1 )
        self.addDockWidget ( Qt.RightDockWidgetArea, self.dock2 )



if __name__ == '__main__':
    app = QApplication ( [] )
    window = MainWindow ()
    window.show ()
    app.exec_ ()


2.3.2 运行结果展示

在这里插入图片描述

PULSE

'''
#Author :susocool
#Creattime:2024/8/26
#FileName:乱写的切换界面
#Description:综合使用一下,以后使用参考这个来
'''
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QWidget, QVBoxLayout, QDialog,QLabel,QTextEdit, QDockWidget
from PyQt5.QtCore import Qt  
  
class MainWindow(QMainWindow):  
    def __init__(self):  
        super().__init__()  
  
        # 设置窗口标题和大小  
        self.setWindowTitle("主界面")  
        self.setGeometry(100, 100, 400, 300)  
  
        # 创建一个中心小部件,用于放置按钮  
        central_widget = QWidget(self)  
        self.setCentralWidget(central_widget)  
  
        # 创建一个垂直布局  
        layout = QVBoxLayout(central_widget)  
  
        # 创建并添加按钮  
        self.button1 = QPushButton("打开新窗口 1", self)  
        self.button1.clicked.connect(self.open_new_window)  
        layout.addWidget(self.button1)

        self.button2 = QPushButton ( "打开新窗口 2", self )
        self.button2.clicked.connect ( self.open_2_window )
        layout.addWidget ( self.button2 )

        # 你可以根据需要添加更多的按钮  
  
    def open_new_window(self):
        dialog = NewWindowDialog(self)  
        dialog.show()


    def open_2_window(self):
        dialogwindos = QDockMainWindow(self)
        dialogwindos.show()

  
class NewWindowDialog(QDialog):  
    def __init__(self, parent=None):  
        super().__init__(parent)  
  
        # 设置窗口标题和大小  
        self.setWindowTitle("新窗口")  
        self.setGeometry(100, 100, 300, 200)  

        self.label = QLabel("这是一个新窗口", self)  
        self.label.move(50, 50)  # 简单地使用move来放置控件(注意:这不是最佳实践)  

        # QDialog 默认就支持窗口支持最小化和关闭等基本操作,因为它继承自 QWidget

class QDockMainWindow ( QMainWindow ) :
    def __init__(self, parent=None) :
        super(QDockMainWindow, self).__init__(parent)

        # 设置窗口标题和大小
        self.setWindowTitle ( "QDockWidget 示例" )
        self.setGeometry ( 100, 100, 800, 600 )

        # 创建两个 QTextEdit 控件作为停靠窗口的内容
        self.textEdit1 = QTextEdit()
        self.textEdit2 = QTextEdit()

        # 创建 QDockWidget 控件并设置其标题和内容
        self.dock1 = QDockWidget ( "停靠窗口 1", self )
        self.dock1.setWidget ( self.textEdit1 )

        self.dock2 = QDockWidget ( "停靠窗口 2", self )
        self.dock2.setWidget ( self.textEdit2 )

        # 将停靠窗口添加到主窗口
        # 默认情况下,停靠窗口会停靠在主窗口的左侧,但你可以通过 addDockWidget 的参数来改变它的位置
        self.addDockWidget ( Qt.LeftDockWidgetArea, self.dock1 )
        self.addDockWidget ( Qt.RightDockWidgetArea, self.dock2 )

if __name__ == '__main__':
    app = QApplication([])  
    window = MainWindow()  
    window.show()  
    app.exec_()

结果

在这里插入图片描述
点击按钮的结果

在这里插入图片描述


总结

这篇文章依旧没有总结

使用PyQt可以很容易地实现渐变界面切换效果。渐变界面切换是指在切换界面时,界面的过渡效果呈现为渐变的效果,以增加用户交互的吸引力和美观性。 首先,需要导入PyQt的相关模块。在使用PyQt5时,可以导入如下模块: ```python from PyQt5.QtCore import Qt, QPropertyAnimation, QRect from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QPushButton from PyQt5.QtGui import QLinearGradient, QColor, QPainter, QGradient ``` 接下来,需要创建一个自定义的QWidget类来实现界面切换效果。在该类中,需要定义一个渐变动画对象,并实现切换时的渐变动画效果。可以使用QPropertyAnimation类来实现渐变动画效果。 首先,在初始化函数中,创建一个QPropertyAnimation对象,并设置它的起始值和结束值。例如,可以设置起始值为0,结束值为1,表示渐变的效果从完全透明到完全不透明。 然后,在paintEvent函数中,使用QPainter对象来绘制界面,并设置渐变的透明度。可以使用setOpacity函数设置透明度,传入QPropertyAnimation对象的当前值,从而实现渐变效果。 最后,在按钮的点击事件中,启动渐变动画对象,通过调用start函数来启动渐变动画,并在动画结束后重新绘制界面,从而实现渐变界面切换效果。 一个简单示例代码如下: ```python class MyWidget(QWidget): def __init__(self, parent=None): super().__init__(parent) self.animation = QPropertyAnimation(self, b"opacity") self.animation.setStartValue(0) self.animation.setEndValue(1) def paintEvent(self, event): painter = QPainter(self) gradient = QLinearGradient(0, 0, 0, self.height()) gradient.setColorAt(0, QColor(255, 255, 255)) gradient.setColorAt(1, QColor(0, 0, 0)) painter.setBrush(QBrush(gradient)) painter.fillRect(QRect(0, 0, self.width(), self.height()), gradient) painter.setOpacity(self.animation.currentValue()) def startAnimation(self): self.animation.start() self.animation.finished.connect(self.repaint) if __name__ == "__main__": app = QApplication([]) window = QMainWindow() widget = MyWidget(window) button = QPushButton("Switch", window) button.clicked.connect(widget.startAnimation) layout = QVBoxLayout() layout.addWidget(widget) layout.addWidget(button) central_widget = QWidget() central_widget.setLayout(layout) window.setCentralWidget(central_widget) window.show() app.exec_() ``` 这样,当点击按钮时,界面就会出现渐变的切换效果。当渐变动画结束后,界面会重新绘制,呈现渐变效果完成后的最终界面。 以上就是使用PyQt实现渐变界面切换的简单示例代码。通过使用QPropertyAnimation类和QPainter类,可以方便地实现渐变效果,增强界面切换的视觉效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值