Таким образом, решение состояло в том, чтобы создать собственный класс QPainter
с именем MyPainter
, который наследуется от QPainter
.
class MyPainter : public QPainter {
public:
MyPainter(QPaintDevice* device, ShaderProgram* sp);
bool end();
private:
ShaderProgram* shaderProgram;
};
В этом классе вы переопределяете end
() - метод QPainter
и реализуете его следующим образом:
MyPainter::MyPainter(QPaintDevice* device, ShaderProgram* sp)
: QPainter(device), shaderProgram(sp) {
}
bool MyPainter::end() {
beginNativePainting();
bool b = shaderProgram->bind();
return b;
}
Сначала вам нужно beginNativePainting()
опять же, когда QPainter
заканчивается после рисования чего-либо, а затем вам нужно снова связать текущую шейдерную программу.Обратите внимание, что ShaderProgram
в этом примере является унаследованным классом QOpenGLShaderProgram.
Теперь используйте этот MyPainter
вместо QPainter
в вашем QOpenGLWidget
классе в методе paintGL()
, и все должно работать нормально, и вы можетевызывать функции OpenGL и QPainter
методы в любое время.
Это решение было протестировано с Qt5.9.1, с Visual Studio 2015 и Windows 7.
Если что-то не работает, может быть, вы могли бы привести пример, что делаетне работает и как вы используете QPainter и OpenGL.Меня очень интересует «правильный» способ параллельного использования QPainter и OpenGL.