pyqt多窗口(6种方法 按键单击调用其他窗口)(tcy)

1. 六种方法调用多窗口

参考原代码链接

链接:https //pan.baidu.com/s/1fiK4l8JfO-udHhdI0FZWfA 
提取码:101g   
# !/usr/bin/python3
# -*- coding: utf-8 -*-
# sys.path.append('D:\\tcy_module')

#===============================================================================
#0.1.导入对话框文件(xx.ui界面文件;绘制完成转换成xx.py文件;内容不做修改)
#    界面和程序分离,引用界面引用界面封装类iUi_xx(QDialog,Ui_xx)
import MainDlg
from MainDlg import Ui_MainDlg
from AutoRunDlg import Ui_AutoRunDlg
from HandRunDlg import Ui_HandRunDlg
from SetDlg import Ui_SetDlg
from PressureImageDlg import Ui_PressureImageDlg
from TableDlg import Ui_TableDlg
#0.2.导入相关包
from PyQt5.QtCore import pyqtSlot
import pyqtgraph as pg

from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication, QWidget,QMainWindow,QDialog
from PyQt5.QtWidgets import QApplication
from PyQt5.QtCore import pyqtSignal,QObject,QEvent
from PyQt5.QtCore import QTimer

import numpy as np
import sys,time
#===============================================================================
#1.1.窗口界面类封装
""" 
class iMainWindow(QMainWindow,Ui_MainWindow):#带菜单的主窗口(类似Dlg)
    def __init__(self,parent=None):
        super(iMainWindow,self).__init__(parent)
        self.setupUi(self)
"""
#1.2.1.对话框界面类封装(窗口界面不多直接用下面类似代码封装)
class MainDlg(QDialog,Ui_MainDlg):     #主界面
    def __init__(self,parent=None):
        super(MainDlg,self).__init__(parent)
        self.setupUi(self)
        # self.AutoRunBtn.clicked.connect(self.click_button)    #单击
        self.AutoRunBtn.pressed.connect(self.AutoRunBtn_pressed)#按键按下
        self.HandRunBtn.pressed.connect(self.HandRunBtn_pressed)#按键按下
        self.SetBtn.pressed.connect(self.SetBtn_pressed)        #按键按下
        self.ImageBtn.pressed.connect(self.ImageBtn_pressed)  # 按键按下
        self.TableBtn.pressed.connect(self.TableBtn_pressed)  # 按键按下
    def AutoRunBtn_pressed(self):    #方法1:(推荐用法)主Dlg调用子对话框
        dlg = AutoRunDlg()           # 实例化子窗口
        # print('dlg_name1=',dlg.objectName(),
        #       dlg.isActiveWindow())#dlg_name1= AutoRunDlg False
        dlg.show()
        # print('dlg_name2=',dlg.objectName(),
        #       dlg.isActiveWindow())#dlg_name2= AutoRunDlg True
        return dlg.exec()

    def HandRunBtn_pressed(self):  # 方法1:(推荐用法)主Dlg调用子对话框
        dlg = HandRunDlg()         # 实例化子窗口
        dlg.show()
        return dlg.exec()

    def SetBtn_pressed(self):  # 方法2:主Dlg调用子对话框
        dlg = QDialog()
        ui = Ui_SetDlg()       # SetDlg.Ui_setDlg
        ui.setupUi(dlg)
        dlg.show()
        result=dlg.exec()
        # if rsp == QtWidgets.QDialog.Accepted:
        #     self.label.setText("点击了OK")
        #     self.statusTip()
        # else:
        #     self.label.setText("点击了Cannel")
    def ImageBtn_pressed(self):  # 方法3:(推荐用法)主Dlg调用子对话框
        dlg = PressureImageDlg() # 实例化子窗口
        dlg.show()
        return dlg.exec()
    # def _set_table(self,dlg):
    #     id = ['1010', '1011', '1012', '1013']
    #     name = ['Tom', 'Bob', 'Jim', 'Mark']
    #     sex = ['男', '男', '女', '男']
    #     for i in range(4):
    #         item=QtWidgets.QTableWidgetItem(id[i])
    #         dlg.tableWidget.setItem(i,0,item)
    #         dlg.tableWidget.setItem(i,1,item)
    #         dlg.tableWidget.setItem(i,2,item)
    def TableBtn_pressed(self):
        dlg = TableDlg()
        dlg.show()
        return dlg.exec()
    #===========================================
    #窗口事件
    def changeEvent(self, e):
        if e.type() == QEvent.WindowStateChange:
            if self.isMinimized():
                print("窗口最小化")
            elif self.isMaximized():
                print("窗口最大化")
            elif self.isFullScreen():
                print("全屏显示")
            elif self.isActiveWindow():
                print("活动窗口")
            QDialog.changeEvent(self, e)

    def showEvent(self, e):
        self.activateWindow()
        print("窗口显示",self.isActiveWindow())
        QDialog.showEvent(self, e)

    def hideEvent(self, e):
        print("窗口隐藏",self.isActiveWindow())
        QDialog.hideEvent(self, e)
    # ===========================================
class AutoRunDlg(QDialog,Ui_AutoRunDlg):#自动运行界面
    def __init__(self,parent=None):
        super(AutoRunDlg,self).__init__(parent)
        self.setupUi(self)

class HandRunDlg(QDialog,Ui_HandRunDlg):#手动界面
    def __init__(self,parent=None):
        super(HandRunDlg,self).__init__(parent)
        self.setupUi(self)

class SetDlg(QDialog,Ui_SetDlg):        #参数设置界面
    def __init__(self,parent=None):
        super(SetDlg,self).__init__(parent)
        self.setupUi(self)

class TableDlg(QDialog,Ui_TableDlg):    #数据表界面
    def __init__(self,parent=None):
        super(TableDlg,self).__init__(parent)
        self.setupUi(self)
        # id = ['1010', '1011', '1012', '1013']
        # name = ['Tom', 'Bob', 'Jim', 'Mark']
        # sex = ['男', '男', '女', '男']
        # for i in range(4):#初始化表数据
        #     item1=QtWidgets.QTableWidgetItem(id[i])
        #     item2 = QtWidgets.QTableWidgetItem(name[i])
        #     item3 = QtWidgets.QTableWidgetItem(sex[i])
        #     self.tableWidget.setItem(i,0,item1)
        #     self.tableWidget.setItem(i,1,item2)
        #     self.tableWidget.setItem(i,2,item3)
        self.InsertBtn.pressed.connect(self.InsertDataBtn)  # 按键按下

    def InsertDataBtn(self):
        id = ['2010', '2011', '2012', '2013']
        name = ['Ben', 'Smith', 'May', 'Jack']
        sex = ['男', '男', '女', '男']
        for i in range(0,4):  # 初始化表数据
            item1 = QtWidgets.QTableWidgetItem(id[i])
            item2 = QtWidgets.QTableWidgetItem(name[i])
            item3 = QtWidgets.QTableWidgetItem(sex[i])
            self.tableWidget.setItem(i, 0, item1)
            self.tableWidget.setItem(i, 1, item2)
            self.tableWidget.setItem(i, 2, item3)


#==============================================================================
class PressureImageDlg(QDialog,Ui_PressureImageDlg):#对话框中显示压力曲线
    """
    提升窗口部件步骤:
    1)qt Designer--新建对话框QDialog--将2个QWidget控件拖到对话框内--
       将2个对象命名为graph1,graph2
    2)选择graph1--右键--提升为--基类名称:QWidget
                             提升的类名称:GraphicsLayoutWidget#类名称包含在头文件中
                             头文件:pyqtgraph.h#固定
       --输入完成点添加--点提升--退出
    3)选择graph2--右键--提升为(上面)--点开小三角:显示GraphicsLayoutWidget
       --点击GraphicsLayoutWidget--自动退出--完成
    说明:上面的提升的类名称除非你明白意思,否则按上面的设置,单都必须在头文件中。
    """
    def __init__(self, parent=None):
        """
        Constructor
        @param parent reference to the parent widget
        @type QWidget
        """
        super(PressureImageDlg,self).__init__(parent)
        # 设置
        pg.setConfigOption('background', '#f0f0f0') # 背景灰色
        pg.setConfigOption('foreground','d') # 前景(坐标轴,线条,文本)黑色
        pg.setConfigOptions(antialias=True)  # 曲线光滑;多个参数设置
        #pg.setConfigOption('antialias',True)# 等价;仅接受一个参数
        self.setupUi(self)

    @pyqtSlot()                #(参数)装饰器信号和槽
    def on_H_Btn_clicked(self):#on_发送者名称_发射信号名称(self,参数)
        """
        Slot documentation goes here.
        """
        self.graph1.clear()  # 清空里面的内容,否则发生重复绘图

        '''第一种绘图方式'''
        self.graph1.addPlot(title="绘图单条线", y=np.random.normal(size=100),
                                pen=pg.mkPen(color='b', width=2))
        '''第二种绘图方式'''
        plt2 = self.graph1.addPlot(title='绘制多条线')
        plt2.plot(np.random.normal(size=150), pen=pg.mkPen(color='r', width=2),
                  name="Red curve")  # pg.mkPen设置线条颜色为红色,宽度为2。
        plt2.plot(np.random.normal(size=110) + 5, pen=(0, 255, 0), name="Green curve")
        plt2.plot(np.random.normal(size=120) + 10, pen=(0, 0, 255), name="Blue curve")

    @pyqtSlot()
    def on_V_Btn_clicked(self):
        """
        Slot documentation goes here.
        """
        '''如果没有进行第一次绘图,就开始绘图,然后做绘图标记,否则就什么都不做'''
        try:
            self.first_plot_flag  # 检测是否进行过第一次绘图。
        except:
            plt = self.graph2.addPlot(title='绘制条状图')
            x = np.arange(10)
            y1 = np.sin(x)
            y2 = 1.1 * np.sin(x + 1)
            y3 = 1.2 * np.sin(x + 2)
        # except:
            bg1 = pg.BarGraphItem(x=x, height=y1, width=0.3, brush='r')
            bg2 = pg.BarGraphItem(x=x + 0.33, height=y2, width=0.3, brush='g')
            bg3 = pg.BarGraphItem(x=x + 0.66, height=y3, width=0.3, brush='b')

            plt.addItem(bg1)
            plt.addItem(bg2)
            plt.addItem(bg3)

            self.graph2.nextRow()

            p4 = self.graph2.addPlot(title="参数图+显示网格")
            x = np.cos(np.linspace(0, 2 * np.pi, 1000))
            y = np.sin(np.linspace(0, 4 * np.pi, 1000))
            p4.plot(x, y, pen=pg.mkPen(color='d', width=2))
            p4.showGrid(x=True, y=True)  # 显示网格

            self.first_plot_flag = True  # 第一次绘图后进行标记
        # except:pass

# if __name__ == "__main__":
#     import sys
#
#     app = QApplication(sys.argv)
#     ui = PressureImageDlg()
#     ui.show()
#     sys.exit(app.exec())

#==============================================================================
if __name__ == '__main__':
    app = QApplication(sys.argv)
    dlg = MainDlg()  # iMainWindow()

    # 方法4:面向对象--主界面调用子窗口(不推荐)
    # btn = dlg.HandRunBtn
    # ChildDlg_HandRun = HandRunDlg()             # 实例化子窗口
    # btn.clicked.connect(ChildDlg_HandRun.show)  # 按钮绑定事件
    dlg.show()
    sys.exit(app.exec())

    #方法5:面向过程--主界面调用子窗口(不推荐)
    # app = QApplication(sys.argv)
    # dlg = QWidget()
    # ui = Ui_MainDlg()  # MainDlg.Ui_Dlg()
    # ui.setupUi(dlg)
    # dlg.show()
    # sys.exit(app.exec())
#==============================================================================
#==============================================================================
def show_pyqtgraph():
    from PyQt5 import QtGui
    import pyqtgraph as pg
    import numpy as np
    x = np.random.normal(size=1000)
    y = np.random.normal(size=1000)
    pg.plot(x, y, pen=None, symbol='o')
    import numpy as np
    import pyqtgraph as pg

    data = np.random.normal(size=1000)
    pg.plot(data, title="Simplest possible plotting example")

    data = np.random.normal(size=(500,500))
    pg.image(data, title="Simplest possible image example")


    ## Start Qt event loop unless running in interactive mode or using pyside.
    if __name__ == '__main__':
        import sys
        if sys.flags.interactive != 1 or not hasattr(QtCore, 'PYQT_VERSION'):
            pg.QtGui.QApplication.exec_()

猜你喜欢

转载自blog.csdn.net/tcy23456/article/details/88743336