2010-03-29 2 views
0

У меня есть некоторые проблемы с Qt.Совместимость функций в Qt

У меня есть класс 'Ядро'

class Core { 

    public: 

     static QString get_file_content(QString filename); 
     static void setMainwindow(Ui::MainWindow const *w); 

    private: 
     static MainWindow *main_window; 
}; 

и класс 'MainWindow' в пространстве имен Ui:

namespace Ui { 
    class MainWindow; 
} 

class MainWindow : public QMainWindow { 
    Q_OBJECT 
public: 
    MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 

private: 
    Ui::MainWindow *ui; 
}; 

В MainWindow конструктор я делаю

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

и получает ошибку

mainwindow.cpp:8: error: no matching function for call to 'Core::setMainwindow(MainWindow* const)' 

В курсе я включаю core.h с объявлением класса Core.

Это происходит только на множествеMainwindow способ.

Итак, вопросы: почему метод класса Core setMainwindow() невидим в классе MainWindow?

ответ

1

Вы добавили «Core.h» в файл cpp/h файла MainWindow?

Вы пробовали без параметра в setMainWindow, просто чтобы проверить, не связано ли это с чем-то?

Редактировать: Да, мне кажется, что вам нужен MainWindow в качестве параметра, а не Ui :: MainWindow, вам не кажется?

+0

Да, конечно, я добавляю. Не помогло. –

+0

Попробуйте изменить имя класса MainWindow ... Попробуйте удалить/изменить свой параметр в setMainWindow ... Я уверен, что это что-то вроде этого ... –

4

Проблема заключается в том, что ваш метод Core::setMainwindow принимает Ui::MainWindow*, и вы проходите мимо MainWindow*. Из введенного кода у вас есть два класса MainWindow, один в пространстве имен Ui и один в пространстве имен верхнего уровня. Это то, что вы имеете в виду или должно быть возможно только в Ui?

+0

Существует один класс MainWindow, объявленный в пространстве имен Ui. Но даже если я передаю * ui в качестве аргумента setMainwindow, я получаю такую ​​же ошибку –

+1

@ Alexander: Не в коде, который вы опубликовали. В этом коде есть два разных класса «MainWindow». Один из них - это объявление только класса MainWindow в пространстве имен 'Ui', а другое - полное определение класса MainWindow в пространстве имен верхнего уровня. – Troubadour

+0

@ Александр: Кстати, если вам нужен только один класс «MainWindow», то в чем причина конструктора, создающего экземпляр другого главного окна? Вы понимаете, что это даст вам бесконечный цикл, который в конечном итоге исчерпает память, если вы попытаетесь запустить его? – Troubadour

1

Ваш класс MainWindow не вложен в пространство имен Ui. Вы переадресовывали класс Ui::MainWindow, но затем реализовали отдельный класс ::MainWindow (в глобальном пространстве имен). Из-за этого, ваш Core::setMainwindow принимает Ui::MainWindow, но вы проходите мимо ::MainWindow.

Я предполагаю, что это отсутствие вложенности правильно - и Ui::MainWindow генерируются Qt Designer и MainWindow является классом реализации, который содержит все пользовательский код. Если это так, измените свой код на:

class Core { 

    public: 

     static QString get_file_content(QString filename); 
     static void setMainwindow(MainWindow const *w); 

    private: 
     static MainWindow *main_window; 
}; 
+0

Это будет означать, что он остался с бесконечным циклом. Но, по крайней мере, это скомпилируется! – Troubadour

+0

@Troubadour Здесь я не вижу бесконечной петли. 'Ui :: MainWindow' имеет все виджеты, но ни один из кода для их взаимодействия. ':: MainWindow' имеет весь код для взаимодействия. Это стандартный шаблон дизайна Qt при использовании Qt Designer для рисования вашего интерфейса. –

+0

Я комментировал ваш первоначальный ответ и код, а не версию, которая теперь передо мной. – Troubadour

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