QT C++,如何在在一个CPP里直接调用到另一个CPP里的函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QT C++,如何在在一个CPP里直接调用到另一个CPP里的函数相关的知识,希望对你有一定的参考价值。

QT写了个程序,我要在另一个页面输出数据,但是数据在mainwindow.cpp里的一个函数里面,有什么办法可以实现直接把整个函数传过来,然后我挑着输出,求详细方法

Qt中如果想跨文件调用函数时,只要知道被调函数的声明即可。方法是:在调用之前增加被调函数的声明信息。

例如,在A.cpp中调用B.cpp里面写的void func()函数,需要在A.cpp中增加下面一行:
extern void func(); //声明func是一个外部函数
参考技术A 给你要调用的那个cpp文件建个头文件,把函数声明放进去,然后把头文件include到你要调用的cpp文件里追问

试了,只是可以调用到那个函数,但是如何拿到函数里的数据

追答

那就把你要的数据作为返回值返回,把函数类型为你数据的类型,函数里return该数据

追问

可否给个邮箱,发你看看?

本回答被提问者采纳
参考技术B 在你调用的文件里写上#include "xxx";
然后调用试试。追问

可以调用函数,但是我想用到函数里面的对象,该如何写

Qt将槽函数移动到另一个cpp文件

【中文标题】Qt将槽函数移动到另一个cpp文件【英文标题】:Qt moving slots function to another cpp file 【发布时间】:2014-01-20 08:01:11 【问题描述】:

我有一个由 Qt 创建者制作的 Qt 项目。 我让创建者自己生成一个私有插槽函数 fx。 on_pushbutton_clicked()。 这个函数在 header 中声明,函数本身在 Qt 创建者创建的 cpp 文件中。 当我将函数从 Qt creator 生成的 cpp 文件移动到另一个 cpp 文件时(它被添加到项目中,它与生成的 cpp 具有相同的包含。 当我尝试编译它时,我得到 lnk2019 错误。 有没有办法在不同的文件中拥有插槽功能? 我正在使用 VC 编译器。 好的,这是代码的摘录。 (很长) gui.h

#ifndef GUI_H
#define GUI_H

#include <QMainWindow>
#include "buffer.h"
#include <string>
#include <map>
#include <math.h>
#include <sstream>
#include <stdlib.h>
#include "qcustomplot.h"
#include <limits>
#include <time.h>
#include <random>


namespace Ui 
class GUI;


class GUI : public QMainWindow

    Q_OBJECT

public:
    explicit GUI(QWidget *parent = 0);
    ~GUI();
private slots:

    void on_setall_clicked();

    void on_integrace_button_clicked();
    void on_elipsy_button_clicked();
    void on_grafy_button_clicked();

private:
    Ui::GUI *ui;



;
#endif // GUI_H

gui.cpp

#include "gui.h"
#include "ui_gui.h"

double drand(double from, double to)
    double f = (double)rand()/RAND_MAX;
    return from + f * (to - from);


GUI::GUI(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::GUI)

    ui->setupUi(this);
    srand(time(0));


GUI::~GUI()

    delete ui;

void GUI::on_setall_clicked()...;
void GUI::on_grafy_button_clicked()...;
void GUI::on_integrace_button_clicked()...;

elipsy.cpp

#include "gui.h"
void GUI::on_elipsy_button_clicked()...;

GUI.pro

#-------------------------------------------------
#
# Project created by QtCreator 2013-03-27T09:01:31
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets printsupport

TARGET = GUI
TEMPLATE = app


SOURCES += main.cpp\
        gui.cpp \
    solve_rpn.cpp \
    shunting_yard.cpp \
    qcustomplot.cpp \
    elipsy.cpp \
    grafy.cpp \
    integrace.cpp

HEADERS  += gui.h \
    buffer.h \
    qcustomplot.h

FORMS    += gui.ui

当我尝试使用 gui.cpp 以外的文件中的函数 elipsy_button_clicked() 进行编译时,它给我的错误代码

moc_gui.obj:-1: Chyba:LNK2019: unresolved external symbol "private: void __cdecl GUI::on_elipsy_button_clicked(void)" (?on_elipsy_button_clicked@GUI@@AEAAXXZ) referenced in function "private: static void __cdecl GUI::qt_static_metacall(class QObject *,enum QMetaObject::Call,int,void * *)" (?qt_static_metacall@GUI@@CAXPEAVQObject@@W4Call@QMetaObject@@HPEAPEAX@Z)
debug\GUI.exe:-1: Chyba:LNK1120: 1 unresolved externals

好吧,如果你需要整个源代码,我上传了 http://seed.gweana.eu/public/GUI.7z

FIXED:该文件被项目忽略,再次运行 qmake 解决了该问题。非常感谢您的回答:)

【问题讨论】:

很难说你到底做了什么,你真的需要把代码贴出来让我们看看。您基本上需要像对待普通 c++ 类一样进行操作。 请向我们展示您的代码 请显示准确的错误信息。 【参考方案1】:

其中一个问题是您将插槽方法导出到elipsy.cpp,在第 14 行您尝试使用:ui ... 在 ui_gui.h 中定义的 only 包含在gui.cpp,但在 gui.h 中声明了前向(当然,您在 elipsy.cpp 中包含了它),所以这应该会给您一个编译错误。解决方案:在 elipsy.cpp 中包含ui_gui.h。如果它没有给您编译错误,请尝试重新构建应用程序。

其次,您的drand 函数在gui.cpp 中定义,但不在任何头文件中(很容易修复,修改gui.h)...

解决这两个问题后,我的编译就OK了。

所以,有一些建议:

    在 Qt 中保持原样...移动时您只会搞砸自己的脑袋。 有一个单独的“模块”用于实用程序,例如drand

(PS:不错的应用:))

【讨论】:

1) 这不是一个真正的问题,ui 本身是类 GUI 的一部分,因此不需要包含 ui_gui.h 2) 是的,这将是一个问题,已修复,最后解决了这个问题,编译器只是忽略了 elipsy.cpp 而不是我所做的。再次运行 qmake 为我解决了这个问题...文件已编译,我不再收到错误。【参考方案2】:

通常插槽是在头文件中声明的,例如在我的 Counter.h 中:

    #include <QObject>

    class Counter : public QObject
   
     Q_OBJECT

    public:
     Counter()  m_value = 0; 

     int value() const  return m_value; 

   public slots:
    void setValue(int value);
 ....

现在在 Counter.cpp(它必须包含 Counter.h)中,我将像定义任何其他普通函数一样定义此函数。

所以在这种情况下,一切都会正常工作。这能回答你的问题吗?

【讨论】:

以上是关于QT C++,如何在在一个CPP里直接调用到另一个CPP里的函数的主要内容,如果未能解决你的问题,请参考以下文章

c++ 一个cpp文件如何调用另一个cpp文件已经定义的类?我不想重复定义

QT中如何在不同的.cpp文件中实现信号和槽的连接

qt下c++语言,connect两个不同的类,这两个类在不同的cpp文件下,出现no such slot问题

Qt将槽函数移动到另一个cpp文件

初学QT,想在QT中调用之前已经用c++写好的一个程序,应该怎么做?

来自另一个类的 Qt c++ GUI 调用