2017-01-24 7 views
1

Qt 컨텍스트에서 Irrlicht를 사용하고 있습니다. 이렇게하려면 QWidget에 Irrlicht 장치를 표시하는 IrrlichtWidget 클래스가 있습니다. 나는 QMessageBox을 사용할 때까지이 잘 작동QMessageBox를 열 때 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을 사용하려고 할 때, 나는 메시지 박스가 열릴 때마다 Irrlicht 위젯이 검게 변한다는 것을 알아 차렸다. 내가 이런 짓을 할 때, 배경이 검은 색이었다

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

가이처럼 보였다 그래서 무슨 일이 있었는지 알아보십시오, 나는으로 Irrlicht 메인 루프에 QMessageBox을 삽입

여기에, 비교 그것의 QMessageBox이없는 것을 유일한 차이점과 정확히 같은 프로그램입니다하려면

what i want

처음에는 Irrlicht의 메인 루프에있는 QMessageBox을 끼워 넣으려고했는데, 결국, 중간에, 그리고 항상 똑같은 일을합니다. 그것은 Qt는 대화 상자의 모든 종류에 대해이 작업을 수행합니다 QMessageBox, QFileDialog

나는 또한 생성자에서 setAttribute(Qt::WA_OpaquePaintEvent) 라인을 제거하려하고 배경은 베이지 색 대신 검은 색이었다. 같은 색깔은 아니지만 여전히 같은 문제입니다.

QMessageBox은 Irrlicht 위젯의 내용을 어떻게 든 지우는 것처럼 보입니다. 왜이 일을하는거야? 어떻게 해결할 수 있습니까?

답변

0

QMessageBox의 정적 함수 (예 : QMessageBox::information)가 주 루프를 차단하여 Irrlicht 위젯이 검게 변하는 문제가 있습니다. 이것을 피하는 방법은 QMessageBox 개체를 만들고 open() 메서드를 사용하여 개체를 여는 것입니다. 정적 함수에서 사용하는 exec() 메서드는 주 루프를 차단하고 Irrlicht 위젯을 검정색으로 바꿉니다. 그러나 open() 메서드는 주 루프를 차단하지 않으므로 작동합니다.

나는 QMessageBox::information과 같은 일을하지만 Irrlicht와 함께 작동하는 open()을 사용하여 함수를 만들었습니다. open() 메서드가 주 루프를 차단하지 않기 때문에 내가 만든 함수는 람다와 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); 
     } 
    }); 
} 

아래 코드는 사용자 요청합니다. 사용자가 예를 클릭하면 "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); 
관련 문제