qt — плагин QGIS c ++ получает атрибут векторного слоя

Я использую QT Creator для написания плагина для QGIS Desktop 2.8.3 (Nightly). Моя идея состоит в том, чтобы получить список имен слоев в текущем проекте, поместить их в список, и каждый раз, когда я щелкаю элемент, плагин получает таблицу атрибутов и помещает ее в виджет таблицы.

Я думаю, что я почти все их получил, кроме как после получения всех атрибутов, QGIS был сброшен.

Вот моя схема плагина:
mainapp == load => form1 == load => form2

Как плагин, основной модуль имеет

QgisInterface* mIface

который я перехожу из mainapp в form1 и, в конце концов, в form2 публичной пустотой

void form1::get_iface(QgisInterface* interface)
{
mIface=interface;
}

Затем каждый раз, когда я щелкаю элемент в представлении списка, плагин получает атрибут следующим образом:

void form02::get_attrib_table(QListWidgetItem *item)
{
QString targetname=item->text();
QStringList myString;
int targetindex;
for (int i=0;i<mIface->legendInterface()->layers().count();i++)
{
if (mIface->legendInterface()->layers().at(i)->name()==targetname)
{
targetindex=i;
goto aab;
}
}
aab:;

QgsMapLayer* abc=mIface->legendInterface()->layers().at(targetindex);
QgsVectorLayer* mypLayer = dynamic_cast<QgsVectorLayer*>(abc);
//get attribute table format, ie. column headers
ui->tableWidget->clear();
ui->tableWidget->setColumnCount(mypLayer->pendingFields().count());
ui->tableWidget->setRowCount(mypLayer->pendingFeatureCount());
for (int i=0;i<mypLayer->pendingFields().count();i++)
{
myString<<mypLayer->pendingFields().field(i).name();
}
ui->tableWidget->setHorizontalHeaderLabels(myString);///get feature data
if (mypLayer->featureCount()>0)
{
int fcount=mypLayer->featureCount();
int hcount=mypLayer->pendingFields().count();

for (int p=0;p<fcount;++p)
{
mypLayer->select(p);
for (int i=0;i<hcount;i++)
{
QTableWidgetItem *item=new QTableWidgetItem(mypLayer->selectedFeatures().at(p).attribute(i).toString());
ui->tableWidget->setItem(p,i,item);
}
mypLayer->deselect(p);
}
delete mypLayer;
delete abc;
}
}

В конце концов мне удалось получить необходимые данные, но затем QGIS потерпел крах и создал мини-дамп.
Я не уверен, правильно ли я поступил, пройдя и используя подобный интерфейс.

Кроме того, в другом плагине, когда нет загруженного слоя, Я могу загрузить слой из файлов и получить атрибут с тем же кодом.

На плагине QGIS c ++ так мало материала, и я все еще новичок в этом.

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]