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 代码:如何使用相对文件路径?的主要内容,如果未能解决你的问题,请参考以下文章