2016-11-17 437 views
-2

我在这里看到了一些类似的问题,但我仍然有问题。在QT中点击按钮时调用函数

我在QT中有一个按钮,我在main.cpp文件中定义了一个函数。当我按下QT按钮时,我想调用main.cpp中的函数并让该函数完成它的功能。

mainwindow.cpp:

void MainWindow::on_StartMotor_clicked() 
{ 
    SendCmd(100); 
} 

main.cpp中:

void SendCmd(INT Value) 
{ 
} 

但我得到一个错误:

error: 'SendCmd' was not declared in this scope 
    SendCmd(100); 
              ^

进出口新的QT所以我不认为我完全理解插槽和信号的东西。

谢谢!

+1

看起来像你的问题实际上与qt无关,但你只是不能调用main.cpp中定义的函数,而不知道该函数的其他类 – user463035818

+1

你不仅是Qt的新手,你也是新手C++ ...阅读一个好的C++ [书](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)将帮助你。你只需要在使用它之前声明函数:在'on_StartMotor_clicked'这行之前添加mainwindow.cpp:'void SendCmd(INT Value);'。或[创建标题](http://stackoverflow.com/questions/20015656/how-to-create-my-own-header-file-in-c)(哪个更好) – Garf365

回答

1

这不是QT的问题,而是基本的C++。因此,我的一般建议是购买一本好书,并从基础知识开始学习这门语言。

在您的特定设置中,您有两个cpp文件。在这种情况下,它们被称为翻译单元,因为每个文件都是单独编译的。这个结果就是所谓的目标文件(.obj)。链接器具有使另一个文件已知的一个目标文件的功能的工作。

现在,如果翻译单位知道其他翻译单位的功能声明,链接程序只能完成他的工作。

通常,你会有一些头文件包含这个声明。

main.h:

void SendCmd(INT Value); // what type is INT by the way? 

现在,双方的main.cpp和mainwindow.cpp应该包括这个文件。这样,您不会收到编译器错误,因为mainwindow.cpp具有要调用的此函数的声明。由于main.cpp被编译,链接器在他的函数库中有一些这个函数的实现,并且可以让mainwindow.cpp知道它。

+0

是的我会读一本书: ),但现在我将所有函数都移动到名为“tmclfunctions.h”的头文件中。在我的mainwindow.cpp和main.cpp中,我编写了以下内容:#include“tmclfunctions.h”,并得到一个错误,说我的函数已经声明了两次。 – Scientized

+0

@Scietedzed我希望你已经将函数实现移到了包含头部的cpp文件中,因为这是正确的方法。 你也应该在你的头文件中加入保护。在VS中,这个代码是在文件顶部的'#pragma once',但也有编译器独立的解决方案。一个快速谷歌“包括后卫”应该有所帮助,因为它基本上是三条线,这不适合在这个评论 – IceFire

相关问题