QGIS3.28的二次开发六:VS不借助QT插件创建UI界面

news/2024/11/23 20:54:50/

上一篇博客我们说了在VS中如何使用QT插件来创建UI界面,但是我们二次开发QGIS的第一篇博客就说了,最好使用OSGeo4W中自动下载的QT进行QGIS二次开发,这样兼容性是最好的,那么该如何在VS中不使用外部安装的QT以及QT的VS插件情况下进行UI界面的创建和使用呢?

如果你仔细看完了我前面的博客,那么配置起来也很简单~

一、创建空项目

配置过程和下面这篇博客一样,可以使用这篇博客创建的模板来创建项目。QGIS二次开发二:不重新编译QGIS进行二次开发_程序员班长的博客-CSDN博客由于重新编译QGIS对于初学者来说还是有一定难度,因此这里介绍另外一种不编译QGIS也能够二次开发的方法,不需要下载QGIS的整套源码。https://kantlee.blog.csdn.net/article/details/132161333 

 创建完成后配置调试一下环境和QT插件目录。

二、设置环境变量

由于我们根据QT的UI文件要生成对应的头文件,就需要使用QT自带的uic命令,该命令存在于OSGeo4W安装目录下的\apps\Qt5\bin文件夹下,同时,这个命令执行需要依赖一个动态链接库icuuc67.dll,这个文件存放在OSGeo4W安装目录下的\bin文件夹内。因此,要想使用此命令,我们需要将这两个目录添加到环境变量中。在Path变量中添加这两个路径即可。

 三、添加UI文件

在使用OSGeo4W安装QGIS的时候,会一起安装一个配套的Qt Designer,开始菜单中可以找到。

我们打开Qt Designer,创建一个界面

 然后保存到我们的项目路径下

 然后在这个目录执行cmd,输入uic ui文件名 -o 自定义头文件名

可以看到在项目路径下生成了一个UI文件的头文件

 

 然后我们在VS中添加现有项,将这两个文件添加进来。

四、绑定UI文件

右键点击项目,添加一个类,这个类就是我们的主窗口,基类选择我们创建UI文件时选择的类,我选择的是QWidget,注意名字不要和UI的头文件重名,类名首字母大写。

 首先,在我们新创建的类的头文件中引入UI界面的头文件

#include "qgisTestUI.h"

 然后添加构造函数,实例化一个ui对象,QgisUITest.h的内容如下

#pragma once
#include <qwidget.h>
#include "qgisTestUI.h"class QgisUITest :	public QWidget
{public:QgisUITest(QWidget * parent = 0);private:Ui::qgisTestUI ui;
};

 然后编辑main.cpp

首先导入我们的主窗口头文件

#include "QgisUITest.h"

 然后实例化一个主窗口并进行展示

#include <qgsapplication.h>
#include "QgisUITest.h"
#include <qgsproviderregistry.h>int main(int argc, char **argv)
{// 创建 QgsApplication 实例QgsApplication app(argc, argv, true);// 添加插件目录QgsProviderRegistry::instance("D:/OSGeo4W/apps/qgis-ltr/plugins");// 配置GDAL环境变量qputenv("GDAL_DATA", "D:\\OSGeo4W\\apps\\gdal\\share\\gdal");// 实例化创建一个窗口QgisUITest q;// 展示窗口q.show();app.exec();
}

然后编辑我们的新创建的类的cpp文件,在这里定义我们的构造函数

QgisUITest::QgisUITest(QWidget * parent)
{
}

设置ui界面

ui.setupUi(this);

最后,设置一个信号和槽,当我点击界面的QPushButton按钮时,QLabel显示“界面创建成功”

QgisUITest.cpp完整代码如下

#include "QgisUITest.h"QgisUITest::QgisUITest(QWidget * parent)
{ui.setupUi(this);connect(ui.pushButton, &QPushButton::clicked, [=]() {ui.label->setText("成功创建界面!");});
}

五、运行结果

可以看到,我们的文字并没有完整显示出来,修改一下ui界面即可。 

 六、更改UI界面

右键我们的ui文件,选择打开方式,然后添加一个新的,程序和参数参见QGIS自带的Qt Designer的属性页,目标的第一个值为程序,第二个值为参数。

 填入即可,友好名称自己决定,然后点击确定,并设为默认值。

 这时我们双击ui文件,就会在QGIS自带的Qt Designer中打开我们的界面。

重新设计后,再次执行uic命令,头文件会自动更改。

 再次运行我们的项目,可以看到界面被我们更改成功!


http://www.ppmy.cn/news/1027040.html

相关文章

Python(八十二)字符串的常用操作——替换与合并

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

Vue2-绑定样式、条件渲染、列表渲染、列表过滤、模糊查询、Vue监测数据原理

&#x1f954;&#xff1a;想只有苦难&#xff0c;做才有答案 更多Vue知识请点击——Vue.js VUE2-Day3 绑定样式1、class绑定2、绑定style样式 条件渲染1、v-show2、v-if条件渲染案例 列表渲染1、v-for2、key的作用与原理&#xff08;重要&#xff09;面试题&#xff1a;react、…

Insert 1, Insert 2, Insert 3, ... 2023牛客暑期多校训练营8 H

登录—专业IT笔试面试备考平台_牛客网 题目大意&#xff1a;给出一个长度为n的数组a&#xff0c;问有多少子串满足其可以用多个排列穿插构成 1<n<1e6 思路&#xff1a;因为每个排列的起点都是1&#xff0c;所以我们大致的策略就是对于每一个1&#xff0c;记录它往右最…

Object.assign详解

一、Object.assign是什么&#xff1f; Object.assign( )方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。 二、用法 Object.assign(target, ...sources) 参数&#xff1a;target ——>目标对象 source ——>源对象 返回值&#xff1a;…

【Linux】IP协议——网络层

目录 IP协议 基本概念 IP协议格式 分片与组装 网段划分 特殊的IP地址 IP地址的数量限制 私网IP地址和公网IP地址 路由 路由表生成算法 IP协议 IP协议全称为“网际互连协议&#xff08;Internet Protocol&#xff09;”&#xff0c;IP协议是TCP/IP体系中的网络层协议…

解决macOS执行fastboot找不到设备的问题

背景 最近准备给我的备用机Redmi Note 11 5G刷个类原生的三方ROM&#xff0c;MIUI实在是用腻了。搜罗了一番&#xff0c;在XDA上找到了一个基于Pixel Experience开发的ROM&#xff1a;PixelExperience Plus for Redmi Note 11T/11S 5G/11 5G/POCO M4 Pro 5G (everpal)&#xf…

uniapp的UI框架组件库——uView

在写uniapp项目时候&#xff0c;官方所推荐的样式库并不能满足日常的需求&#xff0c;也不可能自己去写相应的样式&#xff0c;费时又费力&#xff0c;所以我们一般会去使用第三方的组件库UI&#xff0c;就像vue里我们所熟悉的elementUI组件库一样的道理&#xff0c;在uniapp中…

获取历史dokcer镜像项目,并上传gitlab,再打包镜像管理

今天遇到一个问题&#xff1a; 发现一个部署在Jenkins的脚本用的docker镜像是&#xff1a;test_project:v20191108&#xff0c;即这个项目是19年的一个版本&#xff0c;由于代码不断更新&#xff0c;用现在的最新代码运行该脚本&#xff0c;可能不能运行了&#xff0c;必须用19…