def get_iface(): """ Will return a mock QgisInterface object with some methods implemented in a generic way. You can further control its behavior by using the mock infrastructure. Refer to https://docs.python.org/3/library/unittest.mock.html for more details. Returns ------- QgisInterface A mock QgisInterface """ start_app() my_iface = mock.Mock(spec=QgisInterface) my_iface.mainWindow.return_value = QMainWindow() canvas = QgsMapCanvas(my_iface.mainWindow()) canvas.resize(QSize(400, 400)) my_iface.mapCanvas.return_value = canvas return my_iface
def qgis_app(): """Start a QGIS application and get the iface. Mostly inspired by https://github.com/qgis/QGIS/blob/release-2_18/python/testing/mocked.py The application is returned as first argument. The QgisInterface is returned as second argument. The parent can be accessed by iface.mainWindow() The canvas can be access by iface.mapCanvas() You can further control its behavior by using the mock infrastructure. Refer to https://docs.python.org/3/library/unittest.mock.html for more details. :return: The QGIS interface. :rtype: QgisInterface """ from qgis.utils import iface if iface: # We are already in QGIS. # I don't know if I can get the current QApplication. # But I guess we shouldn't use it too much. return None, iface # We are not in QGIS, we need to start an app. application = start_app() my_iface = mock.Mock(spec=QgisInterface) my_iface.mainWindow.return_value = QMainWindow() canvas = QgsMapCanvas(my_iface.mainWindow()) canvas.resize(QSize(400, 400)) my_iface.mapCanvas.return_value = canvas return application, my_iface
def make_iface_canvas(): my_iface = mock.Mock(spec=QgisInterface) my_iface.mainWindow.return_value = QMainWindow() # canvas = QgsMapCanvas(my_iface.mainWindow()) canvas = MyCanvas() canvas.setDestinationCrs(QgsCoordinateReferenceSystem(4326)) canvas.setFrameStyle(0) canvas.resize(400, 400) my_iface.mapCanvas.return_value = canvas return my_iface
def make_iface_canvas(test_async): my_iface = mock.Mock(spec=QgisInterface) my_iface.mainWindow.return_value = QMainWindow() canvas = MyCanvas() canvas.setDestinationCrs(QgsCoordinateReferenceSystem(4326)) canvas.setFrameStyle(0) canvas.resize(400, 400) canvas.closed.connect(test_async._stop_async) my_iface.mapCanvas.return_value = canvas return my_iface
# QDockWidget split position "jumps" when QMainWindow resized # # Comment: # # When I encountered this bug it seemed that anything which sets QDockAreaLayoutItem::KeepSize # avoided the error. This includes things like undocking and re-docking widgets. # # My own terribly hacky workaround was thus: # # QByteArray temp = saveState(); # restoreState(temp); # # since restoreState sets the flag. # win = QMainWindow() temp = win.saveState() # Añadido para evitar bug canvas = QgsMapCanvas() project = QgsProject.instance() root = project.layerTreeRoot() bridge = QgsLayerTreeMapCanvasBridge(root, canvas) win.setCentralWidget(canvas) boton = QPushButton('Botón de prueba') dw = QDockWidget("Dock Widget de prueba ", win) dw.setWidget(boton) win.addDockWidget(Qt.LeftDockWidgetArea, dw)
def qgis_app(request): """ Creates a QGIS application, a QGIS Interface, a QGIS Settings and a set of loaded plugins. The fixture can be parametrized with the following options: - plugin_names: Plugin names to load - plugin_paths: Directories where the plugins are located - locale: Language code with the translation that the plugin has to be loaded :param request: Fixture request. It contains the indirect parameters for fixture setup :type request: FixtureRequest :return: The QGIS application objects :rtype: (QgsApplication, QgisInterface, QgsSettings, (list of object) or None) """ # Collect parameters plugin_names = request.param[ 'plugin_names'] if 'plugin_names' in request.param else None plugin_paths = request.param['plugin_paths'] if 'plugin_paths' in request.param \ else [str(Path(__file__).parent.parent.parent) + '/src'] locale = request.param['locale'] if 'locale' in request.param else 'EN' # Create a QGIS Application # noinspection PyTypeChecker QgsApplication.setPrefixPath('/usr', True) qgs = QgsApplication([], True) qgs.initQgis() # Mock the QGIS Interface iface = unittest.mock.Mock(spec=QgisInterface) main_window = QMainWindow() iface.mainWindow.return_value = main_window canvas = QgsMapCanvas(main_window) canvas.resize(QSize(400, 400)) iface.mapCanvas.return_value = canvas # Create the settings global_settings = QSettings() global_settings.setValue('locale/userLocale', locale) qgs_settings = QgsSettings() qgs_settings_file = qgs_settings.fileName() menu = QMenuBar() main_window.setMenuBar(menu) qgis.utils.iface = iface for plugin_path in plugin_paths: sys.path.insert(0, plugin_path) qgis.utils.plugin_paths.append(plugin_path) qgis.utils.updateAvailablePlugins() if plugin_names is not None: plugins = list() if isinstance(plugin_names, str): plugin_names = [plugin_names] for plugin_name in plugin_names: assert qgis.utils.loadPlugin(plugin_name) assert qgis.utils.startPlugin(plugin_name) plugins.append(qgis.utils.plugins[plugin_name]) yield qgs, iface, qgs_settings, plugins for plugin_name in plugin_names: qgis.utils.unloadPlugin(plugin_name) del qgis.utils.plugin_times[plugin_name] if plugin_paths is not None: for plugin_path in plugin_paths: sys.path.remove(plugin_path) qgis.utils.plugin_paths.remove(plugin_path) qgis.utils.updateAvailablePlugins() else: yield qgs, iface, qgs_settings, None os.remove(qgs_settings_file) del qgs
bridge = QgsLayerTreeMapCanvasBridge(root, canvas) # llegim un projecte de demo project.read(projecteInicial) # Instanciem la classe QvUbicacions ubicacions = QvUbicacions(canvas) """ Amb aquesta linia: ubicacions.show() es veuria el widget suelto, separat del canvas. Les següents línies mostren com integrar el widget 'ubicacions' com a dockWidget. """ windowTest = QMainWindow() # Posem el canvas com a element central windowTest.setCentralWidget(canvas) # Creem un dockWdget i definim les característiques dwUbicacions = QDockWidget("Ubicacions", windowTest) dwUbicacions.setContextMenuPolicy(Qt.PreventContextMenu) dwUbicacions.setAllowedAreas(Qt.RightDockWidgetArea | Qt.LeftDockWidgetArea) dwUbicacions.setContentsMargins(1, 1, 1, 1) # Afegim el widget ubicacions al dockWidget dwUbicacions.setWidget(ubicacions) # Coloquem el dockWidget al costat esquerra de la finestra