93 lines
2.9 KiB
Python
93 lines
2.9 KiB
Python
import sys
|
|
|
|
from PyQt6.QtCore import QByteArray, Qt
|
|
from PyQt6.QtGui import QImage, QPixmap, QKeyEvent, QWheelEvent
|
|
from PyQt6.QtWidgets import QMainWindow, QApplication, QGraphicsPixmapItem, QGraphicsScene
|
|
|
|
from flandre.nodes.Node import Node
|
|
from flandre.pyqt.Image import Ui_MainWindow
|
|
from flandre.pyqt.ZMQReceiver import ZMQReceiver
|
|
from flandre.utils.Msg import KillMsg, Msg, BMMsg, RfMatMsg, KeyPressMsg
|
|
from flandre.utils.RfMat import RfMat
|
|
|
|
|
|
class Adv(QMainWindow, Ui_MainWindow):
|
|
def __init__(self, p: Node, parent=None):
|
|
super(Adv, self).__init__(parent)
|
|
self.p = p
|
|
self.setupUi(self)
|
|
zmq_receiver = ZMQReceiver(self)
|
|
zmq_receiver.zmq_event.connect(self.on_zmq_event)
|
|
zmq_receiver.start()
|
|
self.g = QGraphicsPixmapItem()
|
|
self.s = QGraphicsScene()
|
|
self.s.addItem(self.g)
|
|
self.graphicsView.setScene(self.s)
|
|
self.grey = False
|
|
self.scale = False
|
|
self.watermark = True
|
|
self.zoom = 1.0
|
|
self.need_fit = False
|
|
|
|
def keyPressEvent(self, a0: QKeyEvent):
|
|
t = a0.text()
|
|
match t:
|
|
case 'm':
|
|
self.grey = not self.grey
|
|
case 's':
|
|
self.scale = not self.scale
|
|
if not self.scale:
|
|
self.need_fit = True
|
|
case 't':
|
|
self.watermark = not self.watermark
|
|
|
|
def wheelEvent(self, a0: QWheelEvent):
|
|
if a0.angleDelta().y() > 0:
|
|
self.zoom += 0.1
|
|
if a0.angleDelta().y() < 0:
|
|
self.zoom -= 0.1
|
|
|
|
def on_zmq_event(self, msg: QByteArray):
|
|
msg = Msg.decode_msg(msg.data())
|
|
if isinstance(msg, KillMsg):
|
|
if msg.name == '':
|
|
self.close()
|
|
elif isinstance(msg, RfMatMsg):
|
|
w = msg.rfmat.w
|
|
h = msg.rfmat.h
|
|
d: RfMat = msg.rfmat
|
|
d2 = (d
|
|
.resize((int(w * self.zoom), int(h * self.zoom)))
|
|
.watermark(cond=self.watermark)
|
|
)
|
|
w = d2.w
|
|
h = d2.h
|
|
qImg = QImage(
|
|
d2.__bytes__(),
|
|
w, h, 1 * w,
|
|
QImage.Format.Format_Grayscale8
|
|
)
|
|
self.g.setPixmap(QPixmap(qImg))
|
|
self.s.setSceneRect(0.0, 0.0, w, h)
|
|
if self.scale:
|
|
self.graphicsView.fitInView(self.s.sceneRect())
|
|
else:
|
|
if self.need_fit:
|
|
self.graphicsView.fitInView(self.s.sceneRect(), Qt.AspectRatioMode.KeepAspectRatio)
|
|
self.need_fit = False
|
|
|
|
|
|
class ImageQt(Node):
|
|
topics = [BMMsg, RfMatMsg, KeyPressMsg]
|
|
|
|
def __init__(self):
|
|
super().__init__()
|
|
|
|
def loop(self):
|
|
app = QApplication(sys.argv)
|
|
MainWindow = Adv(self)
|
|
# MainWindow.move(int(px), int(py))
|
|
# MainWindow.resize(int(sx), int(sy))
|
|
MainWindow.show()
|
|
app.exec()
|