def test_dirlist_users(self): tabs = self.form.tabs.tabs tabs.setCurrentIndex(USERS_TAB_INDEX) current_tab = tabs.widget(USERS_TAB_INDEX) self.assertEqual(len(Users.users), 1) edits = current_tab.findChildren(QLineEdit) self.assertEqual(len(edits), 2) add_button = current_tab.findChild(QPushButton) self.assertIsNotNone(add_button) self.assertEqual(add_button.text(), "Add") add_button.click() edits = current_tab.findChildren(QLineEdit) self.assertEqual(len(edits), 4) self.assertEqual(edits[0].getValue(), "guest") self.assertEqual(edits[1].getValue(), "guest") QTest.keyClicks(edits[2], "test_user") self.assertEqual(edits[2].getValue(), "test_user") QApplication.sendEvent(edits[2], QEvent(QEvent.FocusOut)) QTest.keyClicks(edits[3], "test_password") self.assertEqual(edits[3].getValue(), "test_password") QApplication.sendEvent(edits[2], QEvent(QEvent.FocusOut)) edits[2].setValue("test_user1") self.assertEqual(edits[2].getValue(), "test_user1") self.assertEqual(len(Users.users), 2)
def test_styles_animated(mocker, main_window): wrapper = main_window.main_view.view_layout.itemAt(0).widget() conversation_scrollarea = wrapper.conversation_view.scroll file_widget = conversation_scrollarea.widget().layout().itemAt(0).widget() download_button = file_widget.download_button file_widget.start_button_animation() expected_image = load_icon("download_file.gif").pixmap(20, 20).toImage() assert download_button.icon().pixmap(20, 20).toImage() == expected_image assert "Source Sans Pro" == download_button.font().family() assert QFont.Bold == download_button.font().weight() assert 13 == download_button.font().pixelSize() assert "#05a6fe" == download_button.palette().color(QPalette.Foreground).name() # assert 'border: none;' for download_button file_widget.eventFilter(download_button, QEvent(QEvent.HoverEnter)) expected_image = load_icon("download_file.gif").pixmap(20, 20).toImage() assert download_button.icon().pixmap(20, 20).toImage() == expected_image assert "#05a6fe" == download_button.palette().color(QPalette.Foreground).name() file_widget.eventFilter(download_button, QEvent(QEvent.HoverLeave)) expected_image = load_icon("download_file.gif").pixmap(20, 20).toImage() assert download_button.icon().pixmap(20, 20).toImage() == expected_image assert "#05a6fe" == download_button.palette().color(QPalette.Foreground).name()
def run(self): while True: ac = async_call_queue.get() if ac == None: break if ac.function == None: continue with async_session_lock: if ac.session_id != async_session_id: continue result = None try: retry_on_exception = ac.retry_on_exception for _ in range(2): try: if ac.arguments == None: result = ac.function() elif isinstance(ac.arguments, tuple): result = ac.function(*ac.arguments) else: result = ac.function(ac.arguments) except: if not retry_on_exception: raise retry_on_exception = False continue break except Exception as e: with async_session_lock: if ac.session_id != async_session_id: continue if ac.debug_exception: logging.exception('Error while doing async call') if ac.error_callback != None: async_event_queue.put((ac, False, e)) QApplication.postEvent(self, QEvent(ASYNC_EVENT)) continue if ac.result_callback != None: with async_session_lock: if ac.session_id != async_session_id: continue async_event_queue.put((ac, True, result)) QApplication.postEvent(self, QEvent(ASYNC_EVENT))
def test_dirlist_scan_paths(self): tabs = self.form.tabs.tabs tabs.setCurrentIndex(LOCAL_SCAN_PATHS_TAB_INDEX) current_tab = tabs.widget(LOCAL_SCAN_PATHS_TAB_INDEX) edits = current_tab.findChildren(QLineEdit) self.assertEqual(len(edits), 1) scan_edit = edits[0] self.assertIsNotNone(scan_edit) logging.debug(scan_edit.text()) add_button = _find_button_by_text(current_tab, "Add") self.assertIsNotNone(add_button) edits = current_tab.findChildren(DirectoryLocal) self.assertEqual(len(edits), 1) add_button.click() edits = current_tab.findChildren(DirectoryLocal) self.assertEqual(len(edits), 2) dir_local: DirectoryLocal = edits[1] temp_path = "/tmp" dir_local.setValue(temp_path) self.assertEqual(dir_local.getValue(), temp_path) QApplication.sendEvent(dir_local, QEvent(QEvent.FocusOut))
def test_note_state_number_of_full_turns_equals_number_of_annotated_events_times_per_turns_in_full_turn( database_fixture, ): state_machine = StateMachine(database=database_fixture) state_machine.document, *_ = pytest.helpers.add_document_and_foreign_keys( database_fixture ) state = state_machine.s6 event_count = 3 # Generate and insert annotated events state_machine.database.bulk_insert( [ AnnotatedEvent( document_id=state.document.document_id, event_begin=0, event_end=1, event_num=i + 1, annotation_done=True, recorded=True, event_type=EventType.distraction_event_type().event_type, ) for i in range(event_count) ] ) sensor_info = state.document.get_related_sensor_info( database=state_machine.database ) # trigger entry with dummy event event = QEvent(QEvent.None_) state.onEntry(event) assert state.full_turn_count == event_count / float(sensor_info.turns_in_full_turn) assert state.dialog.full_turn_count == event_count / float( sensor_info.turns_in_full_turn )
def copyPath(self) -> None: """ Копирование пути до изображения в буфер обмена. """ clipboard = QApplication.clipboard() clipboard.setText(os.path.abspath(self.filename)) QApplication.sendEvent(clipboard, QEvent(QEvent.Clipboard))
def test_log_events(qapp, caplog): obj = EventObject() qapp.postEvent(obj, QEvent(QEvent.User)) qapp.processEvents() records = caplog.records() assert len(records) == 1 assert records[0].msg == 'Event in test_debug.EventObject: User'
def test_are_you_sure_state_opens_dialog_on_entry_and_closes_on_exit(): event = QEvent(QEvent.None_) state = AreYouSureState('foo') state.onEntry(event) assert state.dialog.isVisible() state.onExit(event) assert not state.dialog.isVisible()
def accept(self): location = self.locationField.text() condition = self.conditionField.toPlainText() resources = self.resourcesField.toPlainText() other = self.otherField.toPlainText() team = self.callsignField.text() subjDate = self.dateField.text() subjTime = self.timeField.text() radioLoc = self.radioLocField.toPlainText() # validation: description, location, instructions fields must all be non-blank vText = "" if location == "": vText += "\n'Location' cannot be blank." if condition == "": vText += "\n'Condition' cannot be blank." if resources == "": vText += "\n'Resources Needed' cannot be blank." LOG.debug("vText:" + vText) if vText: inform_user_about_issue( "Please complete the form and try again:\n" + vText, parent=self) return textToAdd = "" existingText = self.parent.messageField.text() if existingText != "": textToAdd = "; " textToAdd += "SUBJECT LOCATED: LOCATION: " + location + "; CONDITION: " + condition + "; RESOURCES NEEDED: " + resources if other != "": textToAdd += "; " + other self.parent.messageField.setText(existingText + textToAdd) self.closeEvent(QEvent(QEvent.Close), True) super(subjectLocatedDialog, self).accept()
def test_notify_2(): ui = QtWidgets.QLineEdit() event = QEvent(QEvent.MouseButtonPress) with mock.patch.object(PyQt5.QtWidgets.QApplication, 'beep', return_value=False): suc = app.notify(obj=ui, event=event) assert suc
def ThreadBackTest(self): try: self.OnBackTest(self.analys.symbol_list, self.analys.trading_day_list, self.analys.trade_fees) except Exception as e: traceback.print_exc() # QApplication.postEvent(self.analysis_panel, QEvent(define.DEF_EVENT_SET_ANALYSIS_PROGRESS_ERROR)) self.log_text = "回测 %s %s 计算发生异常!%s" % (self.analysis, self.analysis_name, e) self.logger.SendMessage("E", 4, self.log_cate, self.log_text, "S")
def OnQuoteFuture(self, msg): # 行情触发 try: str_code = msg.data[0].decode() if str_code == self.contract: self.quote_data = msg.data QApplication.postEvent(self, QEvent(define.DEF_EVENT_TRADER_FUE_CTP_UPDATE_QUOTE)) # postEvent异步,sendEvent同步 except Exception as e: self.log_text = "%s:函数 OnQuoteFuture 异常!%s" % (self.strategy, e) self.logger.SendMessage("E", 4, self.log_cate, self.log_text, "M")
def test_notify_3(): ui = QtWidgets.QLineEdit() event = QEvent(QEvent.MouseMove) with mock.patch.object(PyQt5.QtWidgets.QApplication, 'notify', return_value=False, side_effect=Exception()): suc = app.notify(obj=ui, event=event) assert not suc
def eventFilter(self, obj, e: QEvent): """ 过滤事件 """ if obj == self: if e.type() == QEvent.Hide: # 隐藏按钮组时强行取消按钮的hover状态 e = QEvent(QEvent.Leave) QApplication.sendEvent(self.playButton, e) QApplication.sendEvent(self.addToButton, e) return super().eventFilter(obj, e)
def slotVisibleChanged(self): if self.isVisible(): if self.__bfirstshow: QCoreApplication.postEvent(self, QEvent(QEvent.User + 1)) self.__bfirstshow = False else: self.__windowItem.show() self.setWindowGeometry() else: self.__windowItem.hide()
def tell(self, target, message): # this can run in an arbitrary thread # we'll assume `appendLeft` is thread safe if target in self.actors: self.actors[target].inbox.appendleft(message) else: logger.info("Was asked to add to an actor which does not exist") self.app.postEvent(self, QEvent(1000))
def selectLayers(self, activation, info) -> None: # FIXME[old]: # def activation_changed(self, activation: ActivationEngine, # info: ActivationEngine.Change) -> None: # pylint: disable=invalid-name """The QLayerSelector is interested in network related changes, i.e. changes of the network itself or the current layer. """ LOG.debug("QLayerSelector.activation_changed(%s, %s)", activation, info) # FIXME[design]: The 'network_changed' message can mean that # either the current model has changed or that the list of # models was altered (or both). # FIXME[old]: should be redundant with network.observable_changed if False and info.network_changed: # # Respond to network change # # As we may add/remove QWidgets, we need to make sure that # this method is executed in the main thread event = QEvent(QLayerSelector._UPDATE_NETWORK) event.activation = activation QCoreApplication.postEvent(self, event) return # FIXME[old] if ((info.network_changed or info.layer_changed) and activation is not None): # # Respond to layer change # layerId = activation.layer_id try: layer_index = activation.idForLayer(layerId) except ValueError: print(f"ERROR: {self.__class__.__name__}." "activation_changed(): {error}") layer_index = None if layer_index != self._currentSelected: # unmark the previously active layer if self._currentSelected is not None: oldItem = self._layerButtons[self._currentSelected] self._markButton(oldItem, False) self._currentSelected = layer_index if self._currentSelected is not None: # and mark the new layer newItem = self._layerButtons[self._currentSelected] self._markButton(newItem, True)
def dropEvent(self, event): if event.mimeData().hasText(): event.accept() self.handle(event.mimeData().text()) elif event.mimeData().hasUrls(): event.accept() for url in event.mimeData().urls(): url = str(url) self.handle(url) utils.propagateEvent(self, QEvent(events.COLLAPSE_WINDOW)) QWidget.dropEvent(self, event)
def accept(self): ## self.parent.timer.start(newEntryDialogTimeoutSeconds*1000) # reset the timeout number = self.clueNumberField.text() description = self.descriptionField.toPlainText() location = self.locationField.text() instructions = self.instructionsField.text() team = self.callsignField.text() clueDate = self.dateField.text() clueTime = self.timeField.text() radioLoc = self.radioLocField.toPlainText() # validation: description, location, instructions fields must all be non-blank vText = "" if description == "": vText += "\n'Description' cannot be blank." if location == "": vText += "\n'Location' cannot be blank." if instructions == "": vText += "\n'Instructions' cannot be blank." LOG.debug("vText:" + vText) if vText: inform_user_about_issue( "Please complete the form and try again:\n" + vText, parent=self) return self.parent.clueLogNeedsPrint = True textToAdd = "" existingText = self.parent.messageField.text() if existingText != "": textToAdd = "; " textToAdd += "CLUE#" + number + ": " + description + "; LOCATION: " + location + "; INSTRUCTIONS: " + instructions self.parent.messageField.setText(existingText + textToAdd) # previously, lastClueNumber was saved here - on accept; we need to save it on init instead, so that # multiple concurrent clueDialogs will not have the same clue number! # header_labels=['CLUE#','DESCRIPTION','TEAM','TIME','DATE','OP','LOCATION','INSTRUCTIONS','RADIO LOC.'] clueData = [ number, description, team, clueTime, clueDate, self.parent.parent.opPeriod, location, instructions, radioLoc ] self.parent.parent.clueLog.append(clueData) if self.clueReportPrintCheckBox.isChecked(): self.parent.parent.printClueReport(clueData) LOG.trace("accepted - calling close") self.parent.parent.clueLogDialog.tableView.model().layoutChanged.emit() self.closeEvent(QEvent(QEvent.Close), True) ## pixmap=QPixmap(":/radiolog_ui/print_icon.png") ## self.parent.parent.clueLogDialog.tableView.model().setHeaderData(0,Qt.Vertical,pixmap,Qt.DecorationRole) ## self.parent.parent.clueLogDialog.tableView.model().setHeaderData(1,Qt.Vertical,pixmap,Qt.DecorationRole) ## self.parent.parent.clueLogDialog.tableView.model().headerDataChanged.emit(Qt.Vertical,0,1) ## # don't try self.close() here - it can cause the dialog to never close! Instead use super().accept() super(clueDialog, self).accept()
class CallEvent(QEvent): """An event containing a request for a function call.""" EVENT_TYPE = QEvent(QEvent.registerEventType()) def __init__(self, queue, exceptions_in_main, fn, *args, **kwargs): QEvent.__init__(self, self.EVENT_TYPE) self.fn = fn self.args = args self.kwargs = kwargs self._returnval = queue # Whether to raise exceptions in the main thread or store them # for raising in the calling thread: self._exceptions_in_main = exceptions_in_main
def SendMessage(self, log_kind, log_class, log_cate, log_info, log_show = ""): # 自身的日志就不保存到数据库了 if log_kind == "D" or log_kind == "I" or log_kind == "H" or log_kind == "W": self.logger.debug("%s %d <%s> - %s" % (log_kind, log_class, log_cate, log_info)) elif log_kind == "S" or log_kind == "E" or log_kind == "F": self.logger.error("%s %d <%s> - %s" % (log_kind, log_class, log_cate, log_info)) log_item = LogInfo(log_kind, log_class, log_cate, log_info) self.AddTbData_Logger(log_item) if log_show == define.DEF_LOG_SHOW_TYPE_S and self.log_info_panel_s != None: self.log_info_panel_s.AddLogInfo(log_item) QApplication.postEvent(self.log_info_panel_s, QEvent(define.DEF_EVENT_LOG_INFO_PRINT)) elif log_show == define.DEF_LOG_SHOW_TYPE_T and self.log_info_panel_t != None: self.log_info_panel_t.AddLogInfo(log_item) QApplication.postEvent(self.log_info_panel_t, QEvent(define.DEF_EVENT_LOG_INFO_PRINT)) elif log_show == define.DEF_LOG_SHOW_TYPE_M and self.log_info_panel_m != None: self.log_info_panel_m.AddLogInfo(log_item) QApplication.postEvent(self.log_info_panel_m, QEvent(define.DEF_EVENT_LOG_INFO_PRINT)) elif log_show == define.DEF_LOG_SHOW_TYPE_A and self.log_info_panel_a != None: self.log_info_panel_a.AddLogInfo(log_item) QApplication.postEvent(self.log_info_panel_a, QEvent(define.DEF_EVENT_LOG_INFO_PRINT)) elif log_show == define.DEF_LOG_SHOW_TYPE_SPBSA and self.log_info_panel_spbsa != None: self.log_info_panel_spbsa.AddLogInfo(log_item) QApplication.postEvent(self.log_info_panel_spbsa, QEvent(define.DEF_EVENT_LOG_INFO_PRINT))
def onDelete(self): """ After confirming the delete action, removes the item from the settings file. """ reply = QMessageBox.question( self, "Message", "Are you sure you want to delete this action?", QMessageBox.Yes, QMessageBox.No, ) if reply == QMessageBox.Yes: settings.removeItem(self.index) utils.propagateEvent(self, QEvent(events.RELOAD_WIDGETS))
def fsFilterConfirm(self): if not ask_user_to_confirm( "Filter (ignore) future incoming messages\n from this FleetSync device?", icon=ICON_WARN, parent=self): self.close() return self.parent.parent.fsFilterEdit(self.fleet, self.device, True) self.close() # also close the related new entry dialog if its message field is blank, in the same manner as autoCleanup if self.parent.messageField.text() == "": self.parent.closeEvent(QEvent(QEvent.Close), accepted=False, force=True)
def OnQuoteStock(self, msg): # 行情触发 try: str_code = msg.data[0].decode() if str_code == self.symbol: if "60" == str_code[0:2] or "000" == str_code[ 0:3] or "001" == str_code[0:3] or "002" == str_code[ 0:3] or "300" == str_code[0:3]: self.quote_data = msg.data QApplication.postEvent( self, QEvent(define.DEF_EVENT_TRADER_STK_APE_UPDATE_QUOTE )) # postEvent异步,sendEvent同步 except Exception as e: self.log_text = "%s:函数 OnQuoteStock 异常!%s" % (self.strategy, e) self.logger.SendMessage("E", 4, self.log_cate, self.log_text, "M")
def __updateView(self, view: QGraphicsView, rect: QRectF) -> None: view.setSceneRect(rect) view.setFixedHeight(int(math.ceil(rect.height()))) container = view.parent() if rect.isEmpty(): container.setVisible(False) return # map the rect to (main) viewport coordinates viewrect = self.mapFromScene(rect).boundingRect() viewportrect = self.viewport().rect() visible = not (viewrect.top() >= viewportrect.top() and viewrect.bottom() <= viewportrect.bottom()) container.setVisible(visible) # force immediate layout of the container overlay QCoreApplication.sendEvent(container, QEvent(QEvent.LayoutRequest))
def onEdit(self): """ Opens and executes the edit form, which allows the user to edit the selected DropTarget """ item = { "index": self.index, "type": self.type, "name": self.name, "path": self.filepath, "icon": self.iconpath, "desc": self.desc, } form = EditItemForm(item, self) form.setModal(True) form.exec_() utils.propagateEvent(self, QEvent(events.RELOAD_WIDGETS))
def closeSecondaryEvent(self, event): """Close the main window. """ document = self.current_document() if document.isModifiedStrict(): if self.ask_save_changes() == QDialog.Rejected: # Reject the event event.ignore() return old_scheme = document.scheme() # Set an empty scheme to clear the document document.setScheme(config.workflow_constructor(parent=self)) QApplication.sendEvent(old_scheme, QEvent(QEvent.Close)) old_scheme.deleteLater() config.save_config() geometry = self.saveGeometry() state = self.saveState(version=self.SETTINGS_VERSION) settings = QSettings() settings.beginGroup("mainwindow") settings.setValue("geometry", geometry) settings.setValue("state", state) settings.setValue("canvasdock/expanded", self.dock_widget.expanded()) settings.setValue("scheme-margins-enabled", self.scheme_margins_enabled) settings.setValue("last-scheme-dir", self.last_scheme_dir) settings.setValue("widgettoolbox/state", self.widgets_tool_box.saveState()) settings.setValue("quick-help/visible", self.canvas_tool_dock.quickHelpVisible()) settings.endGroup() event.accept()
def test_event_detection_state_default_region_count_equals_turns_in_full_turn( database_fixture, ): state_machine = StateMachine(database=database_fixture) state_machine.document, *_ = pytest.helpers.add_document_and_foreign_keys( database_fixture ) state = state_machine.s3 sensor_info = state.document.get_related_sensor_info( database=state_machine.database ) # generate and enter data n = 10 state.document.insert_time_series( state_machine.database, list(range(n)), list(range(n)) ) # trigger entry with dummy event event = QEvent(QEvent.None_) state.onEntry(event) app.processEvents() assert state.region_count() == int(sensor_info.turns_in_full_turn)
def onCreateFileAction(self): """ Create a new FileTarget. """ context, _filter = QFileDialog.getOpenFileName(self, "Open file", expanduser("~")) context = str(context) if not context: return 1, "Missing argument" logging.info("Create file target: %s", context) name = os.path.basename(context) name, ok = QInputDialog.getText( self, "Enter the name for the new action", "Action name:", QLineEdit.Normal, name, ) if ok and name: if not isfile(context): QMessageBox.critical(self, "Error", "Target action must be a local file.", QMessageBox.Ok) return 1, "Target action must be a local file" icon_filepath, _filter = QFileDialog.getOpenFileName( self, "Choose Icon", config.ASSETS_DIR) if not icon_filepath: icon_filepath = join(config.ASSETS_DIR, "downloads.png") settings.pushItem({ "type": "file", "name": name, "desc": name, "path": context, "icon": icon_filepath, }) utils.propagateEvent(self, QEvent(events.RELOAD_WIDGETS)) return 0, context
def mousePressEvent(self, event): if event.button() == Qt.LeftButton: self.dragPosition = event.globalPos() - self.frameGeometry( ).topLeft() QtWidgets.QApplication.postEvent(self, QEvent(174)) event.accept()