2015-04-08 2 views
1

У меня есть графический интерфейс виджета qt с кнопкой, которая сигнализирует о слоте в QMainWindow. Этот слот вызывает функцию, которая определена в заголовке main(), но, по-видимому, не определена после ее вызова из слота.функция объявлена ​​глобально в main() не входит в объем виджета qt

Грубо говоря, проблема, как это: конструктор

#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. 
} 

Я не знаю, почему возникает проблема. Я попытался неудачно изменив порядок директив #includes в основной() для

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

Возможно, проблема возникает потому, что QApplication «а», который вызывается 'a.exec(), который обрабатывает слот QMainWindow в не имеет testfunc() в своей области?

Еще одна странная вещь - некоторые библиотеки, которые у меня есть #, включенные уже в main(), должны быть повторно включены в mainwindow.h для ссылки.

Существует также некоторое «Динамическое связывание», происходящее в одной из основных библиотек, я не уверен, что это вызывает проблемы.

Что происходит?

Как расширить область действия функции до слота?


редактировать: Хорошо, у меня есть "library.h" Я #include и использовать в "main.cpp". Эта библиотека имеет определения классов и функций, которые используют определение класса в «window.h» и его функции-члены в «window.cpp», а объект этого класса построен в main().

Нужно ли мне #include "library.h" в верхней части window.cpp и/или window.h?

+0

Система заголовка очень примитивна - '#include" file "' only означает "вставить содержимое файла 'file' прямо здесь". Он не влияет на файлы, кроме тех, где он встречается. – molbdnilo

+0

Итак, у меня есть два файла .cpp. «main.cpp» и «window.cpp», а также файл «window.h», где «окно» - это класс. Я создаю объект window в main(). Я хочу использовать те же библиотеки во всех этих трех файлах. Нужно ли # включать библиотеки во все три или только два .cpp-файла, просто main.cpp, или есть какое-то другое правило, чтобы помочь мне отслеживать все это? – OrangeSherbet

ответ

4

Как файл void MainWindow::on_radioButton_pressed() знает, что такое testfunc(), если вы его не включили? Как-то вам нужно включить testfunc() в этот файл. Один из способов - переместить testfunc() в свой собственный заголовок и включить его там, где это необходимо.

+0

Я думал, что #include - это в основном «копировать и вставлять», поэтому я понял, что testfunc() находится в области mainwindow.h и связанного с ним файла mainwindow.cpp. Нет? Я должен более внимательно изучить мой код, вернусь, чтобы отредактировать мой вопрос. Спасибо. – OrangeSherbet

+0

Вы были правы, но я не мог включить заголовок, потому что заголовок использовал динамическое связывание и по какой-то причине не мог быть включен без ошибок. Я нашел тот, который не использовал его. Иди цифра? – OrangeSherbet

0

Вы должны знать разницу между define и Объявление a функция. Прочитайте это первое:

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

так что вам нужно объявить функции в файле заголовка, вызовите его myglobalvars.h. Включите myglobalvars.h, с объявлением в main.cpp и в window.h. и определить это в main.cpp.

Во время скомпилировать основной имеет декларацию и определение функции, то окна имеет только декларацию, но во время связи реализация функции находится в главной, поэтому окно может называть это оттуда!

Удачи!

 Смежные вопросы

  • Нет связанных вопросов^_^