【发布时间】:2017-01-24 23:17:12
【问题描述】:
我在 Qt 上下文中使用 Irrlicht。为此,我有一个IrrlichtWidget 类,它在 QWidget 中显示一个 Irrlicht 设备。这是该类的相关部分:
class IrrlichtWidget : public QWidget{
Q_OBJECT
public:
IrrlichtWidget(){
irr::SIrrlichtCreationParameters params;
params.DriverType = irr::video::EDT_OPENGL;
params.WindowId = (void*)winId();
m_device = irr::createDeviceEx(params);
setAttribute(Qt::WA_OpaquePaintEvent);
m_timer = new QTimer;
m_timer->setInterval(0);
QObject::connect(m_timer, &QTimer::timeout, [this](){
m_device->getVideoDriver()->beginScene(true, true, irr::video::SColor(255, 255, 255, 255));
m_device->getSceneManager()->drawAll();
m_device->getVideoDriver()->endScene();
m_device->run();
});
m_timer->start();
}
private:
irr::IrrlichtDevice *m_device;
QTimer *m_timer;
}
在我使用QMessageBox 之前,这一切正常。当我使用这个类进行编程并想使用QMessageBox 时,我注意到每当消息框打开时,Irrlicht 小部件都会变黑。为了弄清楚发生了什么,我在 Irrlicht 主循环中插入了 QMessageBox,使其看起来像这样:
QObject::connect(m_timer, &QTimer::timeout, [this](){
m_device->getVideoDriver()->beginScene(true, true, irr::video::SColor(255, 255, 255, 255));
m_device->getSceneManager()->drawAll();
m_device->getVideoDriver()->endScene();
m_device->run();
QMessageBox::information(this, "Foo", "Bar");
});
当我这样做时,背景是黑色的:
为了比较,这里是完全相同的程序,唯一的区别是它没有QMessageBox:
我尝试将 QMessageBox 放在 Irrlicht 的主循环中的任何地方,在开头、结尾、中间,它总是做同样的事情。它对各种 Qt 对话框都执行此操作:QMessageBox、QFileDialog 等。
我还尝试删除构造函数中的setAttribute(Qt::WA_OpaquePaintEvent) 行,然后背景是米色而不是黑色。不一样的颜色,但还是一样的问题。
QMessageBox 似乎以某种方式擦除了 Irrlicht 小部件的内容。为什么要这样做?我该如何解决?
【问题讨论】:
标签: c++ qt irrlicht qmessagebox