版本:
pyqt 5.9 pycharm+anaconda win10
效果:
思路:
总体使用网格布局,左侧用垂直布局,右侧用栈布局
按钮绑定切换事件,根据按钮id决定切哪个
子界面1创建子线程,激活自定义信号刷新界面,这招超实用!
实现:
其实就两个.py 具体看注释
主界面的py
from PyQt5.QtCore import QThread , pyqtSignal, QDateTime
from PyQt5.QtWidgets import QApplication, QDialog, QLineEdit\
,QWidget,QGridLayout,QPushButton,QLabel,QStyleFactory,QHBoxLayout,QVBoxLayout,QFrame,QStackedLayout
import time
import sys
import random
from son1 import Panel2,Panel1,Panel3
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('PyQt 5界面实时更新例子')
self.resize(1300, 700)
#总布局
self.layout=QGridLayout(self)
self.leftfuck=QWidget(self) #空物体
self.rightfuck=QWidget(self) #空物体
self.left=QVBoxLayout(self) #左侧菜单栏垂直布局
self.right=QStackedLayout(self) #右侧切换采用栈布局
#添加左侧按钮1 2 3 绑定切换事件switchs 设置id
self.btn1 = QPushButton("menu1", self)
self.btn2 = QPushButton("menu2", self)
self.btn3 = QPushButton("menu3", self)
self.btn1.clicked.connect(self.switchs)
self.btn1.setObjectName("btn1")
self.btn2.clicked.connect(self.switchs)
self.btn2.setObjectName("btn2")
self.btn3.clicked.connect(self.switchs)
self.btn3.setObjectName("btn3")
#左侧锤子布局添加按钮 1 2 3
self.left.addWidget(self.btn1)
self.left.addWidget(self.btn2)
self.left.addWidget(self.btn3)
self.leftfuck.setLayout(self.left)
self.rightfuck.setLayout(self.right)
self.layout.addWidget(self.leftfuck,0,0)
self.layout.addWidget(self.rightfuck,0,1,1,4) #设置水平跨4行
self.initUI()
def initUI(self):
#声明Panel (在son1.py里面 )
self.frame1 = Panel1()
self.frame2 = Panel2()
self.frame3 = Panel3()
#嵌套布局加入Panel 123
self.right.addWidget(self.frame1)
self.right.addWidget(self.frame2)
self.right.addWidget(self.frame3)
QApplication.processEvents() #这个还没起作用,可加可不加,作用是让耗时过程(io) 先处理,主界面继续刷新
def switchs(self): #根据id 切换页面
dic={"btn1":0,"btn2":1,"btn3":2}
index=dic[str(self.sender().objectName())]
self.right.setCurrentIndex(index)
if __name__ == '__main__':
app = QApplication(sys.argv)
win = Window()
win.show()
sys.exit(app.exec_())
子界面的py ,QFrame 是QWidget的拓展类
from PyQt5.QtCore import QThread , pyqtSignal, QDateTime
from PyQt5.QtWidgets import QApplication, QDialog, QLineEdit\
,QWidget,QGridLayout,QPushButton,QLabel,QStyleFactory,QHBoxLayout,QVBoxLayout,QFrame
import time
import sys
import random
class BackendThread(QThread): #线程类
# 通过类成员对象自定义信号
update_date = pyqtSignal(str)
# 处理业务逻辑
def run(self):
while True:
data = QDateTime.currentDateTime()
currTime = data.toString("yyyy-MM-dd hh:mm:ss") #修改时间
self.update_date.emit(str(currTime)) #每秒激活,发射一次信号
time.sleep(1) #至少加0.01,不然会卡死
class Panel1(QFrame):
def __init__(self):
super().__init__()
self.input = QLineEdit(self)
self.input.resize(400, 30)
self.initUI()
def initUI(self):
self.setStyleSheet("QFrame{background-color:blue}") # ""里面用类css语法表示样式
# 创建线程
self.backend = BackendThread()
# 连接信号 自定义信号update_date 绑定 物体事件handleDisplay
self.backend.update_date.connect(self.handleDisplay)
# 开始线程
self.backend.start()
def handleDisplay(self, data):
self.input.setText(data)
class Panel2(QFrame):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setStyleSheet("QFrame{background-color:red}")
class Panel3(QFrame):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setStyleSheet("QFrame{background-color:yellow}")