效果示意图
思路
新建一个表格窗体dialog类,用于显示字段名,属性值,选择方式。并发出信号,在mainwindow中接收。主要还是用selectbyexpression函数进行选择,需要的就是一个字符串"字段名=属性值",其实写死也行,只不过想让用户交互选择字段名和属性值。
核心功能的代码如下:
遍历得到当前图层的字段名
QList< QgsMapLayer * > layers = m_mapcanvas->layers();
QStringList items;
QStringList values;
//遍历得到字段名items和属性值values显示到界面
foreach (QgsMapLayer *l , layers)
{
QgsVectorLayer *l1 = qobject_cast<QgsVectorLayer*>(l);
items = l1->fields().names();
QgsFeatureIterator featureIt=l1->getFeatures();
featureIt.rewind();
QgsFeatureIds ids;
QgsFeature f;
while(featureIt.nextFeature(f))
{
const QgsFields pFields=f.fields();
ids<<f.id();
for(int i=0;i<pFields.size();++i)
{
values.append(f.attribute(i).toString());
}
}
}
mainwindow中用于属性选择要素的槽函数
//属性选择要素的槽函数
void MainWindow::slot_selectbyatt(QString name1,QString name2,QString name3)
{
QList< QgsMapLayer * > layers = m_mapcanvas->layers();
QString fieldname =name1;
QString value=name2;
foreach (QgsMapLayer *l , layers)
{
QgsVectorLayer *l1 = qobject_cast<QgsVectorLayer*>(l);
const QString STR1 = fieldname.append("='").append(value).append("'");
if(name3==QString::fromLocal8Bit("新建选择集"))
l1->selectByExpression(STR1, QgsVectorLayer::SetSelection);
if(name3==QString::fromLocal8Bit("添加到选择集"))
l1->selectByExpression(STR1, QgsVectorLayer::AddToSelection);
if(name3==QString::fromLocal8Bit("移出当前选择集"))
l1->selectByExpression(STR1, QgsVectorLayer::RemoveFromSelection);
}
}
mainwindow中弹出窗体的按钮函数
void MainWindow::on_actionxuanzhe_triggered()
{
//属性选择要素按钮
QList< QgsMapLayer * > layers = m_mapcanvas->layers();
m_dlgselect =new selectbyattritube();
//连接selectbyattritube类发出的信号和mainwindow接受的槽函数
connect(m_dlgselect,SIGNAL(sig_selectbyshuxing(QString,QString,QString)),this,SLOT(slot_selectbyatt(QString,QString,QString)));
QStringList items;
QStringList values;
//遍历得到字段名items和属性值values显示到界面
foreach (QgsMapLayer *l , layers)
{
QgsVectorLayer *l1 = qobject_cast<QgsVectorLayer*>(l);
items = l1->fields().names();
QgsFeatureIterator featureIt=l1->getFeatures();
featureIt.rewind();
QgsFeatureIds ids;
QgsFeature f;
while(featureIt.nextFeature(f))
{
const QgsFields pFields=f.fields();
ids<<f.id();
for(int i=0;i<pFields.size();++i)
{
values.append(f.attribute(i).toString());
}
}
}
//显示窗体
m_dlgselect->SetItems(items);
m_dlgselect->Setvalues(values);
m_dlgselect->show();
m_dlgselect->raise();
m_dlgselect->activateWindow();
}
窗体类的.h文件
#ifndef SELECTBYATTRITUBE_H
#define SELECTBYATTRITUBE_H
#include <QWidget>
namespace Ui {
class selectbyattritube;
}
class selectbyattritube : public QWidget
{
Q_OBJECT
public:
explicit selectbyattritube(QWidget *parent = nullptr);
~selectbyattritube();
void SetItems(QStringList items);
void Setvalues(QStringList items);
private slots:
void on_pushButton_clicked();
void on_pushButton_2_clicked();
signals:
void sig_selectbyshuxing(QString ,QString,QString);
private:
Ui::selectbyattritube *ui;
};
#endif // SELECTBYATTRITUBE_H
窗体类的.cpp文件
#include "selectbyattritube.h"
#include "ui_selectbyattritube.h"
#include "qgsmaplayer.h"
#include "qgsvectorlayer.h"
selectbyattritube::selectbyattritube(QWidget *parent) :
QWidget(parent),
ui(new Ui::selectbyattritube)
{
ui->setupUi(this);
QStringList ll;
ll<<QString::fromLocal8Bit("新建选择集") << QString::fromLocal8Bit("添加到选择集") << QString::fromLocal8Bit("移出当前选择集");
ui->comboBox_3->addItems(ll);
}
selectbyattritube::~selectbyattritube()
{
delete ui;
}
//属性选择OK按钮
void selectbyattritube::on_pushButton_clicked()
{
QString name = ui->comboBox->currentText();
QString shuxingvalue =ui->comboBox_2->currentText();
QString selectway =ui->comboBox_3->currentText();
emit sig_selectbyshuxing(name,shuxingvalue,selectway);
}
void selectbyattritube::on_pushButton_2_clicked()
{
this->close();
}
//设置字段名
void selectbyattritube::SetItems(QStringList items)
{
ui->comboBox->clear();
ui->comboBox->addItems(items);
}
//设置属性值
void selectbyattritube::Setvalues(QStringList values)
{
ui->comboBox_2->clear();
ui->comboBox_2->addItems(values);
}