我正在通过 DirectX 在 Qt 小部件中进行渲染。 我禁用了 qt 绘图引擎
QPaintEngine *paintEngine() const { return NULL; }
但有时我想启用 qt paint 并禁用 directX 渲染。 我正在禁用 DirectX 渲染,但如何才能启用 Qt paintEngine?
最佳答案
可能的解决方案包括:
使用
QWindow
,然后在 [raster][0] 和 DirectX 之间切换渲染。使用 DirectX 呈现的
QWindow
或QWidget
,并将可选内容呈现为QImage
。您可以将该图像用作纹理,并轻松地将其覆盖在 DirectX 渲染的内容上。一个只需少量代码更改的快速解决方法是在每次呈现模式更改时重新创建小部件。这可以通过将小部件的状态驻留在 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/