2016-10-13 2 views
0

J'essaie d'afficher une boîte de dialogue de message à partir du thread de travail. L'utilisation de slots et de signaux est un moyen standard de communiquer avec/appelant des objets QML, mais lorsque la boîte de dialogue apparaît, son bouton est déblocable/ne répond pas.MessageDialog se bloque lorsqu'il est créé à partir de Slot qt

main.cpp

tester* test = new tester; 
QtConcurrent::run(test,tester::testFunction); 

tester.cpp

#include "tester.h" 
#include <QQmlEngine> 
#include <QQmlComponent> 

tester::tester(QObject *parent) : QObject(parent) { 
    QObject::connect(this,SIGNAL(show()),this,SLOT(showSlot())); 
} 
void tester::testFunction() { 
    emit show(); 
} 
void tester::showSlot(){ 
    QQmlEngine engine; 
    QQmlComponent component(&engine, QUrl(QLatin1String("qrc:/BlockingDialog.qml"))); 
    QObject *object = component.create(); 
    QMetaObject::invokeMethod(object, "open"); 
} 

tester.h

#include <QObject> 

class tester : public QObject{ 
    Q_OBJECT 
public: 
    explicit tester(QObject *parent = 0); 
    void testFunction(); 
signals: 
    void show(); 
public slots: 
    void showSlot(); 
}; 

BlockingDialog.qml

import QtQuick 2.7 
import QtQuick.Dialogs 1.2 

MessageDialog { 
    id:dialog  
} 

Répondre

2

Vous créez le moteur QML sur la pile dans showSlot(), il sera donc détruit lorsque la fonction se termine. L'approche typique du chargement de fichiers QML consiste à créer le moteur QML sur la pile dans main().