# PyQt5範例程式
## PyQt5 - 多視窗傳值
```python=
from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, QGridLayout, QHBoxLayout
from PyQt5.QtCore import pyqtSignal
import sys
from PyQt5.QtWidgets import QLabel, QPushButton,QLineEdit
class Main_GUI(QMainWindow):
# 建立兩個信號槽,用來觸發顯示視窗的函式
open_child1 = pyqtSignal()
open_child2 = pyqtSignal()
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
# 視窗名稱
self.setWindowTitle(f'Main_GUI')
# 設定布局
widget = QWidget()
self.setCentralWidget(widget)
layout = QHBoxLayout()
widget.setLayout(layout)
# 按鈕1
btn = QPushButton('Open1')
btn.clicked.connect(self.open1)
layout.addWidget(btn)
# 按鈕2
btn = QPushButton('Open2')
btn.clicked.connect(self.open2)
layout.addWidget(btn)
# 初始化完成後顯示自己
self.show()
def open1(self):
self.open_child1.emit()
def open2(self):
self.open_child2.emit()
class child1(QWidget):
# 傳送文字的信號槽
# ()內的是要發送的資料型態
# str表示發送信號時會帶一串文字
# 亦可使用dict/list之類格式夾帶更多資料
send_message = pyqtSignal(str)
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
# 設定視窗名稱及大小
self.setFixedSize(250, 150)
self.setWindowTitle(f'Child1')
# 設定布局
# 注意布局縱軸是第1個參數
# 橫軸是第二個參數
layout = QGridLayout()
self.setLayout(layout)
# 在(0,0)的位置加入一個占用1*1大小的標籤
layout.addWidget(QLabel('輸入文字:'), 0, 0, 1, 1)
# 在(0,1)的位置加入一個占用1*2大小的輸入框
self.inp = QLineEdit()
layout.addWidget(self.inp, 0, 1, 1, 2)
# 在(1,0)的位置加入一個占用1*3大小的按鈕
# 此按鈕綁定send函數
btn = QPushButton('確定')
btn.clicked.connect(self.send)
layout.addWidget(btn, 1, 0, 1, 3)
def open(self):
self.show()
def send(self):
# 帶著輸入的文字發送一個信號
self.send_message.emit(self.inp.text())
class child2(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
# 設定視窗名稱及大小
self.setFixedSize(250, 150)
self.setWindowTitle(f'Child2')
# 設定布局
layout = QHBoxLayout()
self.setLayout(layout)
# 設定用來顯示的標籤
layout.addWidget(QLabel('接收文字:'))
# 設定用來顯示輸入文字的標籤
self.print_label = QLabel('')
layout.addWidget(self.print_label)
def open(self):
self.show()
def print_message(self,str):
self.print_label.setText(str)
if __name__ == '__main__':
app = QApplication(sys.argv)
# 先建立三個視窗物件
mainGUI = Main_GUI()
child1 = child1()
child2 = child2()
# 將主畫面兩個信號發送時綁定兩個子視窗的處理函式
mainGUI.open_child1.connect(child1.open)
mainGUI.open_child2.connect(child2.open)
# 將child1發送文字的信號綁定child2的處理函式
child1.send_message.connect(child2.print_message)
sys.exit(app.exec_())
```
## PyQt5 - 更改背景色
```python=
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QHBoxLayout
from PyQt5.QtWidgets import QWidget, QLabel, QPushButton
import sys
class myGUI(QMainWindow):
def __init__(self):
super().__init__()
self.lightList = []
vbox = QVBoxLayout()
vbox.addLayout(self.makeButtonGroup(1))
vbox.addLayout(self.makeButtonGroup(2))
vbox.addLayout(self.makeButtonGroup(3))
widget = QWidget()
self.setCentralWidget(widget)
widget.setLayout(vbox)
self.show()
def makeButtonGroup(self,groupNumber):
btn_start = QPushButton()
btn_start.setText("Start Record "+str(groupNumber))
btn_start.clicked.connect(self.startRecord)
btn_stop = QPushButton()
btn_stop.setText("Stop Record "+str(groupNumber))
btn_stop.clicked.connect(self.stopRecord)
lbl_light = QLabel("未錄影")
lbl_light.setStyleSheet("QLabel { background-color : red}")
self.lightList.append(lbl_light)
hbox = QHBoxLayout()
hbox.addWidget(btn_start)
hbox.addWidget(btn_stop)
hbox.addWidget(lbl_light)
return hbox
def startRecord(self):
sender = self.sender()
groupNumber = int(sender.text().split(" ")[-1])
self.lightList[groupNumber-1].setStyleSheet("QLabel { background-color : Green}")
self.lightList[groupNumber - 1].setText("錄影中")
def stopRecord(self):
sender = self.sender()
groupNumber = int(sender.text().split(" ")[-1])
self.lightList[groupNumber - 1].setStyleSheet("QLabel { background-color : red}")
self.lightList[groupNumber - 1].setText("未錄影")
if __name__ == '__main__':
app = QApplication(sys.argv)
mainGUI = myGUI()
sys.exit(app.exec_())
```