切换窗口在QT GUI应用程序

Switch windows in QT GUI app

本文关键字:GUI 应用程序 QT 窗口      更新时间:2023-10-16

我正试图在我的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'没有指定类型

但是当我只包括第一个窗口而不是其他两个窗口时,我没有得到这个问题。

可能是由递归引起的

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

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

头:

// no include for 'video.h'
class video;
class MainWindow : public QMainWindow {
  //...
  video *myVideoWindow;
};
源:

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

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

    预处理程序
  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"作为链接(ctrl +左键)。如果语法下划线为红色,则表示项目无法找到这些文件。

    然后你需要检查这些文件是否在你的项目文件夹中,或者在你的文件的qmake变量INCLUDEPATH中添加这些文件的路径。

    # e.g.
    INCLUDEPATH += ../myflightdata ../myvideofiles