- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我希望将我在 GTK2 和 SDL1.2 中编写的模拟器移植到使用 QT5 和 SDL2.0.3 中。到目前为止,一切都很好,因为模拟器都可以独立地在 SDL2 中工作,而 GUI 在 QT 中也可以正常工作,并且它们都可以交互。我的问题是试图让 SDL2 出现在 QWidget 中。这在 SDL1.2 中使用窗口 hack 方法运行良好。
根据我在网上阅读的所有内容,这可以通过 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
,我也会喜欢。它导致 QT 窗口完全锁定并且无法绘制任何东西(包括窗口中的所有其他小部件),并最终因操作系统(在我的测试用例中为 Kubuntu)没有响应而被终止。
有没有人知道为什么会这样。当 SDL2 绘制到使用 SDL_CreateWindow
和 SDL_CreateRenderer
创建的自己的窗口时,我可以很好地使用 SDL_RENDERER_ACCELERATED
。只有在绘制到 QWidget 时才会出现问题。
这是我目前的代码:
主要.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();
}
主窗口.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;
}
主窗口.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
主窗口.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()
方法即可使其在屏幕上自行绘制。
关于c++ - SDL2 渲染到 QWidget,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25232756/
我有一个关于 c++ 中的 qt 的问题 头文件: #ifndef TIMER_H #define TIMER_H #include #include #include #include cl
我有以下代码: import os from functools import partial import numpy as np from PyQt5 import QtCore, QtWidge
我有一个 QWidget B,它包含在 QWidget A 中。QWidget A 有一个 QLabel。我在 QWidget B 中有一些数据,我想将其设置为 QLabel 的值。这种事情怎么办?
为了解释这种情况,我有一个 QMainWindow,里面有很多东西。我的目标是制作某种通知,显示在该窗口的右下角。 通知小部件必须位于所有其他小部件之上。 到目前为止,我已经创建了从 QWidget
这个问题对我来说可能是缺乏对 C++ 的理解,因为我为我的问题考虑过的所有可能性似乎都无法说明为什么会发生这种情况。感谢反馈。 我正在使用表单设计器创建一个包含表格的表单类。我正在尝试用辅助类中生成的
我选择使用 Qt 来管理我正在处理的项目的 GUI。 在找到如何在我的 QWidget 底部应用图片后,我注意到它对添加到其中的所有组件都有影响。 无论通过 setStyleSheet 方法或什至使用
我有一个带有两个小部件的主窗口,buttonsWidget 和 infoWidget。我试图在单击 buttonsWidget 中的按钮后隐藏 infoWidget(并最终显示不同的小部件)。 我试过
虽然 Qt's docs表明这两个功能是不同的(第一个不包括框架)无论我选择什么小部件 - 包括我的应用程序的主窗口 - someWidget->frameGeometry().height()始终返
这是包含一系列小部件的 QFormLayout 的屏幕截图。请注意,顶部和底部输入小部件未与中间两行水平对齐。另请注意,左侧的标签未与中间两行垂直对齐。 不同之处在于顶部和底部小部件是普通的 QLin
我有几个小部件,比如 QLineEdit m_namePoiFilter; QLineEdit m_ID_MSSIPoiFilter; 我想将它们添加到 qwi
我创建了一个非常简单的 QWidget 子类,如下所示: class WorldView : public QWidget { Q_OBJECT public: explicit Wo
我在屏幕上有很多固定的 qwidgets,还有很多其他的 widgets 我可以在屏幕上拖动。当一个小部件被拖动到固定小部件之上时,固定小部件需要执行一些代码。我无法弄清楚静止对象如何知道它上面有一个
我正在使用 Qt 设计器 4.8.7,从它开始。我创建了一个 MainWindow ,我想在其中加载布局。 我有一个小部件,由 Qt 设计器使用 pyuic4 生成。 我加载我的小部件正在做 self
我正在尝试使 QWidget 粘在屏幕右边框上,并在左侧显示/隐藏另一个 QWidget。我们的目标是在决赛中实现类似的目标: ---------------------------------- |
完全使用 QT Designer。我创建了一个 QWidget 来封装一组控件。我现在想在 QMainWindow 表单中多次使用此 QWidget。 如何仅使用 QT Designer 将我的 QW
我有一组出现在不同地方的小弹出窗口小部件,但每次只出现一个。对于简单的功能,new-to-show 和 delete-to-hide 没问题,并且按预期工作,但当它们开始处理自己的数据时,我可以看到内
我有一些 QWidget 类,它的 ui 文件与 QMainWindow ui 文件是分开的。 如何将粘附到 QMainWindow 的当前 QWidet 添加或替换为来自同一 QMainWindow
我正在使用基于 QWidget 的 PyQt 开发应用程序。我将整个应用程序放在一个类中(名为“示例”)。在这个应用程序中,我有一个按钮可以调用我在 QtDesigner 上设计的另一个 QWidge
在运行时尝试向 QWidget 添加按钮时,我遇到了一个奇怪的问题。我有一个带有 QTabWidget 的窗口,它有 2 个选项卡。当我按下窗口上的按钮时,它会在第一个选项卡上生成一组复选框。 问题是
我正在尝试运行一个简单的 Qt 程序,这样做时,我得到一个控制台窗口,提示:QWidget: Cannot create a QWidget when no GUI is being used,第二行
我是一名优秀的程序员,十分优秀!