QOpenGLWindow 如何调用QPainter绘制标准控件,请用完整的C++代码展示
时间: 2023-07-16 07:12:16 浏览: 150
可以通过在 QOpenGLWindow 中使用 QBackingStore 和 QWidget::createWindowContainer() 方法来创建一个 QWidget 并在其上使用 QPainter 绘制标准控件。以下是一个完整的 C++ 代码示例:
```cpp
#include <QtGui/QPainter>
#include <QtWidgets/QApplication>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QWidget>
#include <QtGui/QOpenGLFunctions>
#include <QtGui/QOpenGLWindow>
#include <QtGui/QSurfaceFormat>
class OpenGLWidget : public QOpenGLWindow, protected QOpenGLFunctions {
public:
OpenGLWidget() {
setSurfaceType(QWindow::OpenGLSurface);
}
void initializeGL() override {
initializeOpenGLFunctions();
}
void paintGL() override {
// Create a QWidget and QBackingStore
QWidget widget;
QBackingStore* backingStore = new QBackingStore(&widget);
// Set up the QPainter
QPainter painter(backingStore->paintDevice());
painter.setRenderHint(QPainter::Antialiasing);
painter.setRenderHint(QPainter::TextAntialiasing);
// Draw a QPushButton
QPushButton button("Hello, world!", &widget);
button.setGeometry(10, 10, 100, 30);
button.show();
button.render(&painter);
// Flush the QPainter and swap buffers
painter.end();
backingStore->flush(QRect(QPoint(0, 0), size()));
swapBuffers();
}
};
int main(int argc, char* argv[]) {
QApplication app(argc, argv);
// Set up the OpenGL surface format
QSurfaceFormat format;
format.setVersion(3, 3);
format.setProfile(QSurfaceFormat::CoreProfile);
format.setDepthBufferSize(24);
QSurfaceFormat::setDefaultFormat(format);
// Create the OpenGL widget and show it
OpenGLWidget widget;
widget.resize(640, 480);
widget.show();
return app.exec();
}
```
该示例创建了一个 QOpenGLWindow,并使用 QPainter 在其上绘制了一个 QPushButton 控件。注意,在 paintGL() 函数中,我们创建了一个 QWidget 和 QBackingStore,并在其上使用 QPainter 进行绘制。最后,我们将 QPainter 刷新到 QBackingStore 中,并使用 swapBuffers() 方法交换前后缓冲区。
阅读全文