Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
QML Qt / Qml / 6_QML и C (пример).doc
Скачиваний:
97
Добавлен:
28.03.2016
Размер:
978.94 Кб
Скачать

Написание приложения

Теперь мы можем перейти к написанию непосредственно приложения, которое будет решать нашу задачу.

Построение интерфейса.

23. На данный момент main.qml выглядит так:

import QtQuick 1.0

Rectangle {

width: 100

height: 62

}

Отредактируем его, изменив главный прямоугольник-окно:

import QtQuick 1.0

//Главное окно

Rectangle {

width: 300

height: 300

anchors.fill: parent

}

24. Добавим простейшую кнопку на нашу форму.

//Кнопка

Rectangle {

id: button //Имя кнопки

//Размещаем в центре

x: parent.width / 2 - button.width / 2;

y: parent.height / 2 - button.height / 2;

//Размеры кнопки

width: 100

height: 30

//Цвет кнопки

color: "gray"

//Текст кнопки

Text {

id: buttonLabel

text: "Пуск"

anchors.centerIn: parent;

}

//Действие мыши

MouseArea {

anchors.fill: parent

id: mouseArea

}

}

В результате main.qml примет вид:

import QtQuick 1.0

Rectangle {

width: 300

height: 300

anchors.fill: parent

//Кнопка

Rectangle {

id: button //Имя кнопки

//Размещаем в центре

x: parent.width / 2 - button.width / 2;

y: parent.height / 2 - button.height / 2;

//Размеры кнопки

width: 100

height: 30

//Цвет кнопки

color: "gray"

//Текст кнопки

Text {

id: buttonLabel

text: "Пуск"

anchors.centerIn: parent;

}

//Действие мыши

MouseArea {

anchors.fill: parent

id: mouseArea

}

}

}

Если мы запустим приложение, то получим следующее:25. Добавим строку ввода, куда пользователь будет вводить информацию с именем textinput.

//Строка ввода

Rectangle {

id: textinputRect //Имя строки ввода

//Размещаем ниже

x: parent.width / 2 - button.width / 2;

y: parent.height / 2 - button.height / 2+40;

//Размеры строки ввода

width: 100

height: 18

//цвет строки ввода

color: "gray"

TextInput {

id: textinput

objectName: "textinput"

color: "#151515";

selectionColor: "blue"

font.pixelSize: 12;

width: parent.width-4

anchors.centerIn: parent

focus: true

text:"1"

}

}

В результате main.qml примет вид:

import QtQuick 1.0

Rectangle {

width: 300

height: 300

anchors.fill: parent

//Кнопка

Rectangle {

id: button //Имя кнопки

//Размещаем в центре

x: parent.width / 2 - button.width / 2;

y: parent.height / 2 - button.height / 2;

//Размеры кнопки

width: 100

height: 30

//Цвет кнопки

color: "gray"

//Текст кнопки

Text {

id: buttonLabel

text: "Пуск"

anchors.centerIn: parent;

}

//Действие мыши

MouseArea {

anchors.fill: parent

id: mouseArea

}

}

//Строка ввода

Rectangle {

id: textinputRect //Имя строки ввода

//Размещаем ниже

x: parent.width / 2 - button.width / 2;

y: parent.height / 2 - button.height / 2+40;

//Размеры строки ввода

width: 100

height: 18

//цвет строки ввода

color: "gray"

TextInput {

id: textinput

objectName: "textinput"

color: "#151515";

selectionColor: "blue"

font.pixelSize: 12;

width: parent.width-4

anchors.centerIn: parent

focus: true

text:"1"

}

}

}

Обратите внимание на следующее:

  • Для того, чтобы мы смогли обращаться к строке ввода из С++ у нас кроме параметра id есть еще параметр objectName, который заключается в двойные кавычки.

  • Информация, которая нам потом будет нужна, содержится в параметре text.

При запуске получим следующее: 26. Добавим поле вывода, куда программа будет выводить ответ с именем memo.

//Поле вывода

Rectangle {

id: memoRect //Имя поля вывода

//Размещаем ниже

x: parent.width / 2 - button.width / 2;

y: parent.height / 2 - button.height / 2+70;

//Размеры поле вывода

width: 100

height: 35

//Цвет поля вывода

color: "gray"

TextEdit{

id: memo

objectName: "memo"

wrapMode: TextEdit.Wrap

width:parent.width;

readOnly:true

}

}

В результате main.qml примет вид:

import QtQuick 1.0

Rectangle {

width: 300

height: 300

anchors.fill: parent

//Кнопка

Rectangle {

id: button //Имя кнопки

//Размещаем в центре

x: parent.width / 2 - button.width / 2;

y: parent.height / 2 - button.height / 2;

//Размеры кнопки

width: 100

height: 30

//Цвет кнопки

color: "gray"

//Текст кнопки

Text {

id: buttonLabel

text: "Пуск"

anchors.centerIn: parent;

}

//Действие мыши

MouseArea {

anchors.fill: parent

id: mouseArea

}

}

//Строка ввода

Rectangle {

id: textinputRect //Имя строки ввода

//Размещаем ниже

x: parent.width / 2 - button.width / 2;

y: parent.height / 2 - button.height / 2+40;

//Размеры строки ввода

width: 100

height: 18

//цвет строки ввода

color: "gray"

TextInput {

id: textinput

objectName: "textinput"

color: "#151515";

selectionColor: "blue"

font.pixelSize: 12;

width: parent.width-4

anchors.centerIn: parent

focus: true

text:"1"

}

}

//Поле вывода

Rectangle {

id: memoRect //Имя поля вывода

//Размещаем ниже

x: parent.width / 2 - button.width / 2;

y: parent.height / 2 - button.height / 2+70;

//Размеры поле вывода

width: 100

height: 35

//Цвет поля вывода

color: "gray"

TextEdit{

id: memo

objectName: "memo"

wrapMode: TextEdit.Wrap

width:parent.width;

readOnly:true

}

}

}

При запуске получим следующее: Итак, мы описали интерфейс нашей программы.

C++ часть

27. При нажатии на кнопку пока ничего не происходит. Исправим это. Для начала установим взаимосвязь между QML моделью и C++ кодом. Для этого отредактируем файл mainwindow.cpp, а именно функцию MainWindow, добавив строчки:

//Находим корневой элемент

Root = ui->rootObject();

//Соединяем C++ и QML, делая видимым функции С++ через элемент window

ui->rootContext()->setContextProperty("window", this);

Получим следующее:

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :

QMainWindow(parent)

{

//Включаем наш QML

ui = new QDeclarativeView;

ui->setSource(QUrl("qrc:/main.qml"));

setCentralWidget(ui);

ui->setResizeMode(QDeclarativeView::SizeRootObjectToView);

//Находим корневой элемент

Root = ui->rootObject();

//Соединяем C++ и QML, делая видимым функции С++ через элемент window

ui->rootContext()->setContextProperty("window", this);

}

MainWindow::~MainWindow()

{

//Удаляем QML

delete ui;

}

28. В добавленном коде у нас присутствует необъявленная переменная Root . Через нее мы потом будем производить поиск всех других дочерних элементов. Объявим ее в mainwindow.h в классе в разделе private:

QObject *Root;//корневой элемент QML модели

В результате получим:

#ifndef MAINWINDOW_H

#define MAINWINDOW_H

#include <QMainWindow>

#include <QtDeclarative/QDeclarativeView>

#include <QGraphicsObject>

#include <QtGui>

#include <QDeclarativeContext>

namespace Ui {

class MainWindow;

}

class MainWindow : public QMainWindow

{

Q_OBJECT

public:

explicit MainWindow(QWidget *parent = 0);

~MainWindow();

private:

QDeclarativeView *ui;

QObject *Root;//корневой элемент QML модели

};

#endif // MAINWINDOW_H

29. Пусть у нас кнопка из QML будет вызывать С++ функцию под произвольным именем FunctionC. Объявим ее в mainwindow.h в классе в разделе public:

Q_INVOKABLE void FunctionC();//Функция C++ вызываемая из QML

В результате получим:

#ifndef MAINWINDOW_H

#define MAINWINDOW_H

#include <QMainWindow>

#include <QtDeclarative/QDeclarativeView>

#include <QGraphicsObject>

#include <QtGui>

#include <QDeclarativeContext>

namespace Ui {

class MainWindow;

}

class MainWindow : public QMainWindow

{

Q_OBJECT

public:

explicit MainWindow(QWidget *parent = 0);

~MainWindow();

Q_INVOKABLE void FunctionC();//Функция C++ вызываемая из QML

private:

QDeclarativeView *ui;

QObject *Root;//корневой элемент QML модели

};

#endif // MAINWINDOW_H

Обратите внимание на ключевое слово Q_INVOKABLE. Именно она делает видимой функцию для QML. 30. Теперь опишем нашу функцию в mainwindow.cpp:

void MainWindow::FunctionC()

{

//Найдем строку ввода

QObject* textinput = Root->findChild<QObject*>("textinput");

//Найдем поле вывода

QObject* memo = Root->findChild<QObject*>("memo");

QString str;//Создадим новую строковую переменную

//Считаем информацию со строки ввода через свойство text

str=(textinput->property("text")).toString();

int a;

a=str.toInt();//Переведем строку в число

a++;//Добавим к числу 1

QString str2;//Создадим еще одну строковую переменную

str2=QString::number(a);//Переведем число в строку

//Ну и наконец выведем в поле вывода нашу информацию

memo->setProperty("text", str+"+1="+str2);

}

31. Ну и наконец добавим нашу функцию в обработчике нашей кнопки QML в файле main.qml. Обработчик действий мыши сейчас выглядит так:

//Действие мыши

MouseArea {

anchors.fill: parent

id: mouseArea

}

Теперь же он станет таким:

//Действие мыши

MouseArea {

anchors.fill: parent

id: mouseArea

//При нажатии вызвать фугкцию window.FunctionC()

onClicked: window.FunctionC()

}

В итоге получим:

import QtQuick 1.0

Rectangle {

width: 300

height: 300

anchors.fill: parent

//Кнопка

Rectangle {

id: button //Имя кнопки

//Размещаем в центре

x: parent.width / 2 - button.width / 2;

y: parent.height / 2 - button.height / 2;

//Размеры кнопки

width: 100

height: 30

//Цвет кнопки

color: "gray"

//Текст кнопки

Text {

id: buttonLabel

text: "Пуск"

anchors.centerIn: parent;

}

//Действие мыши

MouseArea {

anchors.fill: parent

id: mouseArea

//При нажатии вызвать фугкцию window.FunctionC()

onClicked: window.FunctionC()

}

}

//Строка ввода

Rectangle {

id: textinputRect //Имя строки ввода

//Размещаем ниже

x: parent.width / 2 - button.width / 2;

y: parent.height / 2 - button.height / 2+40;

//Размеры строки ввода

width: 100

height: 18

//цвет строки ввода

color: "gray"

TextInput {

id: textinput

objectName: "textinput"

color: "#151515";

selectionColor: "blue"

font.pixelSize: 12;

width: parent.width-4

anchors.centerIn: parent

focus: true

text:"1"

}

}

//Поле вывода

Rectangle {

id: memoRect //Имя поля вывода

//Размещаем ниже

x: parent.width / 2 - button.width / 2;

y: parent.height / 2 - button.height / 2+70;

//Размеры поле вывода

width: 100

height: 35

//Цвет поля вывода

color: "gray"

TextEdit{

id: memo

objectName: "memo"

wrapMode: TextEdit.Wrap

width:parent.width;

readOnly:true

}

}

}

Обратите внимание на то, что функцию вызываем через window. Вот и всё! Теперь запускаем программу и нажимаем на кнопку. Если Вы всё сделали правильно и я не допустил ошибок, то Вы увидете: Ссылка на исходники:Скачать. Ссылка на исполняемый файл: Скачать.