Featureを削除したらエラー!

ShapeFileのFeatureを削除したらREPACKエラーが発生しました。
REPACKエラーはShapeファイルのサイズをコンパクトにする際に発生したようだ!

ちなみに以下が削除のコード

iface.activeLayer().startEditing()
iface.activeLayer().deleteSelectedFeatures()
iface.activeLayer().commitChanges()

削除は以下でもOK

iface.activeLayer().deleteFeature(2)

どうやらテストで使ったShapeファイルが壊れていたみたい!

SVGファイルをシンボルに使う

Pythonコンソールにて

dict = {}
dict['fill'] = '#FFFF00'
dict['name'] = 'c:\\work\\abc.svg'
dict['size'] = '10'
sl = QgsSvgMarkerSymbolLayer.create(dict)
sym = QgsSymbol.defaultSymbol(QgsWkbTypes.PointGeometry)
sym.changeSymbolLayer(0, sl)
renderer = QgsSingleSymbolRenderer(sym)
iface.activeLayer().setRenderer(renderer)
iface.activeLayer().triggerRepaint()

QGIS Pythonプラグインで起動時に地図を表示

Pythonで作成したプラグインで起動時に地図を表示すると、
起動後「現在のプロジェクトを保存しますか」の問い合わせメッセージが表示される。

サンプルコードでは関数:initGuiの中でプロジェクトの投影を設定する。
プラグインはQGIS起動時にロードされるようにプラグインのチェックをONにする

def initGui(self):
    途中省略
    new_crs = QgsCoordinateReferenceSystem('EPSG:2451')
    QgsProject.instance().setCrs(new_crs)

これで起動後に以下のメッセージが表示される

QGISのソースをチェックはしていないが、プラグインがQgsProjectを操作した後にQGISのappクラスでQgsProjectを操作しようとしてこのような動作になっていると思われる。

これを避けるためにはQGIS起動時に実行されるPythonスクリプトを用意してこのスクリプトで起動時に実行したいスクリプトを呼ぶと期待した動作となる。

ちなみに起動クリプトの内容は以下

from PyQt5.QtCore import QSettings
from PyQt5.QtWidgets import QDesktopWidget
from qgis.utils import iface
import qgis
qgis.utils.loadPlugin('プラグイン名')
qgis.utils.startPlugin('プラグイン名')
カテゴリー: QGIS

Pythonの変数のスコープとWidget

ローカル変数に格納したWidgeのインスタンスはスコープを外れるとなくなる
これはQGISのプラグイン開発時にふと違和感を感じたPythonの仕様?

関数initGuiの中でQDockWidgetのインスタンスをローカル変数「mainpanel」にセットして
画面に追加すると正しく表示されない

しかしクラスのメンバー変数にセットすると正しく表示される

本来はaddDockWidgetした時点でインスタンスは他で保たれるであろうから表示されないことはない気がするが・・・

正しく表示されない例

def initGui(self):
    mainpanel = MainPanelDockWidget()
    self.iface.addDockWidget(Qt.RightDockWidgetArea, mainpanel)
    self.dockwidget.show()

正しく表示される例

def initGui(self):
    self.dockwidget = MainPanelDockWidget()
    self.iface.addDockWidget(Qt.RightDockWidgetArea, self.dockwidget)
    self.dockwidget.show()

QtデザイナでSplitterを配置

QDocWidget上にSplitterを配置

QWidgetを左右に配置

2つのQWidgetを選択して「ツールバー」の「水平にスプリッタの中に並べる」を選択

以上で2つのQWidgetがSplitterに配置される

Splitterが親のQDockWidget一杯に表示されるようにdockWidgetContentsを選択して「ツールバー」の「水平に並べる」ボタンをクリック

以上

QtデザイナでQDockWidgetをベースにレイアウトをデザインすると何も部品が置けない(2)

QDockWidgetにQWidgetが追加されないため、uiファイルを直接編集してQWidgetを追加。

編集前

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>DockWidget</class>
 <widget class="QDockWidget" name="DockWidget">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>400</width>
    <height>300</height>
   </rect>
  </property>
  <property name="allowedAreas">
   <set>Qt::AllDockWidgetAreas</set>
  </property>
  <property name="windowTitle">
   <string>DockWidget</string>
  </property>
 </widget>
 <resources/>
 <connections/>
</ui>

編集後

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>DockWidget</class>
 <widget class="QDockWidget" name="DockWidget">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>400</width>
    <height>300</height>
   </rect>
  </property>
  <property name="allowedAreas">
   <set>Qt::AllDockWidgetAreas</set>
  </property>
  <property name="windowTitle">
   <string>DockWidget</string>
  </property>

  <widget class="QWidget" name="dockWidgetContents">
  </widget>

 </widget>
 <resources/>
 <connections/>
</ui>

Qtデザイナで再度uiファイルを開くと正しくQWidgetが追加されている

カテゴリー: Qt

QtデザイナでQDockWidgetをベースにレイアウトをデザインすると何も部品が置けない(1)

Qtデザイナを起動してメニュー「ファイル」-「ファイルを新規作成」を選択し以下に従ってデザイナ画面を起動

本来DockWidget配下にQWidgetが表示され、その上に部品を配置することができる。

しかしDockWidget配下にQWidgetがどうしても追加されない。

カテゴリー: Qt