gpt4 book ai didi

c++ - 为什么打开 QMessageBox 时 Irrlicht 窗口变黑?

转载 作者:太空宇宙 更新时间:2023-11-04 13:06:51 25 4
gpt4 key购买 nike

我在 Qt 上下文中使用 Irrlicht。为此,我有一个 IrrlichtWidget 类,它在 QWidget 中显示一个 Irrlicht 设备。这是该类(class)的相关部分:

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");
});

当我这样做时,背景是黑色的:

black background with message box

为了比较,这是完全相同的程序,唯一的区别是它没有 QMessageBox:

what i want

我尝试将 QMessageBox 放在 Irrlicht 主循环的任何地方,在开头、结尾、中间,它总是做同样的事情。它为每一种 Qt 对话框执行此操作:QMessageBoxQFileDialog 等。

我还尝试删除构造函数中的 setAttribute(Qt::WA_OpaquePaintEvent) 行,然后背景变成了米色而不是黑色。颜色不一样,但还是一样的问题。

QMessageBox 似乎以某种方式删除了 Irrlicht 小部件的内容。为什么要这样做?我该如何解决?

最佳答案

问题是 QMessageBox 的静态函数(如 QMessageBox::information)阻塞了主循环,使 Irrlicht 小部件变黑。避免这种情况的一种方法是创建一个 QMessageBox 对象并使用 open() 方法打开它。静态函数使用的 exec() 方法阻塞主循环并使 Irrlicht 小部件变黑,但 open() 方法不阻塞主循环循环,因此它有效。

我使用 open() 创建了一个函数,它做的事情与 QMessageBox::information 相同,但适用于 Irrlicht。由于 open() 方法不会阻塞主循环,我创建的函数使用 lambda 和 finished 信号来处理消息框关闭后发生的事情。这是该函数以及如何使用它的示例:

#include <QMessageBox>
#include <functional>

void showMessageBox(std::function<void(QMessageBox::StandardButton)> lambda, QWidget *parent, const QString &title, const QString &text, QMessageBox::Icon icon = QMessageBox::Information, QFlags<QMessageBox::StandardButton> buttons = QMessageBox::Ok){
QMessageBox *messageBox = new QMessageBox(icon, title, text, buttons, parent);
messageBox->open(NULL, NULL);
QObject::connect(messageBox, &QMessageBox::finished, [messageBox, lambda](){
if(messageBox->clickedButton() == messageBox->button(QMessageBox::Ok)){
lambda(QMessageBox::Ok);
}
else if(messageBox->clickedButton() == messageBox->button(QMessageBox::Open)){
lambda(QMessageBox::Open);
}
else if(messageBox->clickedButton() == messageBox->button(QMessageBox::Save)){
lambda(QMessageBox::Save);
}
else if(messageBox->clickedButton() == messageBox->button(QMessageBox::Cancel)){
lambda(QMessageBox::Cancel);
}
else if(messageBox->clickedButton() == messageBox->button(QMessageBox::Close)){
lambda(QMessageBox::Close);
}
else if(messageBox->clickedButton() == messageBox->button(QMessageBox::Discard)){
lambda(QMessageBox::Discard);
}
else if(messageBox->clickedButton() == messageBox->button(QMessageBox::Apply)){
lambda(QMessageBox::Apply);
}
else if(messageBox->clickedButton() == messageBox->button(QMessageBox::Reset)){
lambda(QMessageBox::Reset);
}
else if(messageBox->clickedButton() == messageBox->button(QMessageBox::RestoreDefaults)){
lambda(QMessageBox::RestoreDefaults);
}
else if(messageBox->clickedButton() == messageBox->button(QMessageBox::Help)){
lambda(QMessageBox::Help);
}
else if(messageBox->clickedButton() == messageBox->button(QMessageBox::SaveAll)){
lambda(QMessageBox::SaveAll);
}
else if(messageBox->clickedButton() == messageBox->button(QMessageBox::Yes)){
lambda(QMessageBox::Yes);
}
else if(messageBox->clickedButton() == messageBox->button(QMessageBox::YesToAll)){
lambda(QMessageBox::YesToAll);
}
else if(messageBox->clickedButton() == messageBox->button(QMessageBox::No)){
lambda(QMessageBox::No);
}
else if(messageBox->clickedButton() == messageBox->button(QMessageBox::NoToAll)){
lambda(QMessageBox::NoToAll);
}
else if(messageBox->clickedButton() == messageBox->button(QMessageBox::Abort)){
lambda(QMessageBox::Abort);
}
else if(messageBox->clickedButton() == messageBox->button(QMessageBox::Retry)){
lambda(QMessageBox::Retry);
}
else if(messageBox->clickedButton() == messageBox->button(QMessageBox::Ignore)){
lambda(QMessageBox::Ignore);
}
else{
lambda(QMessageBox::NoButton);
}
});
}

下面的代码询问用户是否要打开一个新对话框。如果用户单击"is",它会打开一个对话框,显示“Hello World!”,否则什么也不会发生。

IrrlichtWidget myWidget = new IrrlichtWidget;    //IrrlichtWidget is the class mentioned in the question
showMessageBox([](QMessageBox::StandardButton result){
if(result == QMessageBox::Yes){
showMessageBox([](QMessageBox::StandardButton){}, myWidget, "Hello", "Hello world!");
}
}, myWidget, "Title", "Do you want to open a new dialog box?", QMessageBox::Question, QMessageBox::Yes | QMessageBox::No);

关于c++ - 为什么打开 QMessageBox 时 Irrlicht 窗口变黑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41840722/

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