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

智能推荐

我现在发现小觅摄像头的ROS功能包就放在SDK里面,这不像realsense,SDK和功能包是分开的。_realsense sdk拍照-程序员宅基地

文章浏览阅读196次。我现在发现小觅摄像头的ROS功能包就放在SDK里面,这不像realsense,SDK和功能包是分开的。https://gitee.com/mynt/MYNT-EYE-S-SDK/blob/master/wrappers/ros/src/mynt_eye_ros_wrapper/package.xmlhttps://gitee.com/mynt/MYNT-EYE-S-SDKhttps://blog.csdn.net/sinat_16643223/article/de..._realsense sdk拍照

数据结构和算法——Huffman树和Huffman编码详解_huffman树,huffman编码-程序员宅基地

文章浏览阅读623次。Huffman树是一种特殊结构的二叉树,由Huffman树设计的二进制前缀编码,也称为Huffman编码在通信领域有着广泛的应用。在w..._huffman树,huffman编码

spring报错java.sql.SQLException: The server time zone value '�й���׼ʱ��' is unrecognized or represents_gradle :-程序员宅基地

文章浏览阅读388次。数据库的url后面添加&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC例如,完整代码为:url: jdbc:mysql://localhost:3306/test?characterEncoding=utf-8&useJDBCCompliant..._gradle :

电脑硬件——显卡_显卡分类-程序员宅基地

文章浏览阅读3.9k次,点赞20次,收藏86次。显卡的工作是负责画面的渲染和输出,例如你在玩一个大型游戏,CPU的工作是根据游戏预设的各种算法计算出接下来会发生什么,并折合成海量的数据发送给显卡,显卡再对这些数据进行计算,渲染成1帧1帧的图像,传输到显示器,从而将画面呈现在我们眼前,而且显卡是在实时计算渲染,所以对显卡性能的要求就非常高,因此这就是我们平常所说的你想打游戏,就得有一张好的显卡。而看视频就不一样了,视频资源是已经被计算好的数据,先看只负责简单处理再输出就可以了,不需要再自己计算。就类比写作业,玩游戏就是自己计算然后写在本子上,看视频就是抄作_显卡分类

点云配准经典算法ICP复现 C++ Win10 pcl1.11.1_method for registration of 3-d shapes-程序员宅基地

文章浏览阅读1.7k次,点赞4次,收藏25次。背景ICP算法是点云配准(registration)领域的主流算法,在学习过程中我尝试使用C++复现了ICP算法。我参考的是经典ICP论"P. Besl, N. McKay. ‘A Method for Registration of 3-D Shapes,’ IEEE Trans. on Pattern Analysis and Machine Intel., vol. 14, no. 2, pp. 239-256,1992"。建议论文和代码搭配阅读。环境windows10 + pcl1.11.1_method for registration of 3-d shapes

springmvc的前端控制器对css、js等进行过滤_spring 过滤js代码-程序员宅基地

文章浏览阅读3.7k次。web.xml配置如下: springm_spring 过滤js代码

随便推点

dbeaver orcale数据库批量插入报错([933] ORA-00933: SQL 命令未正确结束)_dbeaver批量执行insert语句报错-程序员宅基地

文章浏览阅读2k次。([933] ORA-00933: SQL 命令未正确结束。_dbeaver批量执行insert语句报错

提高错误日志处理效率!使用Python和钉钉机器人实现自动告警聚合_python 钉钉告警-程序员宅基地

文章浏览阅读1.8k次。本博客,为我们构建了一个完整的应用日志监控和告警系统,通过ELK技术栈和钉钉机器人的结合,使得我们能够及时发现和处理应用中的错误,提高了团队的工作效率和系统的稳定性。_python 钉钉告警

SpringCloud集成Feign报错:feign.FeignException$NotFound: status 404 reading UserFeign#userList()_fserviceclient-程序员宅基地

文章浏览阅读1.2k次。解决方式 第一百度看看是不是你得路径写错了第二 客户端 中@FeignClient(contextId="fServiceClient",value=ServiceNameConstants.DEMO_SERVICE) 注解value得值必须是你要访问得 那个客户端标题是借别人得 内容是自己遇到得 网上一搜索全是请求路径不对 反复验证了路径 全对就是请求不到,因为自己没有springcloud 知识 (每日一问啥时候学)所以正常知道springcloud 知识得人不会遇..._fserviceclient

oracle 查询是否包含某字符串_oracle包含某个字段-程序员宅基地

文章浏览阅读7.9k次,点赞4次,收藏9次。1、like 2、contains 3、instr 4、regexp_like_oracle包含某个字段

骨架提取之AdaLSN_线性跨度网络-程序员宅基地

文章浏览阅读1.1k次,点赞2次,收藏10次。paper:https://arxiv.org/pdf/2011.03972.pdfcode:https://github.com/sunsmarterjie/SDL-Skeleton摘要传统的物体骨架检测网络通常是手工制作的。 虽然有效,但它们需要密集的先验知识来为不同粒度的对象配置具有代表性的特征。 本文提出了自适应线性跨度网络(AdaLSN),在神经架构搜索(NAS)的驱动下,自动配置和集成目标骨架检测的尺度感知特征。AdaLSN是用线性跨度理论建立的,它为多尺度深度特征融合提供了最早的解释之一_线性跨度网络

python的内存管理机制_python 创建金字塔 显示大内存图片-程序员宅基地

文章浏览阅读662次。python的内存管理机制先从较浅的层面来说,Python的内存管理机制可以从三个方面来讲(1)垃圾回收(2)引用计数(3)内存池机制一、垃圾回收:python不像C++,Java等语言一样,他们可以不用事先声明变量类型而直接对变量进行赋值。对Python语言来讲,对象的类型和内存都是在运行时确定的。这也是为什么我们称Python语言为动态类型的原因(这里我们把动态类型可以简单的归结为对变量内存地址_python 创建金字塔 显示大内存图片

推荐文章

热门文章

相关标签