def testSignals(self): QgsProject.instance().clear() m = QgsMapLayerComboBox() l1 = QgsVectorLayer( "Point?crs=EPSG:3111&field=fldtxt:string&field=fldint:integer", 'layer 1', "memory") QgsProject.instance().addMapLayer(l1) l2 = QgsVectorLayer( "Polygon?crs=EPSG:3111&field=fldtxt:string&field=fldint:integer", 'lAyEr 2', "memory") QgsProject.instance().addMapLayer(l2) spy = QSignalSpy(m.layerChanged) m.setLayer(l2) self.assertEqual(len(spy), 1) self.assertEqual(m.currentLayer(), l2) m.setLayer(l1) self.assertEqual(len(spy), 2) self.assertEqual(m.currentLayer(), l1) # no signal if same layer m.setLayer(l1) self.assertEqual(len(spy), 2) m.setAllowEmptyLayer(True) m.setLayer(None) self.assertEqual(len(spy), 3) self.assertIsNone(m.currentLayer()) self.assertFalse(m.currentText()) m.setLayer(None) self.assertEqual(len(spy), 3) self.assertIsNone(m.currentLayer()) m.setEditable(True) m.setCurrentText('aaa') self.assertIsNone(m.currentLayer()) m.setLayer(l1) self.assertEqual(len(spy), 4) self.assertEqual(m.currentLayer(), l1)
class Dialog(QtGui.QDialog): def __init__(self, curPointLayerName, curPolygonLayerName, curFiledName, parent=None): QtGui.QDialog.__init__(self, parent) self.resize(300, 100) Plugin().plPrint("curPointLayerName:: %s" % curPointLayerName) Plugin().plPrint("curPolygonLayerName:: %s" % curPolygonLayerName) Plugin().plPrint("curFiledName:: %s" % curFiledName) self.setWindowTitle(Plugin().getPluginName()) self.__mainLayout = QtGui.QVBoxLayout(self) self.__layout = QtGui.QGridLayout(self) # self.__layout.addWidget(QtGui.QLabel(self.tr("Point layer name") + ":"), 0, 0) l1 = QtGui.QLabel(u"Имя точечного слоя" + ":") l1.setSizePolicy( QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed ) self.__layout.addWidget(l1, 0, 0) self.pointsLayersComboBox = QgsMapLayerComboBox() self.pointsLayersComboBox.setSizePolicy( QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed ) self.pointsLayersComboBox.setFilters(QgsMapLayerProxyModel.PointLayer) self.pointsLayersComboBox.setEditable(True) self.pointsLayersComboBox.setEditText(curPointLayerName) self.pointsLayersComboBox.layerChanged.connect(self.layerChooze1) self.__layout.addWidget(self.pointsLayersComboBox, 0, 1) # self.__layout.addWidget(QtGui.QLabel(self.tr("Field name") + ":"), 2, 0) self.__layout.addWidget(QtGui.QLabel(u"Имя поля" + ":"), 2, 0) self.fieldName = QgsFieldComboBox() self.fieldName.setFilters(QgsFieldProxyModel.Int) self.fieldName.setEditable(True) self.fieldName.setEditText(curFiledName) self.fieldName.fieldChanged.connect(self.filedChooze) self.__layout.addWidget(self.fieldName, 2, 1) # self.__layout.addWidget(QtGui.QLabel(self.tr("Polypon layer name") + ":"), 1, 0) self.__layout.addWidget(QtGui.QLabel(u"Имя полигонального слоя" + ":"), 1, 0) self.polygonsLayersComboBox = QgsMapLayerComboBox() self.polygonsLayersComboBox.setFilters(QgsMapLayerProxyModel.PolygonLayer) self.polygonsLayersComboBox.setEditable(True) self.polygonsLayersComboBox.setEditText(curPolygonLayerName) self.polygonsLayersComboBox.layerChanged.connect(self.layerChooze2) self.polygonsLayersComboBox.layerChanged.connect(self.fieldName.setLayer) self.__layout.addWidget(self.polygonsLayersComboBox, 1, 1) # self.startButton = QtGui.QPushButton(self.tr("Start")) # self.startButton.clicked.connect(self.startCalculation) # self.__layout.addWidget(self.startButton, 3, 1) self.__mainLayout.addLayout(self.__layout) # self.progress = QtGui.QLabel() # self.__mainLayout.addWidget(self.progress) self.__bbox = QtGui.QDialogButtonBox(QtGui.QDialogButtonBox.Ok) self.__bbox.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed) self.__bbox.accepted.connect(self.accept) self.__mainLayout.addWidget(self.__bbox) def layerChooze1(self, qgsMapLayer): self.pointsLayersComboBox.setEditText(qgsMapLayer.name()) def layerChooze2(self, qgsMapLayer): self.polygonsLayersComboBox.setEditText(qgsMapLayer.name()) def filedChooze(self, fieldName): self.sender().setEditText(fieldName) # def layernameSave(self, csTargetLayerName): # if csTargetLayerName == u"": # return # setCSLayerName(csTargetLayerName) def getSettings(self): return [ self.pointsLayersComboBox.currentText(), self.polygonsLayersComboBox.currentText(), self.fieldName.currentText() ]
class NewProjectDialog(Dialog): ''' dialog to select a layer and a name as inputs for creating a new project ''' def setupUi(self): ''' set up the user interface ''' self.setMinimumWidth(500) self.setWindowTitle('Neues Projekt erstellen') project_manager = ProjectManager() self.project_names = [p.name for p in project_manager.projects] layout = QVBoxLayout(self) label = QLabel('Name des Projekts') self.name_edit = QLineEdit() self.name_edit.textChanged.connect(self.validate) layout.addWidget(label) layout.addWidget(self.name_edit) self.path = os.path.join(project_manager.settings.TEMPLATE_PATH, 'projektflaechen') hlayout = QHBoxLayout(self) label = QLabel('Import der (Teil-)Flächen des Plangebiets') self.layer_combo = QgsMapLayerComboBox() self.layer_combo.setFilters(QgsMapLayerProxyModel.VectorLayer) self.source = None self.layer_combo.layerChanged.connect(self.set_layer) self.layer_combo.layerChanged.connect(self.validate) browse_button = QPushButton('...') browse_button.clicked.connect(self.browse_path) browse_button.setMaximumWidth(30) hlayout.addWidget(self.layer_combo) hlayout.addWidget(browse_button) layout.addWidget(label) layout.addLayout(hlayout) self.status_label = QLabel() layout.addWidget(self.status_label) spacer = QSpacerItem( 20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding) layout.addItem(spacer) buttons = QDialogButtonBox( QDialogButtonBox.Ok | QDialogButtonBox.Cancel, Qt.Horizontal, self) self.ok_button = buttons.button(QDialogButtonBox.Ok) self.ok_button.setEnabled(False) buttons.accepted.connect(self.accept) buttons.rejected.connect(self.reject) layout.addWidget(buttons) if len(self.layer_combo) > 0: self.set_layer(self.layer_combo.currentLayer()) self.layer_combo.setCurrentIndex(0) def set_layer(self, layer: QgsVectorLayer = None): ''' set layer as user selection Parameters ---------- layer : QgsVectorLayer the selected layer ''' if not layer: path = self.layer_combo.currentText() layer = QgsVectorLayer(path, 'testlayer_shp', 'ogr') self.source = layer self.validate() def browse_path(self): ''' open dialog for user input of path to a shapefile and add it to the layer-combo ''' path, sf = QFileDialog.getOpenFileName( self, 'Datei wählen', filter="Shapefile(*.shp)", directory=self.path) if path: self.path = os.path.split(path)[0] self.layer_combo.setAdditionalItems([str(path)]) self.layer_combo.setCurrentIndex(self.layer_combo.count()-1) self.set_layer() def show(self) -> Tuple[bool, str, QgsVectorLayer]: ''' show dialog and return selections made by user ''' confirmed = self.exec_() if confirmed: return confirmed, self.name_edit.text(), self.source return False, None, None def validate(self): ''' validate current input of name and layer, set the status label according to validation result ''' name = str(self.name_edit.text()) status_text = '' regexp = re.compile('[\\\/\:*?\"\'<>|]') error = False if name and regexp.search(name): status_text = ('Der Projektname darf keines der folgenden Zeichen ' 'enthalten: \/:*?"\'<>|') error = True elif name in self.project_names: status_text = ( f'Ein Projekt mit dem Namen {name} existiert bereits!\n' 'Projektnamen müssen einzigartig sein.') error = True if self.source: if not self.source.isValid(): status_text = 'Der Layer ist ungültig.' error = True elif not self.source.geometryType() == QgsWkbTypes.PolygonGeometry: status_text = 'Der Layer hat keine Polygongeometrie.' error = True self.status_label.setText(status_text) if not error and (name and self.source): self.ok_button.setEnabled(True) else: self.ok_button.setEnabled(False)
class Dialog(QtGui.QDialog): def __init__( self, curPointsLayerFrom, curPointsLayerTo, curFNIdFrom, curFNLink, curFNIdTo, curResultLayerName, parent=None): QtGui.QDialog.__init__(self, parent) self.resize(500, 200) self.setWindowTitle(QgisPlugin().pluginName) self.__mainLayout = QtGui.QVBoxLayout(self) self.__layout = QtGui.QGridLayout(self) l1 = QtGui.QLabel(self.tr(u"Point layer 'FROM'") + ":") l1.setSizePolicy( QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed ) self.__layout.addWidget(l1, 0, 0) self.pointsLayerFrom = QgsMapLayerComboBox() self.pointsLayerFrom.setSizePolicy( QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed ) self.pointsLayerFrom.setFilters(QgsMapLayerProxyModel.PointLayer) self.pointsLayerFrom.setEditable(True) # self.pointsLayerFrom.setEditText(curPointsLayerFrom) self.pointsLayerFrom.layerChanged.connect(self.choozeLayerFrom) self.__layout.addWidget(self.pointsLayerFrom, 0, 1) l2 = QtGui.QLabel(self.tr(u"Point layer 'TO'") + ":") l2.setSizePolicy( QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed ) self.__layout.addWidget(l2, 1, 0) self.pointsLayerTo = QgsMapLayerComboBox() self.pointsLayerTo.setSizePolicy( QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed ) self.pointsLayerTo.setFilters(QgsMapLayerProxyModel.PointLayer) self.pointsLayerTo.setEditable(True) # self.pointsLayerTo.setEditText(curPointsLayerTo) self.pointsLayerTo.layerChanged.connect(self.choozeLayerTo) self.__layout.addWidget(self.pointsLayerTo, 1, 1) self.__layout.addWidget( QtGui.QLabel(self.tr(u"Point 'FROM' id field") + ":"), 2, 0 ) self.fnIdFrom = QgsFieldComboBox() self.fnIdFrom.setFilters(QgsFieldProxyModel.Int | QgsFieldProxyModel.LongLong) self.fnIdFrom.setEditable(True) # self.fnIdFrom.setEditText(curFNIdFrom) self.fnIdFrom.fieldChanged.connect(self.filedChooze) self.__layout.addWidget(self.fnIdFrom, 2, 1) self.__layout.addWidget( QtGui.QLabel(self.tr(u"Link field") + ":"), 3, 0 ) self.fnLink = QgsFieldComboBox() self.fnLink.setFilters(QgsFieldProxyModel.Int | QgsFieldProxyModel.LongLong) self.fnLink.setEditable(True) # self.fnLink.setEditText(curFNLink) self.fnLink.fieldChanged.connect(self.filedChooze) self.__layout.addWidget(self.fnLink, 3, 1) self.__layout.addWidget( QtGui.QLabel(self.tr(u"Point 'TO' id field") + ":"), 4, 0) self.fnIdTo = QgsFieldComboBox() self.fnIdTo.setFilters(QgsFieldProxyModel.Int | QgsFieldProxyModel.LongLong) self.fnIdTo.setEditable(True) # self.fnIdTo.setEditText(curFNIdTo) self.fnIdTo.fieldChanged.connect(self.filedChooze) self.__layout.addWidget(self.fnIdTo, 4, 1) self.__layout.addWidget( QtGui.QLabel(self.tr(u"Save result in layer") + ":"), 5, 0 ) self.linesLayer = QgsMapLayerComboBox() self.linesLayer.setSizePolicy( QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed ) self.linesLayer.setFilters(QgsMapLayerProxyModel.LineLayer) self.linesLayer.setEditable(True) self.linesLayer.layerChanged.connect(self.choozeResultLayer) self.__layout.addWidget(self.linesLayer, 5, 1) # self.__layout4resultFileChoose = QtGui.QHBoxLayout() # self.leResultFilename = QtGui.QLineEdit(curResultFilename) # self.__layout4resultFileChoose.addWidget(self.leResultFilename) # self.pbChooseResultFilename = QtGui.QPushButton(u"Выбрать") # self.pbChooseResultFilename.released.connect(self.chooseResultFilename) # self.__layout4resultFileChoose.addWidget(self.pbChooseResultFilename) # self.__layout.addLayout(self.__layout4resultFileChoose, 6, 0, 2, 0) self.pointsLayerFrom.layerChanged.connect(self.fnIdFrom.setLayer) self.pointsLayerFrom.layerChanged.connect(self.fnLink.setLayer) self.pointsLayerTo.layerChanged.connect(self.fnIdTo.setLayer) self.__mainLayout.addLayout(self.__layout) self.__bbox = QtGui.QDialogButtonBox(QtGui.QDialogButtonBox.Ok) self.__bbox.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed) self.__bbox.accepted.connect(self.accept) self.__mainLayout.addWidget(self.__bbox) self.fillControls( curPointsLayerFrom, curPointsLayerTo, curFNIdFrom, curFNLink, curFNIdTo, curResultLayerName ) def fillControls( self, curPointsLayerFrom, curPointsLayerTo, curFNIdFrom, curFNLink, curFNIdTo, curResultLayerName ): QgisPlugin().plPrint("curPointsLayerFrom: " + curPointsLayerFrom) QgisPlugin().plPrint("curPointsLayerTo: " + curPointsLayerTo) QgisPlugin().plPrint("curFNIdFrom: " + curPointsLayerFrom) QgisPlugin().plPrint("curFNLink: " + curFNIdFrom) QgisPlugin().plPrint("curPointsLayerFrom: " + curFNLink) QgisPlugin().plPrint("curFNIdTo: " + curFNIdTo) QgisPlugin().plPrint("curResultLayerName: " + curResultLayerName) layerFrom = self.getQGISLayer(curPointsLayerFrom) layerTo = self.getQGISLayer(curPointsLayerTo) layerResult = self.getQGISLayer(curResultLayerName, True) if layerFrom is None: self.pointsLayerFrom.setCurrentIndex(-1) self.pointsLayerFrom.setEditText(curPointsLayerFrom) else: self.pointsLayerFrom.setLayer(layerFrom) if layerTo is None: self.pointsLayerTo.setCurrentIndex(-1) self.pointsLayerTo.setEditText(curPointsLayerTo) else: self.pointsLayerTo.setLayer(layerTo) if layerResult is None: self.linesLayer.setCurrentIndex(-1) self.linesLayer.setEditText(curResultLayerName) else: self.linesLayer.setLayer(layerResult) # self.fnIdFrom.clear() # self.fnLink.clear() # self.fnIdTo.clear() # self.fnIdFrom.setField(curFNIdFrom) self.fnIdFrom.setCurrentIndex(-1) self.fnIdFrom.setEditText(curFNIdFrom) # self.fnLink.setField(curFNLink) self.fnLink.setCurrentIndex(-1) self.fnLink.setEditText(curFNLink) # self.fnIdTo.setField(curFNIdTo) self.fnIdTo.setCurrentIndex(-1) self.fnIdTo.setEditText(curFNIdTo) def getQGISLayer(self, layerName, silent=False): if layerName is None: return if layerName == "": return layers = QgsMapLayerRegistry.instance().mapLayersByName(layerName) if len(layers) == 0: if silent is False: QgisPlugin().showMessageForUser( self.tr(u"Layer with name '%s' not found!") % layerName, QgsMessageBar.CRITICAL, 0 ) return None return layers[0] def choozeLayerFrom(self, qgsMapLayer): self.pointsLayerFrom.setEditText(qgsMapLayer.name()) def choozeLayerTo(self, qgsMapLayer): self.pointsLayerTo.setEditText(qgsMapLayer.name()) def choozeResultLayer(self, qgsMapLayer): self.linesLayer.setEditText(qgsMapLayer.name()) def filedChooze(self, fieldName): self.sender().setEditText(fieldName) def chooseResultFilename(self): filename = QtGui.QFileDialog.getSaveFileName( self, self.tr(u"Choose file for save result"), self.curResultFilename # QtCore.QFileInfo(self.curResultFilename).absolutePath() ) self.leResultFilename.setText(filename) def getSettings(self): return [ self.pointsLayerFrom.currentText(), self.pointsLayerTo.currentText(), self.fnIdFrom.currentText(), self.fnLink.currentText(), self.fnIdTo.currentText(), self.linesLayer.currentText(), ]
class AddConnectorsDialog(QtWidgets.QDialog, FORM_CLASS): def __init__(self, iface, project): QtWidgets.QDialog.__init__(self) self.iface = iface self.setupUi(self) self.NewLinks = False self.NewNodes = False self.project = project if project is not None: self.conn = project.conn self.path_to_file = project.path_to_file self._run_layout = QGridLayout() spacer = QSpacerItem(5, 5, QSizePolicy.Expanding, QSizePolicy.Minimum) # Centroid layer frm1 = QHBoxLayout() frm1.addItem(spacer) self.CentroidLayer = QgsMapLayerComboBox() self.CentroidLayer.layerChanged.connect(self.set_fields) clabel = QLabel() clabel.setText("Centroids layer") frm1.addWidget(clabel) frm1.addWidget(self.CentroidLayer) self.CentroidLayer.setMinimumSize(450, 30) wdgt1 = QWidget() wdgt1.setLayout(frm1) self.CentroidField = QgsFieldComboBox() self.CentroidField.setMinimumSize(450, 30) frm2 = QHBoxLayout() frm2.addItem(spacer) flabel = QLabel() flabel.setText("Centroid ID field") frm2.addWidget(flabel) frm2.addWidget(self.CentroidField) wdgt2 = QWidget() wdgt2.setLayout(frm2) self.CentroidLayer.setFilters(QgsMapLayerProxyModel.PointLayer) frm3 = QHBoxLayout() self.IfMaxLength = QCheckBox() self.IfMaxLength.setChecked(True) self.IfMaxLength.setText("Connector maximum length") self.IfMaxLength.toggled.connect(self.allows_distance) frm3.addWidget(self.IfMaxLength) frm3.addItem(spacer) self.MaxLength = QLineEdit() frm3.addWidget(self.MaxLength) frm3.addItem(spacer) lblmeters = QLabel() lblmeters.setText(" meters") frm3.addWidget(lblmeters) frm3.addItem(spacer) lblnmbr = QLabel() lblnmbr.setText("Connectors per centroid") frm3.addWidget(lblnmbr) self.NumberConnectors = QComboBox() for i in range(1, 40): self.NumberConnectors.addItem(str(i)) frm3.addWidget(self.NumberConnectors) wdgt3 = QWidget() wdgt3.setLayout(frm3) layer_frame = QVBoxLayout() layer_frame.addWidget(wdgt1) layer_frame.addWidget(wdgt2) layer_frame.addWidget(wdgt3) lyrfrm = QWidget() lyrfrm.setLayout(layer_frame) # action buttons self.but_process = QPushButton() if self.project is None: self.but_process.setText("Project not loaded") self.but_process.setEnabled(False) else: self.but_process.setText("Run!") self.but_process.clicked.connect(self.run) self.but_cancel = QPushButton() self.but_cancel.setText("Cancel") self.but_cancel.clicked.connect(self.exit_procedure) self.progressbar = QProgressBar() self.progress_label = QLabel() self.progress_label.setText("...") but_frame = QHBoxLayout() but_frame.addWidget(self.progressbar, 1) but_frame.addWidget(self.progress_label, 1) but_frame.addWidget(self.but_cancel, 1) but_frame.addItem(spacer) but_frame.addWidget(self.but_process, 1) self.but_widget = QWidget() self.but_widget.setLayout(but_frame) # Progress bars and messagers self.progress_frame = QVBoxLayout() self.status_bar_files = QProgressBar() self.progress_frame.addWidget(self.status_bar_files) self.status_label_file = QLabel() self.status_label_file.setText("Extracting: ") self.progress_frame.addWidget(self.status_label_file) self.status_bar_chunks = QProgressBar() self.progress_frame.addWidget(self.status_bar_chunks) self.progress_widget = QWidget() self.progress_widget.setLayout(self.progress_frame) self.progress_widget.setVisible(False) self._run_layout.addWidget(lyrfrm) self._run_layout.addWidget(self.but_widget) self._run_layout.addWidget(self.progress_widget) list = QWidget() listLayout = QVBoxLayout() self.list_types = QTableWidget() self.list_types.setMinimumSize(180, 80) lbl = QLabel() lbl.setText("Allowed link types") listLayout.addWidget(lbl) listLayout.addWidget(self.list_types) list.setLayout(listLayout) if self.project is not None: curr = self.conn.cursor() curr.execute( "SELECT DISTINCT link_type FROM links ORDER BY link_type") ltypes = curr.fetchall() self.list_types.setRowCount(len(ltypes)) self.list_types.setColumnCount(1) for i, lt in enumerate(ltypes): self.list_types.setItem(i, 0, QTableWidgetItem(lt[0])) self.list_types.selectAll() allStuff = QWidget() allStuff.setLayout(self._run_layout) allLayout = QHBoxLayout() allLayout.addWidget(allStuff) allLayout.addWidget(list) self.setLayout(allLayout) self.resize(700, 135) # default directory self.path = standard_path() self.set_fields() self.IfMaxLength.setChecked(False) def allows_distance(self): self.MaxLength.setEnabled(False) if self.IfMaxLength.isChecked(): self.MaxLength.setEnabled(True) def run_thread(self): self.worker_thread.ProgressValue.connect( self.progress_value_from_thread) self.worker_thread.ProgressText.connect(self.progress_text_from_thread) self.worker_thread.ProgressMaxValue.connect( self.progress_range_from_thread) self.worker_thread.jobFinished.connect(self.job_finished_from_thread) self.worker_thread.start() self.show() def progress_range_from_thread(self, val): self.progressbar.setRange(0, val) def progress_value_from_thread(self, value): self.progressbar.setValue(value) def progress_text_from_thread(self, value): self.progress_label.setText(value) def set_fields(self): self.CentroidField.setLayer(self.CentroidLayer.currentLayer()) def job_finished_from_thread(self, success): self.but_process.setEnabled(True) if self.worker_thread.error is not None: qgis.utils.iface.messageBar().pushMessage( "Error during procedure: ", self.worker_thread.error, level=Qgis.Warning, duration=6) self.exit_procedure() def run(self): if self.MaxLength.isEnabled(): max_length = float(self.MaxLength.text()) else: max_length = 1000000000000 self.link_types = [] for i in range(self.list_types.rowCount()): if self.list_types.item(i, 0).isSelected(): self.link_types.append(self.list_types.item(i, 0).text()) # If we selected all, we don;t need to filter by it if len(self.link_types) == self.list_types.rowCount(): self.link_types = [] parameters = [ self.project.path_to_file, self.CentroidLayer.currentText(), self.CentroidField.currentText(), max_length, int(self.NumberConnectors.currentText()), self.link_types ] self.but_process.setEnabled(False) self.worker_thread = AddsConnectorsProcedure( qgis.utils.iface.mainWindow(), *parameters) self.run_thread() def exit_procedure(self): self.close()