Виджет для отображения координат

Вопросы по свободной ГИС QGIS. Сообщения об ошибках, предложения по улучшению, локализация.
Ответить
real673
Интересующийся
Сообщения: 33
Зарегистрирован: 06 фев 2012, 21:54
Репутация: 0

Виджет для отображения координат

Сообщение real673 » 10 фев 2012, 18:26

Помогите разобраться с созданием виджета для отображения коодинат
как это происходит в QGIS

Voltron
Гуру
Сообщения: 2627
Зарегистрирован: 29 мар 2007, 14:12
Репутация: 34
Откуда: Ukraine

Re: Виджет для отображения координат

Сообщение Voltron » 10 фев 2012, 21:39

Начинать надо с описания API QGIS, а именно с класса QgsMapCanvas, т.к. интересуют координаты карты. Смотрим и видим сигнал xyCoordinates(), который делает, то что нужно.

Дальше все просто. Добавляем в приложение виджет(ы) для отображения координат; создаем слот, в котором виджет(ы) будут обновляться; соединяем слот с сигналом xyCoordinates(). Все.

real673
Интересующийся
Сообщения: 33
Зарегистрирован: 06 фев 2012, 21:54
Репутация: 0

Re: Виджет для отображения координат

Сообщение real673 » 10 фев 2012, 22:55

если было все так просто))

Voltron
Гуру
Сообщения: 2627
Зарегистрирован: 29 мар 2007, 14:12
Репутация: 34
Откуда: Ukraine

Re: Виджет для отображения координат

Сообщение Voltron » 11 фев 2012, 10:44

Хм... а в чем сложность? Только что проверил, все работает

real673
Интересующийся
Сообщения: 33
Зарегистрирован: 06 фев 2012, 21:54
Репутация: 0

Re: Виджет для отображения координат

Сообщение real673 » 12 фев 2012, 12:16

А ты можешь скинуть пример.

[Сообщение с мобильного устройства] Изображение

Voltron
Гуру
Сообщения: 2627
Зарегистрирован: 29 мар 2007, 14:12
Репутация: 34
Откуда: Ukraine

Re: Виджет для отображения координат

Сообщение Voltron » 12 фев 2012, 14:01

Пусть mCanvas это виджет карты, тогда в __init__ подключаем сигнал

Код: Выделить всё

self.connect( mCanvas, SIGNAL( "xyCoordinates( QgsPoint )" ), self.showCoords )
В самом простом случае слот будет таким

Код: Выделить всё

  def showCoords( self, p ):
    print p.x(), p.y()

real673
Интересующийся
Сообщения: 33
Зарегистрирован: 06 фев 2012, 21:54
Репутация: 0

Re: Виджет для отображения координат

Сообщение real673 » 12 фев 2012, 15:59

т.е. надо вставить

Код: Выделить всё

self.connect( mCanvas, SIGNAL( "xyCoordinates( QgsPoint )" ), self.showCoords )
и

Код: Выделить всё

def showCoords( self, p ):
    print p.x(), p.y()
в mainwindow.py

но в итоге я получаю
File "mainwindow.py", line 59
self.connect( mCanvas, SIGNAL( "xyCoordinates( QgsPoint )" ), self.showCoords )
^
IndentationError: unexpected indent
Последний раз редактировалось Voltron 12 фев 2012, 16:13, всего редактировалось 1 раз.
Причина: поправил форматирование

Voltron
Гуру
Сообщения: 2627
Зарегистрирован: 29 мар 2007, 14:12
Репутация: 34
Откуда: Ukraine

Re: Виджет для отображения координат

Сообщение Voltron » 12 фев 2012, 16:14

Все правильно. По поводу ошибки — а у вас отступы правильные в коде?

real673
Интересующийся
Сообщения: 33
Зарегистрирован: 06 фев 2012, 21:54
Репутация: 0

Re: Виджет для отображения координат

Сообщение real673 » 12 фев 2012, 16:55

вот отредактированный код

Код: Выделить всё

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.core import *
from qgis.gui import *
import sys, os

# импорт виджета списка слоёв
from legend import Legend
# Мое окно


# Импорт созданного интерфейса
from mainwindow_ui import Ui_MainWindow

# Считываем значение переменной окружения QGISHOME, которая должна указывать на каталог с
# установленным QGIS.
qgis_prefix = os.getenv( "QGISHOME" )


class MainWindow( QMainWindow, Ui_MainWindow ):
  def __init__( self ):
    QMainWindow.__init__( self )
    
    # Требуется Qt4 для инициализации пользовательского интерфейса
    self.setupUi( self )

    # Устанавливаем заголовок окна
    self.setWindowTitle( "GIS DIPLOM" )

    # Создаем карту
    self.canvas = QgsMapCanvas()
    # Задаем цвет фона карты
    self.canvas.setCanvasColor( QColor( 200, 200, 255 ) )
    self.canvas.enableAntiAliasing( True )
    self.canvas.show()

    # Размещаем виджеты в окне
    self.layout = QVBoxLayout( self.frame )
    self.layout.addWidget( self.canvas )

    # Создаём и инициализируем легенду
    self.createLegendWidget()

    # Задаем действия для каждого из инструментов и соединяем их с соответсвующими методами
    self.connect( self.mpActionAddLayer, SIGNAL( "triggered()" ), self.addLayer );
    self.connect( self.mpActionZoomIn, SIGNAL( "triggered()" ), self.zoomIn );
    self.connect( self.mpActionZoomOut, SIGNAL( "triggered()" ), self.zoomOut );
    self.connect( self.mpActionPan, SIGNAL( "triggered()" ), self.pan );
    self.connect( self.mpActionZoomFullExtent, SIGNAL( "triggered()" ), self.zoomFull );
    self.connect( mCanvas, SIGNAL( "xyCoordinates( QgsPoint )" ), self.showCoords )

    # Создаем панель инструментов
    self.toolbar = self.addToolBar( "Map" );
    # Добавляем действия на панель инструментов
    self.toolbar.addAction( self.mpActionAddLayer );
    self.toolbar.addAction( self.mpActionZoomIn );
    self.toolbar.addAction( self.mpActionZoomOut );
    self.toolbar.addAction( self.mpActionPan );
    self.toolbar.addAction( self.mpActionZoomFullExtent );

    # Создаем инструменты карты
    self.toolPan = QgsMapToolPan( self.canvas )
    self.toolPan.setAction( self.mpActionPan )
    self.toolZoomIn = QgsMapToolZoom( self.canvas, False ) # false = уменьшить
    self.toolZoomIn.setAction( self.mpActionZoomIn )
    self.toolZoomOut = QgsMapToolZoom( self.canvas, True ) # true = увеличить
    self.toolZoomOut.setAction( self.mpActionZoomOut )
	
	
  def createLegendWidget( self ):
    self.legend = Legend( self )
    self.legend.setCanvas( self.canvas )
    self.legend.setObjectName( "theMapLegend" )

    self.LegendDock = QDockWidget( "Layers", self )
    self.LegendDock.setObjectName( "legend" )
    self.LegendDock.setAllowedAreas( Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea )
    self.LegendDock.setWidget( self.legend )
    self.LegendDock.setContentsMargins ( 9, 9, 9, 9 )
    self.addDockWidget( Qt.LeftDockWidgetArea, self.LegendDock )

  # Установить инструмент увеличения
  def zoomIn( self ):
    self.canvas.setMapTool( self.toolZoomIn )

  # Установить инструмент уменьшения
  def zoomOut( self ):
    self.canvas.setMapTool( self.toolZoomOut )

  # Установить инструмент для перемещения
  def pan( self ):
    self.canvas.setMapTool( self.toolPan )

  # Установить инструмент показа карты полностью
  def zoomFull( self ):
    self.canvas.zoomToFullExtent()

  # Добавить OGR-слой
  def addLayer( self ):
    filtering = QString( "Shapefiles (*.shp)" )
    encode = QString( "System" )
    fileDialog = QgsEncodingFileDialog( self, "Open shapefile", ".", QString( filtering ), encode )
    fileDialog.setFileMode( QFileDialog.ExistingFiles )
    fileDialog.setAcceptMode( QFileDialog.AcceptOpen )
  
    if not fileDialog.exec_() == QDialog.Accepted:
      return

    files = fileDialog.selectedFiles()

    for f in files:
      layerPath = unicode( f )
      layer = QgsVectorLayer( layerPath, QFileInfo( layerPath ).baseName(), "ogr" )
      if not layer.isValid():
        print "Layer is not valid" % layerPath
        continue
      QgsMapLayerRegistry.instance().addMapLayer( layer )

    self.canvas.zoomToFullExtent()
	
  def showCoords( self, p ):
	print p.x(), p.y()
  def main( app ):

  # Инициализация библиотек QGIS
   QgsApplication.setPrefixPath( qgis_prefix, True )
   QgsApplication.initQgis()

  # Создание приложения
   wnd = MainWindow()
   wnd.show()

  # Запуск!
   retval = app.exec_()

  # Выход
   QgsApplication.exitQgis()
   sys.exit( retval )


  if __name__ == "__main__":

  # Создать приложение Qt
   app = QApplication( sys.argv )

   main( app )

в итоге получил
Traceback (most recent call last):
File "mainwindow.py", line 27, in <module>
class MainWindow( QMainWindow, Ui_MainWindow ):
File "mainwindow.py", line 159, in MainWindow
main( app )
File "mainwindow.py", line 143, in main
wnd = MainWindow()
NameError: global name 'MainWindow' is not defined

real673
Интересующийся
Сообщения: 33
Зарегистрирован: 06 фев 2012, 21:54
Репутация: 0

Re: Виджет для отображения координат

Сообщение real673 » 12 фев 2012, 17:11

Все запустилось
осталось их еще как нибудь отобразить))

А вот еслия хочу создать в Меню еще одну вкладку и в ней действие
по нажатию на которое открывалось новое окно

я создал действие в QT Designer mpActionMAC
создал новое окно Win.ui скомпилировал через pyuic4 и получил win_ui.py

Код: Выделить всё

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'win.ui'
#
# Created: Fri Feb 10 09:23:52 2012
#      by: PyQt4 UI code generator 4.8.3
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    _fromUtf8 = lambda s: s

class Ui_Win(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(465, 139)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        self.label = QtGui.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(10, 10, 201, 41))
        self.label.setObjectName(_fromUtf8("label"))
        self.pushButton = QtGui.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(170, 70, 75, 23))
        self.pushButton.setObjectName(_fromUtf8("pushButton"))
        self.lineEdit = QtGui.QLineEdit(self.centralwidget)
        self.lineEdit.setGeometry(QtCore.QRect(220, 20, 221, 21))
        self.lineEdit.setObjectName(_fromUtf8("lineEdit"))
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtGui.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 465, 20))
        self.menubar.setObjectName(_fromUtf8("menubar"))
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtGui.QStatusBar(MainWindow)
        self.statusbar.setObjectName(_fromUtf8("statusbar"))
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
        self.label.setText(QtGui.QApplication.translate("MainWindow", "Введите МАС адрес маршрутизатора", None, QtGui.QApplication.UnicodeUTF8))
        self.pushButton.setText(QtGui.QApplication.translate("MainWindow", "Найти", None, QtGui.QApplication.UnicodeUTF8))

затем в mainwindow.py я добавил

Код: Выделить всё

self.connect( self.mpActionMAC, SIGNAL( "triggered()" ), self.win);
и

Код: Выделить всё

 def win ( self) :
	print("Here open WIN")
       self.child = Ui_Win()
        self.child.setWindowTitle('MAC ADRESS')
        self.child.show()
но не запускается

Voltron
Гуру
Сообщения: 2627
Зарегистрирован: 29 мар 2007, 14:12
Репутация: 34
Откуда: Ukraine

Re: Виджет для отображения координат

Сообщение Voltron » 12 фев 2012, 19:14

Код: Выделить всё

def win( self ):
  print( "Here open WIN" )
  self.child = QDialog()
  ui = Ui_Win()
  ui.setupUi( self.child )
  self.child.setWindowTitle( 'MAC ADRESS' )
  self.child.exec_()

real673
Интересующийся
Сообщения: 33
Зарегистрирован: 06 фев 2012, 21:54
Репутация: 0

Re: Виджет для отображения координат

Сообщение real673 » 12 фев 2012, 19:34

получилось следующее
Here open WIN
Traceback (most recent call last):
File "mainwindow.py", line 94, in win
ui.setupUi( self.child )
File "C:\OSGeo4W\qgis-legend\win_ui.py", line 32, in setupUi
MainWindow.setCentralWidget(self.centralwidget)
AttributeError: 'QDialog' object has no attribute 'setCentralWidget'

Voltron
Гуру
Сообщения: 2627
Зарегистрирован: 29 мар 2007, 14:12
Репутация: 34
Откуда: Ukraine

Re: Виджет для отображения координат

Сообщение Voltron » 12 фев 2012, 20:30

Хм... вы хотите чтобы за вас все сделали или как? Читайте сообщения интерпретатора, у вас что-то не так с файлами.

real673
Интересующийся
Сообщения: 33
Зарегистрирован: 06 фев 2012, 21:54
Репутация: 0

Re: Виджет для отображения координат

Сообщение real673 » 12 фев 2012, 22:03

все я разобрался
надо было сделать так

Код: Выделить всё

def win ( self) :
    print( "Here open WIN" )
    self.child = QMainWindow()
    ui = Ui_Win()
    ui.setupUi( self.child )
    self.child.setWindowTitle( 'MAC ADRESS' )
    self.child.show()

real673
Интересующийся
Сообщения: 33
Зарегистрирован: 06 фев 2012, 21:54
Репутация: 0

Re: Виджет для отображения координат

Сообщение real673 » 13 фев 2012, 07:36

А вот если мне необходимо создать событие по кнопке которое находится в новом окне Win.ui и передает значение в главное окно MainWindow (например рисует точку на Canvas)
то надо создавать новый файл win.py

Ответить

Вернуться в «QGIS»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 7 гостей