我试图在我的3个窗口之间build立一个链接,所以我把它放在我的mainwindow.h
:
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include "video.h" #include "flightdata.h" namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); public slots: void openNewWindowVideo(); void openNewWindowData(); private: Ui::MainWindow *ui; video *myVideoWindow; flightdata *myDataWindow; }; #endif // MAINWINDOW_H
这在我的实现:
#include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); connect(ui->actionVideo,SIGNAL(triggered()),this,SLOT(openNewWindowVideo())); connect(ui->actionFlight_data,SIGNAL(triggered()),this,SLOT(openNewWindowData())); } MainWindow::~MainWindow() { delete ui; } void MainWindow::openNewWindowVideo() { myVideoWindow = new video(); myVideoWindow->show(); this->close(); } void MainWindow::openNewWindowData() { myDataWindow = new flightdata(); myDataWindow->show(); this->close(); }
这工作。
但是当O对其他两个窗口( file.h
+ file.cpp
)执行相同的步骤时,
我得到的错误:QT错误:'flightdata'没有命名一个types的QT错误:'video'不命名一个types
但是,当我只包括第一个窗口而不是其他两个时,我不明白这个问题。
也许这是由recursion引起的。
不要在头文件中包含其他类。 只将它们包含在源文件中。
如果由于某种原因需要在其他类的头文件中使用另一个类,请使用forward声明而不是include。
标题:
// no include for 'video.h' class video; class MainWindow : public QMainWindow { //... video *myVideoWindow; };
资源:
#include "video.h" //...
据我所知,有两件事可能是错误的:
预处理器/ MACRO
如果您使用QtCreator / Designer创建了其他窗口,那么#ifndef宏应该是唯一的。 意思是,video.h应该是这样的:
#ifndef VIDEOWINDOW_H #define VIDEOWINDOW_H
而不是默认的
#ifndef MAINWINDOW_H #define MAINWINDOW_H
这些#ifndef MACROS旨在帮助仅包含一次头文件的内容。
缺少包含路径
另外,如果你使用QtCreator,编辑器应该显示#include“video.h”和#include“flightdata.h”作为链接(control +左键单击)。 如果语法加下划线为红色,则意味着项目无法找到这些文件。
然后,您需要检查以确保这些文件在您的项目文件夹中,或者添加具有添加到pro文件的qmake变量INCLUDEPATH中的文件的路径。
# eg INCLUDEPATH += ../myflightdata ../myvideofiles