Виджет для отображения координат
-
- Интересующийся
- Сообщения: 33
- Зарегистрирован: 06 фев 2012, 21:54
- Репутация: 0
Виджет для отображения координат
Помогите разобраться с созданием виджета для отображения коодинат
как это происходит в QGIS
как это происходит в QGIS
-
- Гуру
- Сообщения: 2627
- Зарегистрирован: 29 мар 2007, 14:12
- Репутация: 34
- Откуда: Ukraine
Re: Виджет для отображения координат
Начинать надо с описания API QGIS, а именно с класса QgsMapCanvas, т.к. интересуют координаты карты. Смотрим и видим сигнал xyCoordinates(), который делает, то что нужно.
Дальше все просто. Добавляем в приложение виджет(ы) для отображения координат; создаем слот, в котором виджет(ы) будут обновляться; соединяем слот с сигналом xyCoordinates(). Все.
Дальше все просто. Добавляем в приложение виджет(ы) для отображения координат; создаем слот, в котором виджет(ы) будут обновляться; соединяем слот с сигналом xyCoordinates(). Все.
-
- Интересующийся
- Сообщения: 33
- Зарегистрирован: 06 фев 2012, 21:54
- Репутация: 0
Re: Виджет для отображения координат
если было все так просто))
-
- Гуру
- Сообщения: 2627
- Зарегистрирован: 29 мар 2007, 14:12
- Репутация: 34
- Откуда: Ukraine
Re: Виджет для отображения координат
Хм... а в чем сложность? Только что проверил, все работает
-
- Интересующийся
- Сообщения: 33
- Зарегистрирован: 06 фев 2012, 21:54
- Репутация: 0
Re: Виджет для отображения координат
А ты можешь скинуть пример.
[Сообщение с мобильного устройства]
[Сообщение с мобильного устройства]

-
- Гуру
- Сообщения: 2627
- Зарегистрирован: 29 мар 2007, 14:12
- Репутация: 34
- Откуда: Ukraine
Re: Виджет для отображения координат
Пусть mCanvas это виджет карты, тогда в __init__ подключаем сигнал
В самом простом случае слот будет таким
Код: Выделить всё
self.connect( mCanvas, SIGNAL( "xyCoordinates( QgsPoint )" ), self.showCoords )
Код: Выделить всё
def showCoords( self, p ):
print p.x(), p.y()
-
- Интересующийся
- Сообщения: 33
- Зарегистрирован: 06 фев 2012, 21:54
- Репутация: 0
Re: Виджет для отображения координат
т.е. надо вставить
и
в mainwindow.py
но в итоге я получаю
Код: Выделить всё
self.connect( mCanvas, SIGNAL( "xyCoordinates( QgsPoint )" ), self.showCoords )
Код: Выделить всё
def showCoords( self, p ):
print p.x(), p.y()
но в итоге я получаю
File "mainwindow.py", line 59
self.connect( mCanvas, SIGNAL( "xyCoordinates( QgsPoint )" ), self.showCoords )
^
IndentationError: unexpected indent
Последний раз редактировалось Voltron 12 фев 2012, 16:13, всего редактировалось 1 раз.
Причина: поправил форматирование
Причина: поправил форматирование
-
- Гуру
- Сообщения: 2627
- Зарегистрирован: 29 мар 2007, 14:12
- Репутация: 34
- Откуда: Ukraine
Re: Виджет для отображения координат
Все правильно. По поводу ошибки — а у вас отступы правильные в коде?
-
- Интересующийся
- Сообщения: 33
- Зарегистрирован: 06 фев 2012, 21:54
- Репутация: 0
Re: Виджет для отображения координат
вот отредактированный код
в итоге получил
Код: Выделить всё
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
-
- Интересующийся
- Сообщения: 33
- Зарегистрирован: 06 фев 2012, 21:54
- Репутация: 0
Re: Виджет для отображения координат
Все запустилось
осталось их еще как нибудь отобразить))
А вот еслия хочу создать в Меню еще одну вкладку и в ней действие
по нажатию на которое открывалось новое окно
я создал действие в QT Designer mpActionMAC
создал новое окно Win.ui скомпилировал через pyuic4 и получил win_ui.py
затем в mainwindow.py я добавил
и
но не запускается
осталось их еще как нибудь отобразить))
А вот еслия хочу создать в Меню еще одну вкладку и в ней действие
по нажатию на которое открывалось новое окно
я создал действие в 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))
Код: Выделить всё
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()
-
- Гуру
- Сообщения: 2627
- Зарегистрирован: 29 мар 2007, 14:12
- Репутация: 34
- Откуда: Ukraine
Re: Виджет для отображения координат
Код: Выделить всё
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_()
-
- Интересующийся
- Сообщения: 33
- Зарегистрирован: 06 фев 2012, 21:54
- Репутация: 0
Re: Виджет для отображения координат
получилось следующее
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'
-
- Гуру
- Сообщения: 2627
- Зарегистрирован: 29 мар 2007, 14:12
- Репутация: 34
- Откуда: Ukraine
Re: Виджет для отображения координат
Хм... вы хотите чтобы за вас все сделали или как? Читайте сообщения интерпретатора, у вас что-то не так с файлами.
-
- Интересующийся
- Сообщения: 33
- Зарегистрирован: 06 фев 2012, 21:54
- Репутация: 0
Re: Виджет для отображения координат
все я разобрался
надо было сделать так
надо было сделать так
Код: Выделить всё
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()
-
- Интересующийся
- Сообщения: 33
- Зарегистрирован: 06 фев 2012, 21:54
- Репутация: 0
Re: Виджет для отображения координат
А вот если мне необходимо создать событие по кнопке которое находится в новом окне Win.ui и передает значение в главное окно MainWindow (например рисует точку на Canvas)
то надо создавать новый файл win.py
то надо создавать новый файл win.py
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 7 гостей