понедельник, 11 февраля 2013 г.

Совместное использование QML и C++(QT)

полезное место:
http://qml.ucoz.com/publ/stati_po_qml/integracija_qml_i_c/5-1-0-14

1. В файле проекта для совместной работы необходимо добавить
QT+=declarative
2. Создаем класс и наследуем его от QDeclarativeView В конструкторе: при помощи метода setSource задаем корневой qml-файл
 setSource(QUrl("qrc:/TextEditor.qml"));
Получаем контекст из qml и устанавливаем для него свойство, которое будет видно из qml
QDeclarativeContext *context = rootContext();
context->setContextProperty("window",this);

так как QDeclarativeView является потомком QWidget, можно там же задать и другие сфойства, например размеры окна

полезно задать
setResizeMode(QDeclarativeView::SizeRootObjectToView);
3. Задаем слоты, которые будут доступны из qml

public slots:
    void alarm() {
        QMessageBox::information(0,"111","222");
    }

4. теперь из qml мы можем вызвать слот
onButtonClicked: {
                    screen.imageFile = window.alarm()

                }

класс:
class QmlViewer : public QDeclarativeView{
    Q_OBJECT


public:
    QmlViewer(QDeclarativeView *prnt=0) :QDeclarativeView(prnt) {


        setSource(QUrl("qrc:/TextEditor.qml"));

        QDeclarativeContext *context = rootContext();
        context->setContextProperty("window",this);


        setResizeMode(QDeclarativeView::SizeRootObjectToView);
        setMinimumSize(500,400);


    }
public slots:
    void alarm() {
        QMessageBox::information(0,"111","222");
    }
    QString getFileName() {
        return QFileDialog::getOpenFileName(0,QObject::tr("Открыть файд"),"","*.jpg");
    }

};