【Visual Studio】Qt 在其他 cpp 文件中调用主工程下文件中的函数

news2024/10/5 21:59:51

知识不是单独的,一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏:Visual Studio。

还整了一个如何在其他文件中调用 ui 控件的文章,感兴趣可以看:【Visual Studio】Qt 在其他 cpp 文件中调用操作 ui 界面控件。

文章目录

  • 创建一个原始工程名字为 A
    • `A.ui`
    • `A.h`
    • `A.cpp`
    • `main.cpp`
  • 修改后
    • `A.h`
    • `A.cpp`
    • `test.h`
    • `test.cpp`
    • `main.cpp`
  • Ref.
  • Ref.

主界面工程为 A,添加的文件名字为 test,目标是在 test 文件里操作 A 工程里的函数。


简洁版直接看这个截图就行,大意就是将老的实例化 ui 变成指针,将地址传递给 p_ui,然后通过调用 p_ui 来间接调用 ui

名称解释:

  • c_test 表示新建的类
  • p_ui 表示新建的类里的指针类型的成员变量
  • testFun() 表示新建的类的函数
  • mc_test 实例化的类,用来调用新建的 c_test 的类

详细版可以看下边这些。

创建一个原始工程名字为 A

为了更好地演示,首先创建一个原始工程,名字为 A,定义一个函数 inAFun(),函数功能是打印一段文字。效果如下图所示:

在这里插入图片描述


工程的四个项目文件分别如下:

A.ui

在这里插入图片描述


A.h

// A.h
#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_A.h"

class A : public QMainWindow
{
    Q_OBJECT

public:
    A(QWidget* parent = nullptr);
    ~A();

private slots:
    void inAFun();

private:
    Ui::AClass ui;
};

A.cpp

// A.cpp
#include "A.h"

A::A(QWidget* parent) : QMainWindow(parent)
{
    ui.setupUi(this);

    inAFun();
}

A::~A()
{}

void A::inAFun()
{
    ui.textBrowser->insertPlainText("This is a text from A.cpp!\n");
}

main.cpp

// main.cpp
// main.cpp
#include "A.h"
#include <QtWidgets/QApplication>

int main(int argc, char* argv[])
{
    QApplication a(argc, argv);
    A w;
    w.show();
    return a.exec();
}

修改后

接下来将创建一个 test.h 和一个 test.cpp 文件,并实现在 test.cpp 中调用 A.cpp 中的函数 inAFun(),也会打印出来一段文字标记来自 inAFun()。最终效果如下图所示:

在这里插入图片描述


A.h

// A.h
#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_A.h"

class A : public QMainWindow
{
    Q_OBJECT

public:
    A(QWidget* parent = nullptr);
    ~A();

public slots:   // 变更为 public 或者 public slots
    void inAFun();

private:
    Ui::AClass ui;
};


确保 inAFun() 函数在 A 类中是 public 或者是 public slots,只有这样才能在其他类中使用。


A.cpp

// A.cpp
#include "A.h"

A::A(QWidget* parent) : QMainWindow(parent)
{
    ui.setupUi(this);

    inAFun();
}

A::~A()
{}

void A::inAFun()
{
    ui.textBrowser->insertPlainText("This is a text from A.cpp!\n");
}

不用改动。

这里的详细解释可以参考:【Visual Studio】Qt 在其他 cpp 文件中调用操作 ui 界面控件。


test.h

// test.h
#pragma once

#include "A.h"

class c_test
{
public:
    c_test(A* a_ptr);  // 在构造函数中接收一个 A 类的指针
    ~c_test();

    void callAFunction();

private:
    A* a_object;  // 储存一个 A 类的指针
};

test.h 中包含 A.h


test.cpp

#include "test.h"

c_test::c_test(A* a_ptr) : a_object(a_ptr)  // 初始化 A 类的指针
{}

c_test::~c_test()
{}

void c_test::callAFunction()
{
    a_object->inAFun();  // 通过 A 类的指针来调用 inAFun() 方法
}


重点看一下 c_test::c_test(A* a_ptr) : a_object(a_ptr):是使用初始化列表语法来初始化 c_test 类的 a_object 成员。这行代码的意思是,当 c_test 类的对象被构造时,它的 a_object 成员应该被初始化为传递给 c_test 类构造函数的参数 a_ptr。这样,就能够在 c_test 类的其他方法中,通过 a_object 指针访问 A 类的对象了。

C++ 的初始化列表语法。初始化列表出现在构造函数后面,由冒号开始,并包含一个或多个用逗号分隔的成员初始化器。每个成员初始化器由一个数据成员(或基类)的名称和一对括号组成,括号内包含了用来初始化该数据成员的值或表达式。

这种初始化方式主要有两个优点:

更高效:对于某些类型的数据成员(如 const 或引用类型),你必须在构造函数体外进行初始化,因为这些类型的成员变量不能在构造函数体内被赋值。即使对于那些可以在构造函数体内赋值的数据成员,使用初始化列表通常也会更高效,因为它可以避免先调用默认构造函数再调用赋值操作符的额外开销。

更安全:如果一个类的数据成员是另一个类对象,而后者的构造函数需要一些参数,那么你就需要在初始化列表中传递这些参数,否则你无法在构造函数体内进行初始化,因为此时对象已经被默认构造函数构造好了。


main.cpp

// main.cpp
#include "A.h"
#include "test.h"  // 包含 test.h 文件
#include <QtWidgets/QApplication>

int main(int argc, char* argv[])
{
    QApplication a(argc, argv);
    
    A w;
    w.show();

    c_test mc_test(&w);  // 传递 A 类对象的地址给 c_test 类的构造函数
    mc_test.callAFunction();  // 调用 Test 类的 callAFunction() 方法,这会触发 A 类的 inAFun() 方法

    return a.exec();
}

现在,当运行程序时,main.cpp 文件会创建一个 A 类的对象并展示它的窗口。

然后创建一个 c_test 类的对象,并将 A 类的对象的地址作为参数传递给 c_test 类的构造函数。这时 callAFunction() 方法就能够调用 A 类的 inAFun() 方法,而且你应该能够在 A 类的 QTextBrowser 中看到 inAFun() 插入的文本。


Ref.

  1. Qt中,在另一cpp文件操作ui界面的相关控件
  2. [Qt] [UI] 多个类中操作同一个UI界面

Backup

// main.cpp
#include "GUI_NatNet_VTK.h"
#include <QtWidgets/QApplication>

GUI_NatNet_VTK* w;

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    w = new GUI_NatNet_VTK();

    w->show();
    return a.exec();
}
// GUI_NatNet_VTK.h
private slots:
    void on_pushButtonStart_clicked();
    void on_pushButtonPause_clicked();
    void on_pushButtonStop_clicked();

    void discoverNatNet();
    void connectNatNet();

    friend void displayMotion(GUI_NatNet_VTK &p_ui, double **dynamicArray);
\\ GUI_NatNet_VTK.cpp
void displayMotion(GUI_NatNet_VTK& p_ui, double **dynamicArray)
{
    p_ui.ui.labelRBX->setText(QString::number(dynamicArray[0][0]));
    p_ui.ui.labelRBY->setText(QString::number(dynamicArray[0][1]));
    p_ui.ui.labelRBZ->setText(QString::number(dynamicArray[0][2]));
}

Ref.

  1. C++ 友元函数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/782980.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习实战10-基于spark大数据技术与机器学习的结合应用实战

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下机器学习实战10-基于spark大数据技术与机器学习的结合应用实战&#xff0c;Spark是一种快速、通用的大数据处理框架。它是由加州大学伯克利分校AMPLab开发。Spark提供了一个分布式计算的平台&#xff0c;可以在集群…

计算机组成与体系结构 概述

文章目录 计算机组成与体系结构 概述计算机系统概述计算机系统的组成计算机层次结构 计算机性能评价 计算机组成与体系结构 概述 计算机系统概述 计算机系统的组成 计算机的基本部件&#xff1a; 运算器&#xff1a;ALU、GPRs&#xff08;通用寄存器组&#xff09;、标志寄…

Java编程教程-Java ObjectStreamClass

ObjectStreamClass作为类的序列化描述符。该类包含类的名称和serialVersionUID。 # 方法 # 示例 toString() It returns a string describing this ObjectStreamClass.Exampleimport java.io.ObjectStreamClass; import java.util.Calendar; public class ObjectStreamCl…

谷歌插件(Chrome扩展) “Service Worker (无效)” 解决方法

问题描述&#xff1a; 写 background 文件的时候报错了&#xff0c;说 Service Worker 设置的 background 无效。 解决&#xff08;检查&#xff09;方法&#xff1a; 检查配置文件&#xff08;manifest.json&#xff09; 中的 manifest_version 是否为 3。 background 中的…

深入探索Spring的Bean注入:四种方式解析与循环依赖探讨

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

Docker-Compose 轻松搭建 Grafana+InfluxDb 实用 Jmeter 监控面板

目录 前言&#xff1a; 1、背景 2、GranfanaInfluxDB 配置 2.1 服务搭建 2.2 配置 Grafana 数据源 2.3 配置 Grafana 面板 3、Jmeter 配置 3.1 配置 InfluxDB 监听器 3.2 实际效果 前言&#xff1a; Grafana 和 InfluxDB 是两个非常流行的监控工具&#xff0c;它们可…

【力扣每日一题】2023.7.20 环形子数组的最大和

题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 题目描述的有点复杂,特别是那个公式,一看到我就烦. 其实意思就是找出一个子数组(连续),要求这个子数组的和是所有子数组中最大的,并且这个数组是环形的,意思就是我这个子数组可以从原数组的尾部开始,到原数组的头部结束,…

Nginx文件下载预览加权限验证的思考和实现

做的项目中多个模块涉及到附件、图片、PDF/Excel等文件的处理&#xff0c;包括预览、导出和下载等功能。对于体积较小的文件&#xff0c;可以直接由后端以流形式传输给前端处理&#xff1b;而较大的文件则需要通过nginx进行转发。但是如果nginx中不设置鉴权服务&#xff0c;可能…

帖子列表和SerializerMixin注意事项

帖子序列化 继承SerializerMixin 即可调用to_dict()序列化 后端 class PostModel(db.Model, SerializerMixin):serialize_only ("id", "title", "content", "create_time", "board", "author")__tablename__ …

Ubuntu22.04上部署Lua开发环境

需求背景 想在Ubuntu22.04上搭建一下Lua的开发环境&#xff0c;其实步骤比较简单的&#xff0c;此文章也适用于Ubuntu主机环境搭建Lua,如果想在在Ubuntu内部署一个容器&#xff0c;然后在容器内搭建Lua的环境&#xff0c;可以先参考容器的创建过程 ubuntu22.04上如何创建有pri…

android adb命令获取处于当前屏幕的Activity

android adb命令获取处于当前屏幕的Activity 使用adb命令&#xff1a; adb shell dumpsys activity activities 输出&#xff0c;例如: ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities) Display #0 (activities from top to bottom): * Task{38ef601 #5281 typ…

C++-----list

本期我们来讲解list&#xff0c;有了string和vector的基础&#xff0c;我们学习起来会快很多 目录 list介绍 ​编辑 list常用接口 insert erase reverse sort merge unique remove splice 模拟实现 基础框架 构造函数 push_back 迭代器 常见问题 const迭代器 …

BEVPoolv2 A Cutting-edge Implementation of BEVDet Toward Deployment 论文学习

Github Repo: https://github.com/HuangJunJie2017/BEVDet/tree/dev2.0 Arxiv Paper: https://arxiv.org/abs/2211.17111 1. 解决了什么问题&#xff1f; 多相机 3D 目标检测是自动驾驶领域的基本任务&#xff0c;受到学术界和工业界的大量关注。Lift-Splat-Shoot view trans…

Linux基础IO(一)

Linux基础IO 文章目录 Linux基础IOC语言中的文件操作c语言文件打开方式C语言文件操作函数 系统文件操作stdin/stdout/stderropeanclosewriteread 文件描述符重定向什么是重定向dup2 C语言中的文件操作 我们通过两个代码复习一下C语言中的文件操作&#xff1a; int main() {FI…

uniapp-开发APP使用自定义插件

uniapp-开发APP使用自定义插件 需求背景&#xff1a; 项目组开发了一个APP需要使用到打印机的功能、所以需要通过打印机厂商提供的jdk包结合自己的业务融合到uniapp 中。 首先你需要一个懂开发android开发的同事、让他帮忙配合写一些调用方法&#xff08;调用打印机提供的一些…

态势标绘专题介绍

介绍 这个专栏是专门针对基于Cesium来实现态势标绘的专题专栏,专栏主要实现了30余种态势几何形状的标绘和编辑、文本的标绘和编辑、图片的标绘和编辑以及简单模型的标绘,同时支持标绘结果的导出以及导入。包括最终编写成的一个完整的Vue3.2+TS+Cesium1.107.2的标绘组件。专栏…

【STL】list用法试做_底层实现

目录 一&#xff0c;list 使用 1. list 文档介绍 2. 常见接口 1. list中的sort 2. list sort 与 vector sort效率对比 3. 关于迭代器失效 4. clear 二&#xff0c;list 实现 1.框架搭建 2. 迭代器类——核心框架 3. operator-> 实现 4. const——迭代…

c++11 标准模板(STL)(std::basic_filebuf)(二)

定义于头文件 <fstream> template< class CharT, class Traits std::char_traits<CharT> > class basic_filebuf : public std::basic_streambuf<CharT, Traits> std::basic_filebuf 是关联字符序列为文件的 std::basic_streambuf 。输入序…

基于AOP实现登录日志和操作日志(新手入门版)

基于AOP实现登录日志和操作日志 目录结构代码PostMan测试代码控制台查看输出解析成JSON如果你觉得对你有帮助的话&#xff0c;请点赞收藏 目录结构 代码 package com.demo.mymaintest.constants;import java.lang.annotation.Documented; import java.lang.annotation.ElementT…

在Debian 12 上安装 PHP 5.6, 7.4

环境&#xff1a;Debian 12 Debian 12 默认的PHP版本为 8.2 如果直接安装php7.4就出现下面的报错&#xff1a; sudo apt-get install libapache2-mod-php7.4 php7.4 php7.4-gd php7.4-opcache php7.4-mbstring php7.4-xml php7.4-json php7.4-zip php7.4-curl php7.4-imap p…