Как закрыть окно GLFW при закрытии приложения QT - PullRequest
0 голосов
/ 14 февраля 2020

Когда я закрываю QT GUI, я хочу, чтобы окно GLFW было соответственно закрыто.

Для glfw мы можем запросить, закрыто ли окно или нет, функцией glfwWindowShouldClose.

Делаем ли мы есть что-то подобное в QT, где мы можем продолжать запрашивать, если приложение GUI закрыто.

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    TreeModel model;
    QTApplication w(model);
    int return_code = 0;
    QTApplication.show();
    glfwInit();
    glfwWindowHint(GLFW_RESIZABLE, GL_TRUE);
    glfwWindowHint(GLFW_SAMPLES, 4);
    window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "Renderer", nullptr, nullptr);   // Create the render window
    if (window == NULL)
    {
        QMessageBox msgBox;
        msgBox.setText("Not able to create GL Window");
        msgBox.exec();
        glfwTerminate();
        return -1;
    }
    glfwMakeContextCurrent(window);
    GLenum GlewInitResult;
    glewExperimental = GL_TRUE;
    GlewInitResult = glewInit();
    if (GLEW_OK != GlewInitResult)   // Check if glew is initialized properly
    {
        glfwTerminate();
    }       
    glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);      
    while (!glfwWindowShouldClose(window))
    {
        // Do Rendering here

    }       
    return_code =  a.exec();
    glfwTerminate();
    return return_code;
}

}

1 Ответ

1 голос
/ 14 февраля 2020

Для этого есть сигнал, излучаемый приложением:

QGuiApplication :: lastWindowClosed ()

Похоже, что вы хотите сделать, это перепутать Событие Qt l oop со своим собственным l oop. Вот подсказка о том, как это сделать из документации Qt:

Чтобы заставить ваше приложение выполнять обработку в режиме ожидания (т.е. выполнять специальную функцию, когда нет ожидающих событий), используйте QTimer с 0 timeout , Более сложные схемы обработки в режиме ожидания могут быть реализованы с помощью processEvents ().

Вот как я мог бы подойти к этому:

  1. Настройте QTimer, который подключается к методу, который выполняет рендеринг (если окно не должно закрываться) и перезапуск таймера
  2. Вызов a.exe c ()
  3. В методе, вызванном таймером, если окно должно закрыться, вызовите a.quit ()
...