Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Интеграция С++ в QML
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Quick
Anarchist_42
Всем здравствуйте, возникли некоторые трудности в написание программы на qml.

Что мне надо: вывод на экран изображения (несколько вложенных колец) которое зависит от параметров (берутся из inputText), по кнопке, которая находится на другом rectangle, по другой кнопке рисунок должен удалятся.

Что имею: класс-наследник QQuickPaintedItem, могу рисовать все с параметрами-константами, прописанными в подпрограмме и подпрограмма вызывается из rectangle в котором надо рисовать.

Что не смог реализовать: рисование по кнопке, удаление, передача параметров из inputText в подпрограмму рисования.

Сможете с чем либо помочь? Я так понял что передачу можно осуществлять через QQmlContext, так ли это?

А так же, можно ли как-нибудь обойтись без С++ при открытие файла-справки из меню?
MenuItem{
                text: qsTr("Referense")
                onTriggered: "функция вызова справки"
                }


Буду очень благодарен за помощь!
Trisch
Сигналы и слоты тебе в помощь.

А если можно, покажи код, а то не все понятно.
Anarchist_42
import QtQuick.Controls 1.1
import QtQuick 2.2
import Qt3D 2.0
import Qt3D.Shapes 2.0
import Circle 1.0

ApplicationWindow {
    id: window
    visible: true
    width: 1024
    height: 600
    title: "Frenel"
    //Меню программы
    menuBar: MenuBar {
        Menu {
            title: qsTr("File")
            MenuItem {
                text: qsTr("Exit")
                onTriggered: Qt.quit()
            }
            MenuItem{
                text: qsTr("Referense")                   [color="#808080"]Что бы по нажатию запускался файл .chm[/color]
            }
        }
    }
    //Основное окно программы
    Image {
        id: image1
        height: 60
        anchors.fill: parent
        sourceSize.height: 600
        sourceSize.width: 1024
        source: "fon.jpg"
        //Загрузка модели
        Rectangle {...}
        //Изображение НГТУ
        Image {...}
        //Кнопка "Start"
        Rectangle{
            id: for_start;
            x: 600
            anchors.top: rectangle1.bottom
            anchors.topMargin: 11
            anchors.right: parent.right
            anchors.rightMargin: 424
            Button{
                id:start
                text:"Start"
//                onClicked: Circle.draw(slider1.value,slider1.value,                 [color="#808080"]По нажатию брал значения и [/color]
//                                       slider1.value,slider1.value)                           [color="#808080"]выводил на экран рисунок [/color]
            }
        }
        //Кнопка "Reset"
        Rectangle{
            id: for_reset
            x: 600
            anchors.top: rectangle1.bottom
            anchors.topMargin: 51
            anchors.right: parent.right
            anchors.rightMargin: 424
            Button{
                id:reset
                text:"Reset"
                onClicked: Circle.destroy();                                                [color="#808080"]По нажатию рисунок удалялся [/color]
            }
        }
        //Текстовое поле "Длина волны"
        Rectangle{...}
        //Текстовое поле "Радиус отверстия"
        Rectangle{...}
        //Текстовое поле "Раcстояние от источника до экрана с отверстием"
        Rectangle{...}
        //Текстовое поле "Расстояние от линзы до второго экрана"
        Rectangle{...}
        //Слайдер для "Длина волны"
        Rectangle{...}
        //Слайдер для "Радиус отверстия"
        Rectangle{...}
        //Слайдер для "Раcстояние от источника до экрана с отверстием"
        Rectangle{...}
        //Слайдер для "Расстояние от линзы до второго экрана"
        Rectangle{...}
        //Окно ввода значения для "Длина волны"
        Rectangle{...}
        //Окно ввода значения для "Радиус отверстия"
        Rectangle{...}
        //Окно ввода значения для "Раcстояние от источника до экрана с отверстием"
        Rectangle{...}
        //Окно ввода значения для "Расстояние от линзы до второго экрана"
        Rectangle{...}

      }
    //Малое окно для зон Френеля
    Rectangle {                                                                               [color="#808080"]Окошко где рисунок должен появляться[/color]
        id: rectangle2
        x: 800
        width: 214
        height: 214
        color: "#9795f9"
        anchors.right: parent.right
        anchors.top: parent.top
        anchors.rightMargin: 10
        anchors.topMargin: 10
        border.width: 2
//        Circle{
//            anchors.fill:rectangle1;
//        }
    }
}
Trisch
Как программа узнает где должен появиться рисунок?
Anarchist_42
В том то и дело, что я не знаю как это сделать в qml, в с++ я бы передал указатель на окно. А сейчас я вызывал программу из окна, где мне и надо было нарисовать, минуя кнопку "Start"
Anarchist_42
Справился с передачей параметров, теперь не могу разобраться, можно ли передать указатель на то окно в котором я хочу нарисовать, по кнопке "Start". Ну и как удалять это изображение(ничего кроме флажка мне не пришло в голову).
Trisch
Цитата(Anarchist_42 @ 4.6.2014, 20:23) *
Справился с передачей параметров, теперь не могу разобраться, можно ли передать указатель на то окно в котором я хочу нарисовать, по кнопке "Start". Ну и как удалять это изображение(ничего кроме флажка мне не пришло в голову).


Как справился?

Под окном подразумевается виджет в котом все отрисовывается или участок в QML (Rectangle, Item и тд)?
Anarchist_42
class Circle : public QQuickPaintedItem
{
    Q_OBJECT
    Q_PROPERTY(int radius READ radius WRITE setRadius NOTIFY RadiusChanged)
    Q_PROPERTY(int wavelength READ wavelength WRITE setWavelength NOTIFY WavelengthChanged)
    Q_PROPERTY(int distance_to_the_screen READ distance_to_the_screen WRITE setDistance_to_the_screen NOTIFY Distance_to_the_screenChanged)
    Q_PROPERTY(int distance_to_the_screen2 READ distance_to_the_screen2 WRITE setDistance_to_the_screen2 NOTIFY Distance_to_the_screen2Changed)
private:
    int _wavelength;
    int _radius;
    int _distance_to_the_screen;
    int _distance_to_the_screen2;
public:
    explicit Circle(QQuickItem *parent = 0);
    void paint(QPainter *painter);
    //Get-функции
    int radius();
    int wavelength();
    int distance_to_the_screen();
    int distance_to_the_screen2();
    //Set-функции
    void setWavelength(int &a);
    void setRadius(int &a);
    void setDistance_to_the_screen(int &a);
    void setDistance_to_the_screen2(int &a);
signals:
    //Сигналы для Set-функций
    void RadiusChanged();
    void WavelengthChanged();
    void Distance_to_the_screenChanged();
    void Distance_to_the_screen2Changed();
public slots:
};


Да, это rectangle ( в самом низу кода написан rectangle2). А кнопка вызывается из другого rectangle (rectangle1->for_start) ну и по нажатию на кнопку ресет рисунок должен исчезнуть (rectangle1->for_reset).
Anarchist_42
Проблема решена!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.