Я использую 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 ++ так мало материала, и я все еще новичок в этом.
Задача ещё не решена.
Других решений пока нет …