在QT GUI应用程序中切换窗口

时间:2013-06-18 15:42:28

标签: c++ windows qt header qt4

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

可能是由递归引起的。

2 个答案:

答案 0 :(得分:1)

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

如果由于某种原因需要在其他类的标题中使用另一个类,请使用forward声明而不是include。

部首:

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

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

来源:

#include "video.h"
//...

答案 1 :(得分:0)

据我所知,可能存在两件可能出错的事情:

  1. 预处理器/ MACRO

    如果您使用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