[python] 3. pyqt5亂搞,試試子鮮橙,左右佈局

版本:

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}")

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章