【发布时间】:2026-01-19 05:10:02
【问题描述】:
背景:我有一个 Qt/C++ 应用程序,目前在 MacOS/X、Windows 和 Linux 上运行(并部署在)上。在应用程序的一个窗口中是几十个音频表的视图,需要经常更新(即 20Hz 或更快),所以我使用QOpenGLWidget 和一些简单的 OpenGL 例程(参见下面的示例代码)实现了该视图。
这一切都很好,但是 Apple 最近 deprecated OpenGL 并希望所有开发人员将他们的应用程序转换为 Apple 自己的“Metal”API;这意味着最终任何使用 OpenGL 的程序都将停止在 MacOS/X 上运行。
我不介意在我的代码中做一点 #ifdef-magic 来支持 MacOS/X 的单独 API,如果必须的话,但是不清楚是否可以在 Qt 中实际完成对 Metal 的编码现在。如果 Metal-inside-Qt 是可能的,那么正确的使用方法是什么?如果没有,我是否应该等待具有更好 Metal 支持的 Qt 未来版本(例如Qt 5.12?)而不是浪费我的时间试图让 Metal 在我当前的 Qt 版本(5.11.2)中工作?
// OpenGL meters view implementation (simplified for readability)
class GLMetersCanvas : public QOpenGLWidget
{
public:
GLMetersCanvas( [...] );
virtual void initializeGL()
{
glDisable(GL_TEXTURE_2D);
glDisable(GL_DEPTH_TEST);
glDisable(GL_COLOR_MATERIAL);
glDisable(GL_LIGHTING);
glClearColor(0, 0, 0, 0);
}
virtual void resizeGL(int w, int h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, w, 0, h, -1, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
virtual void paintGL()
{
const float meterWidth = [...];
const float top = [...];
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_QUADS);
float x = 0.0f;
for (int i=0; i<numMeters; i++)
{
const float y = _meterHeight[i];
glColor3f(_meterColorRed[i], _meterColorGreen[i], _meterColorBlue[i]);
glVertex2f(x, top);
glVertex2f(x+meterWidth, top);
glVertex2f(x+meterWidth, y);
glVertex2f(x, y);
x += meterWidth;
}
glEnd();
}
};
【问题讨论】: