gpt4 book ai didi

c++ - Qt Directx 渲染

转载 作者:行者123 更新时间:2023-11-30 05:34:30 27 4
gpt4 key购买 nike

我正在通过 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com