1

我试图在我的 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 个时,我没有遇到这个问题。

也许它是由递归引起的。

4

2 回答 2

1

不要在头文件中包含其他类。仅将它们包含在源文件中。

如果您出于某种原因需要在其他类的标头中使用另一个类,请使用前向声明而不是包含。

标题:

// no include for 'video.h'
class video;

class MainWindow : public QMainWindow {
  //...
  video *myVideoWindow;
};

资源:

#include "video.h"
//...
于 2013-06-18T16:27:44.647 回答
0

据我所知,可能有两件事可能是错误的:

  1. 预处理器/宏

    如果您使用 QtCreator/Designer 创建了其他窗口,#ifndef 宏应该是唯一的。意思是,video.h 应该是这样的:

    #ifndef VIDEOWINDOW_H
    #define VIDEOWINDOW_H
    

    而不是默认的

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    

    这些#ifndef MACROS 旨在帮助包含头文件的内容一次且仅一次。

  2. 缺少包含路径

    此外,如果您使用 QtCreator,编辑器应显示 #include "video.h" 和 #include "flightdata.h" 作为链接(控制 + 左键单击)。如果语法带有红色下划线,则表示项目找不到这些文件。

    然后,您需要检查以确保文件在您的项目文件夹中,或者在您的 pro 文件的 qmake 变量 INCLUDEPATH 中添加这些文件的路径。

    # e.g.
    INCLUDEPATH += ../myflightdata ../myvideofiles
    
于 2013-06-18T16:34:52.387 回答