c++ - Qt Directx 渲染

标签 c++ qt directx

我正在通过 DirectX 在 Qt 小部件中进行渲染。 我禁用了 qt 绘图引擎

QPaintEngine *paintEngine() const { return NULL; }

但有时我想启用 qt paint 并禁用 directX 渲染。 我正在禁用 DirectX 渲染,但如何才能启用 Qt paintEngine?

最佳答案

可能的解决方案包括:

  1. 使用 QWindow,然后在 [raster][0] 和 DirectX 之间切换渲染。

  2. 使用 DirectX 呈现的 QWindowQWidget,并将可选内容呈现为 QImage。您可以将该图像用作纹理,并轻松地将其覆盖在 DirectX 渲染的内容上。

  3. 一个只需少量代码更改的快速解决方法是在每次呈现模式更改时重新创建小部件。这可以通过将小部件的状态驻留在 PIMPL 中来非常干净地实现。 .请参阅下面的示例。

class MyWidgetPrivate {
public:
  bool qtRendering;
  // your data members etc.
  MyWidgetPrivate(bool qtRendering) :
    qtRendering(qtRendering)
  {}
};

class MyWidget : public QWidget {
  Q_OBJECT
  Q_DECLARE_PRIVATE(MyWidget)
  QScopedPointer<MyWidgetPrivate> const d_ptr;

  QPaintEngine *paintEngine() const {
    Q_D(const MyWidget);
    return d->qtRendering ? QWidget::paintEngine() : nullptr;
  }

  MyWidget(QScopedPointer<MyWidgetPrivate> & data, QWidget * parent, bool qtRendering) :
    QWidget(parent),
    d_ptr(data.take())
  {
     d_ptr->qtRendering = qtRendering;
  }
public:
  MyWidget(QWidget * parent, bool qtRendering) :
    QWidget(parent),
    d_ptr(new MyWidgetPrivate(qtRendering))
  {}

  void setQtRendering(bool qtRendering) {
    if (qtRendering == d_ptr->qtRendering) return;
    auto geom = geometry();
    auto parent = this->parentWidget();
    auto & d = const_cast<QScopedPointer<MyWidgetPrivate>&>(d_ptr);
    QScopedPointer<MyWidgetPrivate> pimpl(d.take());
    this->~MyWidget(); // destroy in place
    new (this) MyWidget(pimpl, parent, qtRendering); // reconstruct in place
    setGeometry(geom);
  }
};

关于c++ - Qt Directx 渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34220730/

相关文章:

c++ - 使用 += 将字符分配给 char 数组

c++ - 如何定义模板的模板化子类?

c++ - 限制成员函数的限定符(限制此指针)

qt - 缺少文件 [Qt]

qt - QML ListView 代表 z 顺序始终位于其他所有内容之上

DirectX:游戏循环顺序,先绘制再处理输入?

c++ - 为什么不能在函数中使用模板别名作为参数并自动推导?

python - 如何在 QItemDelegate sizeHint() 中获取 QTreeView 单元格宽度?

c++ - 二维 map 查看器未处理的异常

directx - 如何检测显卡支持的v3以上的DirectX shader模型?