Qt c++ VS 代码:如何使用相对文件路径?

Posted

技术标签:

【中文标题】Qt c++ VS 代码:如何使用相对文件路径?【英文标题】:Qt c++ VS code : how to use relative file path? 【发布时间】:2021-03-14 10:28:16 【问题描述】:

我在 Mac 上的 VS 代码中使用 Qt6 框架。 我有一个 Window.h 和 Window.cpp 文件来使用 QOpenGLWindow 和 QOpenGLFunctions 创建窗口。

窗口.h

#ifndef WINDOW_H
#define WINDOW_H

#include <QOpenGLWindow>
#include <QOpenGLFunctions>
#include <QOpenGLBuffer>
#include <QOpenGLVertexArrayObject>

class QOpenGLShaderProgram;

class Window: public QOpenGLWindow, protected QOpenGLFunctions
    Q_OBJECT
public:
    ~Window();

    // opengl events
    void initializeGL();
    void resizeGL(int width, int height);
    void paintGL();
    void teardownGL();

private:
    // opengl state information
    QOpenGLBuffer m_vertex;
    QOpenGLVertexArrayObject m_object;
    QOpenGLShaderProgram *m_program;

    // private helper
    void printContextInformation();
;

#endif /* WINDOW_H */

窗口.cpp

#include "hdr/Window.h"
#include "hdr/Vertex.h"

#include <QDebug>
#include <QString>
#include <QOpenGLShaderProgram>

// create a colored triangle
static const Vertex sg_vertexes[] = 
    Vertex( QVector3D( 0.00f,  0.75f, 1.0f), QVector3D(1.0f, 0.0f, 0.0f) ),
    Vertex( QVector3D( 0.75f, -0.75f, 1.0f), QVector3D(0.0f, 1.0f, 0.0f) ),
    Vertex( QVector3D(-0.75f, -0.75f, 1.0f), QVector3D(0.0f, 0.0f, 1.0f) )
;

Window::~Window()
    makeCurrent();
    teardownGL();


// ----- opengl events -----
void Window::initializeGL()
    // initialize opengl backend
    initializeOpenGLFunctions();
    printContextInformation();

    ...

    // application-specific initialization
    
        // create shader dDo not release until vao is created)
        m_program = new QOpenGLShaderProgram();
        m_program->addShaderFromSourceFile(QOpenGLShader::Vertex, "shaders/vertexShader.vert");
        m_program->addShaderFromSourceFile(QOpenGLShader::Fragment, "shaders/fragmentShader.frag");
        m_program->link();
        m_program->bind();

        ...
    


void Window::resizeGL(int width, int height)
    ...


void Window::paintGL()
    ...
    

void Window::teardownGL()
    ...


// ----- private helper -----
void Window::printContextInformation()
    ...

因此,在我的 window.cpp 中,我使用相对路径“shaders/vertexShader.vert”/“shaders/fragmentShader.frag”从源文件添加着色器,但这不起作用。 实际上,我使用着色器文件的唯一方法是将整个文件路径(“/Users/[name]/c++/WuW/res/shaders/vertexShader.vert”/“/Users/[name]/c++/WuW/ res/shaders/fragmentShader.frag").

这是我的项目文件夹的组织方式:

CMakeLists.txt

cmake_minimum_required(VERSION 3.16.0)
project(wuw VERSION 0.0.1 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)

if(NOT DEFINED INSTALL_EXAMPLESDIR)
    set(INSTALL_EXAMPLESDIR "examples")
endif()

set(INSTALL_EXAMPLEDIR "$INSTALL_EXAMPLESDIR/WuW/Build")

find_package(Qt6 COMPONENTS Core)
find_package(Qt6 COMPONENTS Widgets)
find_package(Qt6 COMPONENTS Gui)
find_package(Qt6 COMPONENTS OpenGL)
find_package(Qt6 COMPONENTS OpenGLWidgets)

add_executable(wuw
    src/main.cpp
    src/Window.cpp hdr/Window.h
    hdr/Vertex.h
)

set_target_properties(wuw PROPERTIES
    WIN32_EXECUTABLE TRUE
    MACOSX_BUNDLE TRUE
)

target_include_directories(wuw PUBLIC
    $CMAKE_CURRENT_SOURCE_DIR
)

target_link_libraries(wuw PUBLIC
    Qt::Core
    Qt::Widgets
    Qt::Gui
    Qt::OpenGL
    Qt::OpenGLWidgets
)

install(TARGETS wuw
    RUNTIME DESTINATION "$INSTALL_EXAMPLEDIR"
    BUNDLE DESTINATION "$INSTALL_EXAMPLEDIR"
    LIBRARY DESTINATION "$INSTALL_EXAMPLEDIR"
)

【问题讨论】:

只需将源目录作为工作目录运行您的应用程序。如果您通过 VSCode 运行应用程序,请相应地配置 VSCode。 或将着色器放入 Qt 资源文件或相对于您的可执行文件并使用 QCoreApplication::applicationDirPath() 【参考方案1】:

[已解决]

我使用以下代码在我的 res 文件夹中创建了一个 res.qrc 文件:

res.qrc

<!DOCTYPE RCC><RCC version = "1.0">
<qresource>
    <file>shaders/fragmentShader.frag</file>
    <file>shaders/vertexShader.vert</file>
</qresource>
</RCC>

并将此文件添加到可执行文件中:

CMakeFiles.txt

add_executable(wuw
    res/res.qrc (that line)
    src/main.cpp
    src/Window.cpp hdr/Window.h
    hdr/Vertex.h
)

现在我可以使用着色器文件的相对路径了:

窗口.cpp

...
Q_INIT_RESOURCE(res);

// ----- opengl events -----
void Window::initializeGL()
    // initialize opengl backend
    initializeOpenGLFunctions();
    printContextInformation();

    // set global information
    glClearColor(1.0f, 1.0f, 1.0f, 1.0f);

    Q_INIT_RESOURCE(res);

    // application-specific initialization
    
        // create shader dDo not release until vao is created)
        m_program = new QOpenGLShaderProgram();
        m_program->addShaderFromSourceFile(QOpenGLShader::Vertex, ":/shaders/vertexShader.vert");
        m_program->addShaderFromSourceFile(QOpenGLShader::Fragment, ":/shaders/fragmentShader.frag");
        m_program->link();
        m_program->bind();
    
        ...
    


...

谢谢@chehrlic!

【讨论】:

以上是关于Qt c++ VS 代码:如何使用相对文件路径?的主要内容,如果未能解决你的问题,请参考以下文章

在 Qt Creator 中加载具有相对路径的文件

在 QT 样式表中使用相对 url

Vscode的相对路径读取问题及处理

如何使用VS2012调试QT程序

如何在qt vs中利用qt进行界面设计

如何提取路径的文件名