|
最新在为我的 SDL2游戏项目写一个编辑器, 想要用SDL2 画游戏画面到一个 Qt widget上。 网上搜了很多,最终一下代码能运行,但是有 显示错误: 有个白色方块挡在sdl2 画的widget前面 下面是代码 widget.h- #ifndef WIDGET_H
- #define WIDGET_H
- #include <SDL2/SDL.h>
- #include <SDL2/SDL_image.h>
- #include <QWidget>
- #include <QPaintEvent>
- class SDL2Widget : public QWidget
- {
- Q_OBJECT
- public:
- SDL2Widget(QWidget* parent=0);
- ~SDL2Widget();
- protected:
- void paintEvent(QPaintEvent* event);
- private:
- SDL_Window *window;
- SDL_Renderer *render;
- SDL_Surface *surface;
- SDL_Texture *texture;
- };
- #endif // WIDGET_H
widget.cpp- #include "widget.h"
- SDL2Widget::SDL2Widget(QWidget* parent) : QWidget(parent) {
- // setAttribute(Qt::WA_PaintOnScreen);
- /* SDL2 */
- SDL_Init(SDL_INIT_EVERYTHING);
- /* 把QWidget转换为SDL_Window */
- window = SDL_CreateWindowFrom((void*)this->winId());
- /* SDL2 Image初始化 */
- IMG_Init(IMG_INIT_JPG);
- /* 加载图片,创建surface */
- surface = IMG_Load("demo.jpg");
- // QImage img(static_cast<uchar*>(surface->pixels), surface->w, surface->h,
- // QImage::Format_RGB32);
- /* 在window上创建一个render */
- render = SDL_CreateRenderer(
- window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
- }
- SDL2Widget::~SDL2Widget() {
- SDL_DestroyTexture(texture);
- SDL_DestroyRenderer(render);
- }
- /* 绘图操作必须在paintEvent事件里进行 */
- void SDL2Widget::paintEvent(QPaintEvent* event) {
- /* 创建一个texture */
- texture = SDL_CreateTextureFromSurface(render, surface);
- /* 清空render的内容 */
- SDL_RenderClear(render);
- /* 将texture复制到render上 */
- SDL_RenderCopy(render, texture, NULL, NULL);
- /* 将render显示到window上 */
- SDL_RenderPresent(render);
- }
main.cpp- #include <QApplication>
- #include <QLayout>
- #include <QPushButton>
- #include "widget.h"
- int main(int argc, char* argv[]) {
- QApplication app(argc, argv);
- QBoxLayout* layout = new QBoxLayout(QBoxLayout::TopToBottom);
- SDL2Widget* sdlWidget = new SDL2Widget();
- QPushButton* button = new QPushButton("Button");
- layout->addWidget(sdlWidget);
- layout->addWidget(button);
- QWidget w;
- w.setLayout(layout);
- w.show();
- w.resize(640, 400);
- return app.exec();
- }
|