我想在我的3个窗口之间建立链接,所以我把它放在我的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对其他2个窗口(file.h
+ file.cpp
)执行相同的步骤时,
我收到错误: qt错误:'flightdata'没有命名类型 qt错误:'video'没有命名类型
但是当我只包括第一个窗口而不是其他2个窗口时,我没有遇到这个问题。
可能是由递归引起的。
答案 0 :(得分:1)
不要在头文件中包含其他类。仅将它们包含在源文件中。
如果由于某种原因需要在其他类的标题中使用另一个类,请使用forward声明而不是include。
部首:
// no include for 'video.h'
class video;
class MainWindow : public QMainWindow {
//...
video *myVideoWindow;
};
来源:
#include "video.h"
//...
答案 1 :(得分:0)
据我所知,可能存在两件可能出错的事情:
预处理器/ 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”作为链接(控制+左键单击)。如果语法带有红色下划线,则表示项目无法找到这些文件。
然后,您需要检查以确保文件位于项目文件夹中,或者添加具有在pro文件的qmake变量INCLUDEPATH中添加的文件的路径。
# e.g.
INCLUDEPATH += ../myflightdata ../myvideofiles