-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathscreen.py
117 lines (99 loc) · 4.75 KB
/
screen.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
from PySide6.QtCore import QEvent, Qt, Signal
from PySide6.QtGui import QResizeEvent
from PySide6.QtWidgets import QApplication, QMainWindow, QLabel, QGridLayout, QWidget, QStatusBar, QSizePolicy
class TestScreen(QMainWindow):
__max_split_length__ = 120
splitted_screen = []
now_resolution = (0, 0)
def __init__(self):
super().__init__()
self.resize(800, 600)
self.central_widget = QWidget()
self.setCentralWidget(self.central_widget)
self.status_bar = QStatusBar()
self.status_bar.showMessage("Ready")
self.setStatusBar(self.status_bar)
# Create a frame as a screen
self.combined_screen = QWidget(self.central_widget)
self.combined_screen.setMouseTracking(True)
self.combined_screen.mouseMoveEvent = self.mouseMoveTest
# self.combined_screen.eventFilter = self.screenEventFilter
self.combined_screen.setStyleSheet("background-color: black;")
self.changeResolution((1900, 1000))
mouseMoved = Signal(int, int)
mouseAction = Signal(QEvent.Type)
def mouseMoveTest(self, event):
self.status_bar.showMessage(f"Mouse Moved: {event.position().x()}, {event.position().y()}")
def screenEventFilter(self, obj, event) -> bool:
if event.type() == QEvent.Type.MouseMove:
self.mouseMoved.emit(event.x(), event.y())
self.status_bar.showMessage(f"Mouse Moved: {event.x()}, {event.y()}")
else:
self.mouseAction.emit(event.type())
return True
def changeResolution(self, resolution):
self.now_resolution = resolution
self.initScreen(resolution[0], resolution[1])
self.resizeScreen()
def initScreen(self, rwidth, rheight):
"""
for every 120*120, create a label in splitted_screen and add it to the grid layout,
if the length is not enough, still create a label in splitted_screen and add it to the grid layout.
"""
left_width = rwidth % self.__max_split_length__
left_height = rheight % self.__max_split_length__
num_width = rwidth // self.__max_split_length__
num_height = rheight // self.__max_split_length__
self.grid_layout = QGridLayout(self.combined_screen)
self.grid_layout.setSpacing(0)
self.grid_layout.setContentsMargins(0, 0, 0, 0)
self.splitted_screen.clear()
for i in range(num_height):
for j in range(num_width):
label = QLabel()
label.setStyleSheet("border: 1px solid white;")
label.setMouseTracking(True)
self.grid_layout.addWidget(label, i, j)
self.splitted_screen.append(label)
self.grid_layout.setRowStretch(i, self.__max_split_length__)
for j in range(num_width):
self.grid_layout.setColumnStretch(j, self.__max_split_length__)
if left_width != 0:
for i in range(num_height):
label = QLabel()
label.setStyleSheet("border: 1px solid white;")
label.setMouseTracking(True)
self.grid_layout.addWidget(label, i, num_width)
self.splitted_screen.append(label)
self.grid_layout.setColumnStretch(num_width, left_width)
if left_height != 0:
for j in range(num_width):
label = QLabel()
label.setStyleSheet("border: 1px solid white;")
label.setMouseTracking(True)
self.grid_layout.addWidget(label, num_height, j)
self.splitted_screen.append(label)
self.grid_layout.setRowStretch(num_height, left_height)
if left_width != 0 and left_height != 0:
label = QLabel()
label.setStyleSheet("border: 1px solid white;")
label.setMouseTracking(True)
self.grid_layout.addWidget(label, num_height, num_width)
self.splitted_screen.append(label)
def resizeEvent(self, event: QResizeEvent) -> None:
super().resizeEvent(event)
self.resizeScreen()
def resizeScreen(self):
# resize the screen to the size of the central widget but keep the ratio
width = self.now_resolution[0]
height = self.now_resolution[1]
if width * self.central_widget.height() >= self.central_widget.width() * height:
self.combined_screen.resize(self.central_widget.width(), self.central_widget.width() / width * height)
else:
self.combined_screen.resize(self.central_widget.height() / height * width, self.central_widget.height())
self.combined_screen.move(self.central_widget.rect().center() - self.combined_screen.rect().center())
if __name__ == "__main__":
app = QApplication([])
widget = TestScreen()
widget.show()
app.exec()