在 main() 中全局声明的函数不在 qt widget slot 的范围内

function declared globally in main() is not in scope of qt widget slot

我有一个带有按钮的 qt 小部件 GUI,该按钮指示 QMainWindow 中的插槽。这个槽调用了一个在 main() 的头文件中定义的函数,但是一旦从槽中调用它似乎是未定义的。

大致是这样的问题:

#include <required libraries like stdio.h>
#include "window.h"

void testfunc() {printf("I really want to print this");}

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

我的 MainWindow 对象的构造函数基本上看起来像

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_radioButton_pressed()
{
    testfunc(); //Error: Not in this scope.
}

我不确定为什么会出现此问题。我尝试将 main() 中 #includes 的顺序更改为

但未成功
#include <stdio.h>
void testfunc() {printf("I really want to print this");}
#include "window.h"

问题的发生可能是因为 'a.exec()' 调用的处理 QMainWindow 槽的 QApplication 'a' 在其范围内没有 testfunc()?

另一件奇怪的事情是我已经在 main() 中 #included 的一些库必须重新包含在 mainwindow.h 中才能被引用。

还有一些 "Dynamic linking" 发生在 main 中的一个库中,我不确定这是否会导致问题。

这是怎么回事?

如何将函数的范围扩展到插槽?


编辑:好的,我有一个 "library.h" 我#include 并在 "main.cpp" 中使用。这个库有 classes 和函数定义,用于 "window.h" 中的定义 a class 及其在 "window.cpp" 中的成员函数,以及这个 [=48= 的对象]在main()中构造。

我必须 #include "library.h" 在 window.cpp and/or window.h 之上吗?

如果不包含 void MainWindow::on_radioButton_pressed() 的文件如何知道 testfunc() 是什么?您需要以某种方式在该文件中包含 testfunc() 。一种方法是将 testfunc() 移动到它自己的 header 中,并将其包含在需要的地方。

您需要了解 定义声明 函数之间的区别。 先读这个:

http://www.cprogramming.com/declare_vs_define.html

所以你需要在头文件中声明函数,调用它myglobalvars.h。 在 main.cpp 和 window.h 中包含 myglobalvars.h 以及 声明 在 main.cpp.

中定义

在编译时 main 有函数的声明和定义, window 只有声明, 但在 link 时函数的实现在 main 中找到, 所以 window 可以调用它从那里开始!

玩得开心!