[英]SDL2 Rendering into QWidget
我希望将我在GTK2和SDL1.2中编写的模拟器移植到使用QT5和SDL2.0.3。 到目前为止,只要模拟器在SDL2中独立工作并且GUI在QT中工作正常,它们都可以互动。 我的问题是尝试让SDL2出现在QWidget中。 这是使用窗口黑客方法在SDL1.2中正常工作的东西。
从我在线阅读的所有内容中,可以通过SDL_CreateWindowFrom
函数从QT Widget获取winId()
并将其传递给它。 但是,这似乎适用于使用openGL的情况。
我想知道的是当我只使用SDL2的标准绘图功能到纹理,没有OpenGL时如何做到这一点。 到目前为止,我所有的尝试都失败了,SDL根本没有出现在小部件中。
或者,我知道您可以将SDL_Suface转换为QImage。 每当QImage更新(60fps)时,我将如何让QT Widget更新。 与此相关的复杂因素是QT和SDL在单独的线程中运行。
如果有人知道指向我的方向或一些可能导致答案的有用示例代码,我会非常感激。 我没有提供代码,因为我还不确定如何做,提供任何代码。
EDIT
经过一些SDL和QT的试验。 我已经设法使用标准绘图工具将SDL2绘制到QWidget中。 但是,这仅在将渲染器设置为SDL_RENDERER_SOFTWARE
。 如果我尝试使用SDL_RENDERER_ACCELERATED
,我也SDL_RENDERER_ACCELERATED
。 它导致QT窗口完全锁定并且无法绘制任何内容(包括窗口中的所有其他小部件),并最终因操作系统没有响应而终止(在我的测试用例中为Kubuntu)。
有没有人知道为什么会这样。 我可以用SDL_RENDERER_ACCELERATED
罚款时,SDL2是借鉴与创造它自己的窗口SDL_CreateWindow
和SDL_CreateRenderer
。 绘制到QWidget时它只是一个问题。
这是我到目前为止的代码:
main.cpp中
#include "mainwindow.h"
#include <QApplication>
#include <SDL2/SDL.h>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
SDL_Init(SDL_INIT_VIDEO);
SDL_Window* window = SDL_CreateWindowFrom((void*)w.ptr_gfx->winId());
SDL_Renderer* render = SDL_CreateRenderer(window, -1, SDL_RENDERER_SOFTWARE);
SDL_SetRenderDrawColor(render, 255, 0, 0, 255);
SDL_RenderFillRect(render, NULL);
SDL_RenderPresent(render);
return a.exec();
SDL_DestroyWindow(window);
SDL_DestroyRenderer(render);
SDL_Quit();
}
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ptr_gfx = ui->gfx;
ui->gfx->setUpdatesEnabled(false);
}
MainWindow::~MainWindow()
{
delete ui;
}
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
Ui::MainWindow *ui;
QWidget* ptr_gfx;
};
#endif // MAINWINDOW_H
mainwindow.ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralWidget">
<widget class="QWidget" name="gfx" native="true">
<property name="geometry">
<rect>
<x>20</x>
<y>10</y>
<width>191</width>
<height>131</height>
</rect>
</property>
</widget>
</widget>
<widget class="QMenuBar" name="menuBar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>20</height>
</rect>
</property>
</widget>
<widget class="QToolBar" name="mainToolBar">
<attribute name="toolBarArea">
<enum>TopToolBarArea</enum>
</attribute>
<attribute name="toolBarBreak">
<bool>false</bool>
</attribute>
</widget>
<widget class="QStatusBar" name="statusBar"/>
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources/>
<connections/>
</ui>
使用新数据更新QImage
,只需调用窗口小部件的repaint()
方法,使其在屏幕上绘制自己。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.