在 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 可以调用它从那里开始!
玩得开心!
我有一个带有按钮的 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 可以调用它从那里开始!
玩得开心!