4.qis二次开发qt中实现属性选择要素_遍历qgsfeatureids-程序员宅基地

技术标签: qt  ui  数据库  QGIS二次开发QT  

效果示意图

在这里插入图片描述

思路

新建一个表格窗体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);
}



版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_47779247/article/details/127709818

智能推荐

oj开发 第一周_oj 平台开发 比较-程序员宅基地

文章浏览阅读771次。自上周六至今天已经一个星期了,总结一下!这一阶段:周六、周日下组讨论暂时确定了需求,画出了思维导图和用例图;周四确定了需求,得出了可用的用例图,然后前后台开始了正式的工作。给前台培训了bootstarp 的基本用法,展示了liteoj前台的代码。然后前台开始画原型图。后台演示了django入门的四个part 也开始进入了django入门阶段。_oj 平台开发 比较

MySQL唯一索引范围查询的加锁情况_mysql sql唯一索引 加锁-程序员宅基地

文章浏览阅读202次。之前看遇到的一个问题,简单记录一下。_mysql sql唯一索引 加锁

Cadence常见问题:Could not open“XXschematic“ for edit.Would you like to open it for read?_could not open for edit-程序员宅基地

文章浏览阅读1.3k次,点赞4次,收藏7次。Cadence常见问题:Could not open"XXschematic" for edit.Would you like to open it for read?_could not open for edit

存储知识学习之--IP网络存储iSCSI的概念与工作原理-程序员宅基地

文章浏览阅读2.7k次。存储知识学习之--IP网络存储iSCSI的概念与工作原理 本章主要介绍基于IP SAN的网络存储iSCSI。iSCSI技术以其低廉的构建成本和优秀的存储性能,博得了很多CIO和存储管理员的喜爱,目前陆续进入企业应用领域,推动了企业的存储环境向集中式转变。虽然,目前对于iSCSI应该在什么样的环境中使用还存在着诸多争议,但是iSCSI的前途是光明的,在未来的存储世..._iscsi接口,ip-san工作模式

卡特兰数归纳_catalan数母函数方法-程序员宅基地

文章浏览阅读639次。卡特兰数文章目录卡特兰数参考卡特兰数定义从递推式到通式到证明——母函数法从通式到通式的递推公式推导通用模板应用举例进出栈序列括号序列二叉树电影购票凸n边形的不同划分方式总结注CSDN这里图片好像不支持缩放这样子,而且这公式支持真的稀烂。。参考卡特兰数(好像很有用的说)「算法入门笔记」卡特兰数卡特兰数bilibili-母函数用母函数推卡特兰数通项公式卡特兰数定义卡特兰数是一种经典的组合数,经常出现在各种计算中,其前几项为 : 1, 2, 5, 14, 42, 132, 42_catalan数母函数方法

mongodb查询两个字段值相同的记录-程序员宅基地

文章浏览阅读6.1k次。2019独角兽企业重金招聘Python工程师标准>>> ..._mongo 查询a,b字段相通

随便推点

高德地图+echarts实现飞线图_import echartsamap from "echarts-amap";-程序员宅基地

文章浏览阅读9.3k次。下面是vue实现,原生html后续贴上来前期准备:引入amap、echarts、echarts-amap依赖,vue的话需要npm安装一下By using script tag<!--引入高德地图JSAPI --> <script src="//webapi.amap.com/maps?v=1.4.15&key=ab99f68b8f9eac7a5287f..._import echartsamap from "echarts-amap";

Flowable 6.6.0表单 - 1.配置 - 1.2 FormEngineConfiguration bean_form engine is not initialized-程序员宅基地

文章浏览阅读574次。The flowable.form.cfg.xml must contain a bean that has the id ‘formEngineConfiguration’.这个flowable.form.cfg.xml必须包含id为“formEngineConfiguration”的bean。 <bean id="formEngineConfiguration" class="org.flowable.form.engine.impl.cfg.StandaloneFormEngineConfi_form engine is not initialized

yocto依赖关系小结_yocto depends-程序员宅基地

文章浏览阅读4.6k次,点赞2次,收藏12次。首先说明,yocto中的依赖本质上是任务之间的依赖,即使是使用DEPENDS或者RDEPENDS定义的两个recipe之间的依赖关系,但实际上在yocto运行时依赖关系还是会体现在这两个recipe中的task之间,即在运行时,yocto会将recipe之间的依赖解析成task之间的依赖。task之间的依赖关系可以分为两种:属于同一个recipe的task之间的依赖或者属于不同recipe的ta..._yocto depends

亿级Web系统搭建:单机到分布式集群-程序员宅基地

文章浏览阅读162次。当一个Web系统从日访问量10万逐步增长到1000万,甚至超过1亿的过程中,Web系统承受的压力会越来越大,在这个过程中,我们会遇到很多的问题。为了解决这些性能压力带来问题,我们需要在Web系统架构层面搭建多个层次的缓存机制。在不同的压力阶段,我们会遇到不同的问题,通过搭建不同的服务和架构来解决。Web负载均衡Web负载均衡(Load Balan

计算机网络之IP篇_ip csdn-程序员宅基地

文章浏览阅读2.9k次,点赞38次,收藏53次。首先这是个 IPv4 地址,IPv4 地址有 32 位,一个字节有 8 位,共 4 个字节。其中 127 开头的都属于回环地址,也是 IPv4 的特殊地址,没什么道理,就是人为规定的。而 127.0.0.1 是众多回环地址的一个。之所以不是 127.0.0.2 ,而是 127.0.0.1 ,是因为源码里就是这个定义的,也没什么道理。_ip csdn

【谷粒商城】【认证服务】验证码、社交登录、分布式session、单点登录_谷粒商城实现qq微信登录-程序员宅基地

文章浏览阅读2.4w次,点赞26次,收藏90次。本文是谷粒商城项目笔记文章目录认证服务**1 gulimall-auth-server****2 注册验证码**(1) 验证码倒计时(2) 阿里云-短信服务(3) 接口防刷(4) 注册VO(5) 注册用户保存(6)密码加密(7) 用户名密码登录**3 社交登录**(1) OAuth2.0(2) 微博开放平台使用(3) 代码编写/weibo/successtoken保存**4 SpringSession**(1) session 原理(2) 分布式session解决方案1) session复制2) h._谷粒商城实现qq微信登录

推荐文章

热门文章

相关标签