【问题标题】:Switch windows in QT GUI app在 QT GUI 应用程序中切换窗口
【发布时间】:2013-06-18 15:42:27
【问题描述】:

我正在尝试在我的 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 个窗口(@98​​7654324@ + file.cpp)执行相同的步骤时,

我得到错误: qt 错误:'flightdata' 没有命名类型 qt 错误:“视频”未命名类型

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

可能是递归引起的。

【问题讨论】:

  • 您是否在任何地方都包含您需要的所有文件?
  • 是的,问题是我必须包含 3 个文件,并且每次我必须在每个班级中包含 2 个文件,但是当我只为一个班级这样做时,它可以 10/10 工作,但是当我如果我在 Y.h 中包含 X.h,并且在某些时候我需要在 X.h 中包含 Y.h,qt 将无法生成文件
  • 转发声明你的类

标签: c++ windows qt header qt4


【解决方案1】:

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

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

标题:

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

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

来源:

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

【讨论】:

    【解决方案2】:

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

    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
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-21
      • 2020-10-23
      • 1970-01-01
      • 2016-03-24
      • 2020-12-04
      • 1970-01-01
      • 2018-08-20
      • 1970-01-01
      相关资源
      最近更新 更多