• 1795阅读
  • 0回复

[提问]把SDL2嵌入Qt,显示不完整问题 [复制链接]

上一主题 下一主题
离线taowyoo
 

只看楼主 倒序阅读 楼主  发表于: 2021-03-02
最新在为我的SDL2游戏项目写一个编辑器,
想要用SDL2 画游戏画面到一个 Qt widget上。
网上搜了很多,最终一下代码能运行,但是有显示错误


有个白色方块挡在sdl2 画的widget前面

下面是代码
widget.h
  1. #ifndef WIDGET_H
  2. #define WIDGET_H
  3. #include <SDL2/SDL.h>
  4. #include <SDL2/SDL_image.h>
  5. #include <QWidget>
  6. #include <QPaintEvent>
  7. class SDL2Widget : public QWidget
  8. {
  9.     Q_OBJECT
  10. public:
  11.     SDL2Widget(QWidget* parent=0);
  12.     ~SDL2Widget();
  13. protected:
  14.     void paintEvent(QPaintEvent* event);
  15. private:
  16.     SDL_Window *window;
  17.     SDL_Renderer *render;
  18.     SDL_Surface *surface;
  19.     SDL_Texture *texture;
  20. };
  21. #endif // WIDGET_H



widget.cpp
  1. #include "widget.h"
  2. SDL2Widget::SDL2Widget(QWidget* parent) : QWidget(parent) {
  3.   //    setAttribute(Qt::WA_PaintOnScreen);
  4.   /* SDL2 */
  5.   SDL_Init(SDL_INIT_EVERYTHING);
  6.   /* 把QWidget转换为SDL_Window */
  7.   window = SDL_CreateWindowFrom((void*)this->winId());
  8.   /* SDL2 Image初始化 */
  9.   IMG_Init(IMG_INIT_JPG);
  10.   /* 加载图片,创建surface */
  11.   surface = IMG_Load("demo.jpg");
  12.   //    QImage img(static_cast<uchar*>(surface->pixels), surface->w, surface->h,
  13.   //    QImage::Format_RGB32);
  14.   /* 在window上创建一个render */
  15.   render = SDL_CreateRenderer(
  16.       window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
  17. }
  18. SDL2Widget::~SDL2Widget() {
  19.   SDL_DestroyTexture(texture);
  20.   SDL_DestroyRenderer(render);
  21. }
  22. /* 绘图操作必须在paintEvent事件里进行 */
  23. void SDL2Widget::paintEvent(QPaintEvent* event) {
  24.   /* 创建一个texture */
  25.   texture = SDL_CreateTextureFromSurface(render, surface);
  26.   /* 清空render的内容 */
  27.   SDL_RenderClear(render);
  28.   /* 将texture复制到render上 */
  29.   SDL_RenderCopy(render, texture, NULL, NULL);
  30.   /* 将render显示到window上 */
  31.   SDL_RenderPresent(render);
  32. }

main.cpp
  1. #include <QApplication>
  2. #include <QLayout>
  3. #include <QPushButton>
  4. #include "widget.h"
  5. int main(int argc, char* argv[]) {
  6.   QApplication app(argc, argv);
  7.   QBoxLayout* layout = new QBoxLayout(QBoxLayout::TopToBottom);
  8.   SDL2Widget* sdlWidget = new SDL2Widget();
  9.   QPushButton* button = new QPushButton("Button");
  10.   layout->addWidget(sdlWidget);
  11.   layout->addWidget(button);
  12.   QWidget w;
  13.   w.setLayout(layout);
  14.   w.show();
  15.   w.resize(640, 400);
  16.   return app.exec();
  17. }


快速回复
限100 字节
 
上一个 下一个