版本:
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}")