我正在使用QT Creator为QGIS Desktop 2.8.3(夜晚)编写插件。我的想法是获取当前项目中的图层名称列表,将它们放在列表中,每次单击一个项目时,插件都会获取属性表并将其放入表格小部件中。
我想我几乎得到了所有这些,除了获得所有属性后,QGIS被抛弃。
这是我的插件图: mainapp == load => form1 == load =>窗口2
作为一个插件,mainmodule有一个
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崩溃并创建了一个小型转储。 我不确定我是否通过传递和使用mIface来做正确的事。
另外,在另一个插件中,当没有加载图层时,我可以从文件加载图层并获取具有相同代码的属性。
QGIS c ++插件上的内容很少,我还是新手。