[Python] PyQt Widget
Python Qt에선 위젯이라는 것을 사용하는데 위젯 설정을 통해 배경색, 투명도 등 다양한 부분을 수정 할 수 있다.
import sys from PyQt5.QtWidgets import QWidget from PyQt5.QtWidgets import QApplication from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QGraphicsOpacityEffect class Form(QWidget): def __init__(self): QWidget.__init__(self, flags=Qt.Widget) self.w1 = QWidget(parent=self, flags=Qt.Widget) self.w3 = QWidget(parent=self, flags=Qt.Widget) self.w2 = QWidget(parent=self, flags=Qt.Widget) self.init_widget() def init_widget(self): self.setWindowTitle("Hello World") self.w1.setGeometry(10, 10, 100, 100) self.w1.setStyleSheet("background-color: yellow") self.w3.setGeometry(40, 40, 100, 100) self.w3.setStyleSheet("background-color: pink") self.w2.setGeometry(70, 70, 100, 100) opacity_effect = QGraphicsOpacityEffect(self.w2) opacity_effect.setOpacity(0.3) self.w2.setGraphicsEffect(opacity_effect) self.w2.setStyleSheet("background-color: red") if __name__ == "__main__": app = QApplication(sys.argv) form = Form() form.show() exit(app.exec_())
위 코드에서 Form은 main Widget을 두고 3개의 sub Widget을 생성한다. self
는 main Widget을 말한다.
self.w1 = QWidget(parent=self, flags=Qt.Widget) self.w3 = QWidget(parent=self, flags=Qt.Widget) self.w2 = QWidget(parent=self, flags=Qt.Widget)
QGraphicsOpacityEffect([위젯 객체])
위 함수를 통해 특정 위젯에 효과를 넣는 객체를 생성한다. 여기에선 opacity_effect.setOpacity(0.3)
를 통해 70%의 투명도로 수정했다.
각 위젯에 대한 기본적 특성 또한 setGeometry(10, 10, 100, 100)
, setStyleSheet("background-color: yellow")
를 통해 설정했다.
Mouse 움직임에 따른 Widget 배경색 변경
import sys from PyQt5.QtWidgets import QWidget from PyQt5.QtWidgets import QLabel from PyQt5.QtWidgets import QApplication from PyQt5.QtCore import Qt from PyQt5.QtGui import QColor from PyQt5.QtGui import QPalette from math import sqrt class Label(QLabel): def __init__(self, parent=None): super(Label, self).__init__(parent) self.setMouseTracking(True) self.setAutoFillBackground(True) self.rgb = str() class Form(QWidget): def __init__(self): QWidget.__init__(self, flags=Qt.Widget) self.mouse_x = 0 self.mouse_y = 0 self.lb = Label(self) self.properties_list = ( "width", "height", "x", "y", "geometry", "maximumHeight", "maximumWidth", "maximumSize", "minimumSize", "minimumWidth", "size", "windowFilePath", "windowTitle", "underMouse" ) self.rgb_value = '' self.init_widget() self.show() def init_widget(self): self.setWindowTitle("Hello World") self.setGeometry(100, 100, 640, 480) self.setMouseTracking(True) msg = self.get_properties_value(self.properties_list) self.lb.setText(msg) def get_properties_value(self, properties): msg = [] for p in properties: if not hasattr(self, p): continue value = getattr(self, p)() msg.append("{:>20s} : {:<30s}".format(p, str(value))) msg.append("{:>20s} : {:<30s}".format("mouse_x", str(self.mouse_x))) msg.append("{:>20s} : {:<30s}".format("mouse_y", str(self.mouse_y))) msg.append("{:>20s} : {:<30s}".format("label", self.rgb_value)) msg = "\n".join(msg) return msg def mouseMoveEvent(self, QMouseEvent): self.mouse_x = QMouseEvent.x() self.mouse_y = QMouseEvent.y() self.set_widget_bgcolor(self.lb, self.mouse_x, self.mouse_y) self.update() def set_widget_bgcolor(self, widget, mx, my): if not isinstance(widget, QWidget): return False lw = widget.width() lh = widget.height() if (lw < mx) or (lh <my): return False v = int(sqrt(mx ** 2 + my ** 2)) r = int(sqrt(lw ** 2 + lh ** 2)) r = int(v/r * 255) g = int(mx / lw * 255) b = int(my / lh * 255) pal = QPalette() pal.setColor(QPalette.Background, QColor(r, g, b)) widget.setPalette(pal) self.rgb_value = "r{0},g{1},b{2}".format(r, g, b) def moveEvent(self, QMoveEvent): self.update() def paintEvent(self, QPaintEvent): msg = self.get_properties_value(self.properties_list) self.lb.setText(msg) if __name__ == "__main__": app = QApplication(sys.argv) form = Form() exit(app.exec_())
위 코드는 마우스가 label 위에서 움직일 때마다 색깔이 변하는 프로그램 코드다. 먼저 마우스가 움직일 때 어떤 동작을 하는지 보려면 mouseMoveEvent()
함수를 보면 된다.
self.set_widget_bgcolor(self.lb, self.mouse_x, self.mouse_y)
라는 함수가 마우스 위치가 변할 때마다 불리는데, 우리가 바꾸고자하는 widget 객체와 x, y 좌표값을 넘겨주어 QPalette()
클래스를 사용해 우리가 원하는 r,g,b 값으로 배경색을 변경시켰다.Qt.Widget
엔 setPalette()
함수가 존재하여 우리가 설정한 배경색을 입힐 수 있다.