首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qt Directx渲染

Qt Directx渲染
EN

Stack Overflow用户
提问于 2015-12-11 18:01:20
回答 2查看 1.2K关注 0票数 1

我是用DirectX的Qt小工具渲染的。我禁用了qt画图引擎

代码语言:javascript
复制
QPaintEngine *paintEngine() const { return NULL; }

但有时我想启用qt绘图并禁用directX渲染。我正在禁用DirectX渲染,但是如何启用Qt paintEngine?

EN

回答 2

Stack Overflow用户

发布于 2015-12-12 00:32:42

可能的解决方案包括:

  1. 使用QWindow,然后在raster和DirectX之间切换呈现。
  2. 使用DirectX呈现的QWindowQWidget,并将可选内容呈现为QImage。您可以将该图像用作纹理,并轻松地将其覆盖到由DirectX呈现的内容上。
  3. 一种只需少量代码更改即可快速解决的方法是在每次呈现模式更改时重新创建小工具。这可以通过将小部件的状态驻留在PIMPL中来非常干净地实现。请参阅下面的示例。

代码语言:javascript
复制
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);
  }
};
票数 1
EN

Stack Overflow用户

发布于 2016-01-27 00:40:26

使用

QWidget::setAttribute(Qt::WA_OpaquePaintEvent,false);

若要在小工具上重新启用Qt背景绘制,请执行以下操作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34220730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档