def testButtonClickClose(self): button = QPushButton() button.connect(button, SIGNAL('clicked()'), SLOT('close()')) button.show() self.assertTrue(button.isVisible()) button.click() self.assertTrue(not button.isVisible())
def testButtonClickClose(self): button = QPushButton() button.connect(button, SIGNAL('clicked()'), SLOT('close()')) button.show() self.assert_(button.isVisible()) button.click() self.assert_(not button.isVisible())
class CameraPanel(QWidget): __obj = None def __init__(self, n_camera, app: QApplication, *args, **kwargs): if CameraPanel.__obj is not None: raise type( 'InstanceExists', (Exception, ), {})('A CameraPanel instance has already been constructed.') CameraPanel.__obj = self super().__init__(*args, **kwargs) self.cameras = [] self.box = QVBoxLayout() self.setLayout(self.box) Configuration(n_camera, self) TrafficMonitor(n_camera) FrameRateMonitor(n_camera) FrameDropMonitor(n_camera) self.connectButton = QPushButton("Connect") self.connectButton.clicked.connect(self.connectRemote) self.reconnecting = QLabel("Disconnected. Trying to reconnect") self.reconnecting.setWordWrap(True) self.total_traffic = QLabel("0.000 KB/s") self.restart_remote = QPushButton("Restart Remote") self.restart_remote.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Expanding) self.restart_remote.clicked.connect(self.restartRemote) self.scan = QPushButton("Scan") self.scan.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Expanding) self.scan.clicked.connect(Configuration().scan) self.top_frame = QFrame() self.top_frame.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Maximum) self.top_grid = QGridLayout() self.top_grid.setContentsMargins(0, 0, 0, 0) self.top_frame.setLayout(self.top_grid) self.top_grid.addWidget(self.connectButton, 0, 1) self.top_grid.addWidget(self.reconnecting, 0, 1) self.top_grid.addWidget(self.total_traffic, 0, 1) self.top_grid.addWidget(self.restart_remote, 0, 2) self.top_grid.addWidget(self.scan, 0, 0) self.total_traffic.hide() self.reconnecting.hide() self.box.addWidget(self.top_frame) self.timer = QTimer() self.timer.timeout.connect(self.updateTraffic) self.timer.start(100) for i in range(n_camera): self.cameras.append(Camera(i, app)) main_splitter = QSplitter(Qt.Horizontal) main_splitter.addWidget(self.cameras[0]) if n_camera == 2: main_splitter.addWidget(self.cameras[1]) elif n_camera == 3: sub_splitter = QSplitter(Qt.Horizontal) sub_splitter.addWidget(self.cameras[1]) sub_splitter.addWidget(self.cameras[2]) main_splitter.addWidget(sub_splitter) elif n_camera == 4: sub_splitter = QSplitter(Qt.Horizontal) sub_sub_splitter = QSplitter(Qt.Horizontal) sub_splitter.addWidget(sub_sub_splitter) sub_sub_splitter.addWidget(self.cameras[1]) sub_sub_splitter.addWidget(self.cameras[2]) sub_splitter.addWidget(self.cameras[3]) main_splitter.addWidget(sub_splitter) self.box.addWidget(main_splitter) def connectRemote(self): """ This function blocks until TCP connection succeeds. Call with caution """ if Configuration().connect(): self.connectButton.hide() self.total_traffic.show() for cam in self.cameras: cam.startReceiving() cam.mode_selection.setEnabled(True) cam.updateMode(cam.mode_selection.currentIndex()) def restartRemote(self): os.system( f'ssh root@{REMOTE_IP_ADDR} systemctl restart vision-server.service' ) if self.connectButton.isVisible(): self.connectRemote() else: Configuration().reconnect() def updateTraffic(self): self.total_traffic.setText('{:<4} KB/s'.format( round(TrafficMonitor().total / 1024, 2)))
class Window(QWidget): def __init__(self, app, parent=None): print("Window init") super().__init__(parent) # self.win_event_filter = WinEventFilter("window") # self.installNativeEventFilter(self.win_event_filter) self.app = app self.window_size = QtCore.QSize(400, 250) self.window_size_offset = QtCore.QSize(0, 150) self.window_position = QtCore.QPoint(0, 0) self.window_position_offset = QtCore.QPoint(0, 0) # self.setWindowFlags( # QtCore.Qt.Window | # QtCore.Qt.CustomizeWindowHint | # QtCore.Qt.WindowTitleHint | # QtCore.Qt.WindowCloseButtonHint | # QtCore.Qt.WindowStaysOnTopHint # ) self.setWindowFlags(self.windowFlags() | QtCore.Qt.FramelessWindowHint) self.setWindowFlags(self.windowFlags() | QtCore.Qt.WindowStaysOnTopHint) self.setWindowFlags( QtCore.Qt.FramelessWindowHint | QtCore.Qt.WindowStaysOnTopHint | QtCore.Qt.Tool) # hlayout = QHBoxLayout() # hlayout.setMargin(0) # hlayout.setContentsMargins(0, 0, 0, 0) # hlayout.setSpacing(0) # buttonslayout = QVBoxLayout() self.labels = [] self.menuButton = QPushButton(u"\U00002261") self.menuLabel = QLabel("Menu") myFontBold = self.menuLabel.font() myFontBold.setBold(True) # buttons myFont = self.menuButton.font() myFont2 = self.menuButton.font() if (myFont.pointSize() > 0): myFont.setPointSizeF(1.25 * myFont.pointSizeF()) myFont2.setPointSizeF(1.4 * myFont.pointSizeF()) else: myFont.setPixelSize(1.25 * myFont.pixelSize()) myFont2.setPixelSize(1.4 * myFont.pixelSize()) self.menuLabel.setFont(myFontBold) width = self.menuButton.fontMetrics().boundingRect("OO").width() + 7 height = width # okButton.height() self.menuButton.setFont(myFont2) self.menuButton.setMaximumWidth(width) self.menuButton.setMinimumWidth(width) self.menuButton.setFlat(True) self.menuButton.clicked.connect(self.menuPressed) mainButton = QPushButton(u"\U0000239A") mainLabel = QLabel("Main") width = mainButton.fontMetrics().boundingRect("OO").width() + 7 height = width # okButton.height() mainButton.setFont(myFont2) mainButton.setMaximumWidth(width) mainButton.setMinimumWidth(width) mainButton.clicked.connect(self.main) mainButton.setFlat(True) setupButton = QPushButton(u"\U0001F527") setupLabel = QLabel("Setup") setupButton.setFont(myFont) setupButton.setFlat(True) setupButton.setMaximumWidth(width) setupButton.setMinimumWidth(width) setupButton.clicked.connect(self.setup) identifyButton = QPushButton(u"\U00002755") identifyLabel = QLabel("Identify") identifyButton.setFont(myFont) identifyButton.setFlat(True) identifyButton.setMaximumWidth(width) identifyButton.setMinimumWidth(width) identifyButton.clicked.connect(self.identify) self.refreshButton = QPushButton(u"\U000021BB") self.refreshLabel = QLabel("Detect") self.refreshButton.setFont(myFont) self.refreshButton.setFlat(True) self.refreshButton.setMaximumWidth(width) self.refreshButton.setMinimumWidth(width) self.refreshButton.clicked.connect(self.refreshPressed) aboutButton = QPushButton(u"\U00002754") aboutLabel = QLabel("About") aboutButton.setFont(myFont) aboutButton.setFlat(True) aboutButton.setMaximumWidth(width) aboutButton.setMinimumWidth(width) aboutButton.clicked.connect(self.about) # closeButton = QPushButton(u"\U00002573") closeButton = QPushButton(u"\U000026CC") closeLabel = QLabel("Close") closeButton.setFont(myFont) closeButton.setFlat(True) closeButton.setMaximumWidth(width) closeButton.setMinimumWidth(width) closeButton.clicked.connect(self.close_) buttongrid = QGridLayout() buttongrid.addWidget(self.menuButton, 0, 0) buttongrid.addWidget(mainButton, 1, 0) buttongrid.addWidget(setupButton, 2, 0) buttongrid.addWidget(self.refreshButton, 3, 0) buttongrid.addWidget(identifyButton, 4, 0) buttongrid.addWidget(aboutButton, 6, 0) buttongrid.addWidget(closeButton, 7, 0) buttongrid.addWidget(self.menuLabel, 0, 1) buttongrid.addWidget(mainLabel, 1, 1) buttongrid.addWidget(setupLabel, 2, 1) buttongrid.addWidget(self.refreshLabel, 3, 1) buttongrid.addWidget(identifyLabel, 4, 1) buttongrid.addWidget(aboutLabel, 6, 1) buttongrid.addWidget(closeLabel, 7, 1) self.labels.append(self.menuLabel) self.labels.append(mainLabel) self.labels.append(setupLabel) self.labels.append(self.refreshLabel) self.labels.append(identifyLabel) self.labels.append(aboutLabel) self.labels.append(closeLabel) self.menuLabel .mousePressEvent = self.menuLabelPressed mainLabel .mousePressEvent = self.mainLabel setupLabel.mousePressEvent = self.setupLabel self.refreshLabel.mousePressEvent = self.refreshLabelPressed identifyLabel.mousePressEvent = self.identifyLabel aboutLabel.mousePressEvent = self.aboutLabel closeLabel.mousePressEvent = self.closeLabel buttongrid.setRowStretch(0, 0) buttongrid.setRowStretch(1, 0) buttongrid.setRowStretch(2, 0) buttongrid.setRowStretch(3, 0) buttongrid.setRowStretch(4, 0) buttongrid.setRowStretch(5, 1) buttongrid.setRowStretch(6, 0) buttongrid.setRowStretch(7, 0) self.labels_set_visible(False) self.layout = QHBoxLayout() # buttonslayout.addWidget(mainButton) # buttonslayout.addWidget(setupButton) # buttonslayout.addStretch(1) # buttonslayout.addWidget(aboutButton) # hlayout.addLayout(buttonslayout) # hlayout.addLayout(buttongrid) # grid.addLayout(hlayout, 1, 1) buttongrid.setSpacing(0) self.layout.addLayout(buttongrid) self.body_layout = QVBoxLayout() self.body_layout.setContentsMargins(0, 0, 0, 1) self.body_layout.setSpacing(0) self.title_layout = QHBoxLayout() self.title_layout.setContentsMargins(0, 0, 0, 0) self.title_layout.setSpacing(0) self.titleLabel = QLabel("Monitor Control") self.titleLabel.setWordWrap(True) self.titleLabel.setSizeIncrement(10, 10) myFont = self.titleLabel.font() myFont.setBold(True) self.titleLabel.setFont(myFont) width = self.titleLabel.fontMetrics().boundingRect("OO").width() + 7 height = width # okButton.height() self.titleLabel.mousePressEvent = self.mainLabel self.backButton = QPushButton(u"\U00002190", self) myFont = self.backButton.font() myFont.setBold(True) self.backButton.setFont(myFont) self.backButton.setMaximumWidth(width) self.backButton.setMinimumWidth(width) self.backButton.setFlat(True) self.backButton.clicked.connect(self.main) self.titleLabel.setMinimumHeight(self.backButton.height()) self.title_layout.addWidget(self.backButton, 0, QtCore.Qt.AlignVCenter) self.title_layout.addSpacing(20) self.title_layout.addWidget(self.titleLabel, 1, QtCore.Qt.AlignVCenter) # self.backButton.setAlignment(Qt.AlignTop) self.title_layout.setAlignment(QtCore.Qt.AlignTop) self.body_layout.addLayout(self.title_layout) self.main_frame = QtWidgets.QFrame(self) self.main_layout = QVBoxLayout() self.feature_brightness = FeatureWidget( self.main_frame, "Brightness", self.app.brightness) self.feature_contrast = FeatureWidget( self.main_frame, "Contrast", self.app.contrast) self.main_layout.addWidget(self.feature_brightness) self.main_layout.addWidget(self.feature_contrast) self.main_layout.addStretch(1) self.main_frame.setLayout(self.main_layout) self.main_frame.hide() self.body_layout.addWidget(self.main_frame, 1) self.setup_frame = QtWidgets.QFrame(self) leftButton = QPushButton("<", self.setup_frame) width = leftButton.fontMetrics().boundingRect("<").width() + 7 leftButton.setFlat(True) leftButton.setMaximumWidth(width) leftButton.setMinimumWidth(width) leftButton.setSizePolicy(QtWidgets.QSizePolicy( QSizePolicy.Fixed, QSizePolicy.Expanding)) self.setup_layout = QHBoxLayout() self.setup_layout.addWidget(leftButton) self.feature_setup_widget = FeatureSetupWidget( self.app, self.setup_frame) # hlayout.addWidget(self.feature_setup_widget, 1) self.feature_setup_widget.setSizePolicy( QSizePolicy.Expanding, QSizePolicy.Expanding) rightButton = QPushButton(">", self.setup_frame) rightButton.setFlat(True) rightButton.setMaximumWidth(width) rightButton.setMinimumWidth(width) rightButton.setSizePolicy(QtWidgets.QSizePolicy( QSizePolicy.Fixed, QSizePolicy.Expanding)) self.setup_layout.addWidget(self.feature_setup_widget, 1) self.setup_layout.addWidget(rightButton) self.setup_layout.setContentsMargins(0, 0, 0, 0) self.setup_layout.setSpacing(0) leftButton.clicked.connect(self.feature_setup_widget.previous) rightButton.clicked.connect(self.feature_setup_widget.next) self.setup_frame.setLayout(self.setup_layout) # self.layout.setContentsMargins(0, 0, 0, 0) self.layout.setSpacing(10) self.body_layout.addWidget(self.setup_frame, 1) self.layout.addLayout(self.body_layout, 1) self.about_frame = QtWidgets.QFrame(self) self.about_layout = QVBoxLayout() self.aboutLabel1 = QLabel("About", self.about_frame) self.aboutLabel1.setWordWrap(True) myFont = self.aboutLabel1.font() myFont.setBold(True) self.aboutLabel1.setFont(myFont) about = "©️ ™️ Juno\n\nMonitor Control synchronizes your monitor hardware properties like brightness and contrast.\nThese properties can be changed by the software sliders, or monitor buttons. These changes are monitored and read, and subsequently set to the other monitors using a calibration. This will ensure an input change has the same result on all monitors.\n" self.aboutLabel2 = QLabel("{}".format(about), self.about_frame) self.aboutLabel2.setAlignment( QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop) self.aboutLabel2.setWordWrap(True) self.about_layout.addWidget(self.aboutLabel1) self.about_layout.addWidget(self.aboutLabel2, 1) self.about_frame.setLayout(self.about_layout) self.about_frame.hide() self.body_layout.addWidget(self.about_frame, 1) # self.layout.setSizeConstraint(QtGui.QLayout.setFixedSize) self.setLayout(self.layout) self.setWindowIcon(QtGui.QIcon('artifacts/icon.png')) # set the title self.setWindowTitle("Monitors Control") self.main() self.setFixedSize(400, 250) def labels_set_visible(self, visible): for label in self.labels: if (self.refreshLabel == label) and visible: self.refreshLabel.setVisible(self.refreshButton.isVisible()) else: label.setVisible(visible) def refresh_visible(self, visible): if (visible): self.refreshButton.setVisible(visible) self.refreshLabel.setVisible(self.menuLabel.isVisible()) else: self.refreshLabel.setVisible(visible) self.refreshButton.setVisible(visible) def focusOutEvent(self, event): print('Lost focus') def menuLabelPressed(self, event): self.menuPressed() def menuPressed(self): print("Menu") self.labels_set_visible(not self.labels[0].isVisible()) def aboutLabel(self, event): self.about() def about(self): print("About") self.setupUpdate() self.setMinimumSize(200, 130) # self.feature_setup_widget.hide() self.setup_frame.hide() self.main_frame.hide() self.refresh_visible(False) self.backButton.show() self.about_frame.show() self.move(self.window_position) self.setFixedSize(self.window_size) def closeLabel(self, event): self.close_() def close_(self): print("Close {}".format(len(self.app.identifyWindows))) self.setupUpdate() if (len(self.app.identifyWindows) == 0): self.hide() def setupLabel(self, event): self.setup() def setup(self): print("Setup") self.move(self.window_position + self.window_position_offset) self.setFixedSize(self.window_size + self.window_size_offset) self.app.monitors._calibrations.loadYaml() self.feature_setup_widget.init() self.backButton.show() self.main_frame.hide() self.about_frame.hide() self.refresh_visible(True) self.setup_frame.show() self.setMinimumSize(200, 130) def setupUpdate(self): if (self.setup_frame.isVisible()): self.app.monitors._calibrations.saveYaml() def mainLabel(self, event): self.main() def main(self): print("Main") self.setMinimumSize(200, 130) self.setupUpdate() self.refresh_visible(False) self.backButton.hide() # self.feature_setup_widget.hide() self.setup_frame.hide() self.about_frame.hide() self.main_frame.hide() self.move(self.window_position) self.setFixedSize(self.window_size) self.main_frame.show() def identifyLabel(self, event): self.identify() def identify(self): print("Identify") self.app.identify() def refreshLabelPressed(self, event): self.refreshPressed() def refreshPressed(self): QApplication.setOverrideCursor(QtCore.Qt.WaitCursor) print("detect") self.feature_setup_widget.clear() self.app.detect() self.setup() self.feature_setup_widget.set_infos(self.app.monitors) self.feature_setup_widget.init() self.app.list_monitors() QApplication.restoreOverrideCursor() def position_show(self): print("position_show") self.app.position_next_to_tray() self.main() self.show() # self.requestActivate() # QtCore.Qt.ActiveWindowFocusReason self.activateWindow() self.setFocus(QtCore.Qt.PopupFocusReason) def contrast(self, value): # from gui self.app.contrast(value) def brightness(self, value): # from gui self.app.brightness(value) def set_contrast(self, value): # to gui self.feature_contrast.set_value(value) self.feature_setup_widget.set_contrast(value) def set_brightness(self, value): # to gui self.feature_brightness.set_value(value) self.feature_setup_widget.set_brightness(value) def show(self): # to gui value = self.app.monitors.get_contrast() if (value is not None): self.set_contrast(value) value = self.app.monitors.get_brightness() if (value is not None): self.set_brightness(value) self.feature_setup_widget.set_infos(self.app.monitors) super().show()