Python 图形界面设计:PyQt6简单实现标签页面切换

2023年 7月 11日 38.5k 0

实现一个简单的功能,ping列表的内容,把ping结果展示,ping不通时会有声音提示。Python 图形界面设计:PyQt6简单实现标签页面切换

这个页面是QWidget页面,不能提供更多的窗口和功能,今天把QWidget改成QMainWindowQMainWindow可以增加菜单,和状态栏等功能,可以在窗口内加QWidget页面。在此窗口基础上,添加几个页面,底部几个按钮(PushButton)相当于页面标签,进行切换使用。下面的三个按钮,只有第一个做了关联,其他两个按钮直接显示一个标签(QLabel),实现后大概如图:

Python 图形界面设计:PyQt6简单实现标签页面切换Python 图形界面设计:PyQt6简单实现标签页面切换Python 图形界面设计:PyQt6简单实现标签页面切换

页面切换使用QStackedWidget,QStackedWidget可以填中多个页面,通过setCurrentIndex(0)来设置激活那个页面。每一个页面的按钮不能共用,实际上是三个页面,每个页面有3个按钮,每个页面有2个按钮的动作做了关联。

self.button1_2.clicked.connect(self.show_layout2)
self.button1_3.clicked.connect(self.show_layout3)

self.button2_1.clicked.connect(self.show_layout1)
self.button2_3.clicked.connect(self.show_layout3)

self.button3_1.clicked.connect(self.show_layout1)
self.button3_2.clicked.connect(self.show_layout2)

切换页面代码

def show_layout1(self):
    self.central_widget.setCurrentIndex(0)
    self.statusBar().showMessage('仪器设备连通扫描')

实现这个功能应该有更好的方案,这个也不算是正经的页面标签页。为了实现这个功能,重复代码一堆。

self.central_widget = QStackedWidget()
self.setCentralWidget(self.central_widget)

self.layout1 = QVBoxLayout()
self.layout2 = QVBoxLayout()
self.layout3 = QVBoxLayout()

self.widget1 = QWidget()
self.widget2 = QWidget()
self.widget3 = QWidget()

self.widget1.setLayout(self.layout1)
self.widget2.setLayout(self.layout2)
self.widget3.setLayout(self.layout3)

self.central_widget.addWidget(self.widget1)
self.central_widget.addWidget(self.widget2)
self.central_widget.addWidget(self.widget3)

layout1、2、3对应这三个页面,后面再写代码,填另组件,直接填加即可:

self.layout1.addWidget(self.table_widget)
self.layout1.addLayout(hbox_layout1)

另外我还想实现些汇图功能,可能通过PyQt6与Matplotlib结合,实现绘图。

import sys

from PyQt6 import (
    QtCore,
    QtWidgets,
)  # import PyQt6 before matplotlib

import matplotlib
import pandas as pd
from matplotlib.backends.backend_qtagg import FigureCanvasQTAgg
from matplotlib.backends.backend_qtagg import (
    NavigationToolbar2QT as NavigationToolbar,
)
from matplotlib.figure import Figure


matplotlib.use("QtAgg")


class MplCanvas(FigureCanvasQTAgg):
    def __init__(self, parent=None, width=5, height=4, dpi=100):
        fig = Figure(figsize=(width, height), dpi=dpi)
        self.axes = fig.add_subplot(111)
        super().__init__(fig)


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

        # Create the maptlotlib FigureCanvasQTAgg object,
        # which defines a single set of axes as self.axes.
        sc = MplCanvas(self, width=5, height=4, dpi=100)

        # Create our pandas DataFrame with some simple
        # data and headers.
        df = pd.DataFrame(
            [
                [0, 10],
                [5, 15],
                [2, 20],
                [15, 25],
                [4, 10],
            ],
            columns=["A", "B"],
        )

        # plot the pandas DataFrame, passing in the
        # matplotlib Canvas axes.
        df.plot(ax=sc.axes)

        # Create toolbar, passing canvas as first parameter, parent (self, the MainWindow) as second.
        toolbar = NavigationToolbar(sc, self)

        layout = QtWidgets.QVBoxLayout()
        layout.addWidget(toolbar)
        layout.addWidget(sc)

        # Create a placeholder widget to hold our toolbar and canvas.
        widget = QtWidgets.QWidget()
        widget.setLayout(layout)
        self.setCentralWidget(widget)
        self.show()


app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
app.exec()

Python 图形界面设计:PyQt6简单实现标签页面切换

有了这些基础,还有更多玩法。

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论