Russian Qt Forum

Qt => Qt Quick => Тема начата: r04 от Май 08, 2014, 06:14



Название: Сигналы и слоты в QML, C++
Отправлено: r04 от Май 08, 2014, 06:14
Есть программа на С++, решил я меню к ней нарисовать с QML (Сейчас оно нарисовано на С++, но QML решил попробовать на этом примере)

Посмотрел вот эту статью: http://habrahabr.ru/post/184416/
Сделал что-то подобное, но у меня кроме меню есть еще что-то типа тулбара.

Набросок того, как я хотел бы чтобы это выглядело, я прикрепил.

Вобщем на верхнем уровне есть прямоугольник, в него вложено
 - прямоугольник тулбара (пока что пустой)
 - прямоугольник меню, который вложено:
   - модель с
      - девятью кнопками
   - вью для модели

В коде (ужасный, я знаю) :
Код:
import QtQuick 2.1

Rectangle {

  color: Qt.rgba(0.69, 0.76, 0.86, 1) //176, 196, 222

  Rectangle {
    id: toolbar
    width: parent.width
    height: 40
    color: Qt.rgba(0, 0, 0, 0)
    radius: 20
    border {
      color: "black"
      width: 1
    }
  } // Toolbar Rectangle

  Rectangle {
    width: Math.min(parent.width, parent.height - toolbar.height)
    height: Math.min(parent.width, parent.height - toolbar.height)

    y: toolbar.height + (parent.height - height) / 2

    color: Qt.rgba(0, 0, 0, 0)
    radius: 20
    border {
      color: "black"
      width: 1
    }

    ListModel {
      id: dataModel

      ListElement { }
      ListElement { }
      ListElement { }
      ListElement { }
      ListElement { }
      ListElement { }
      ListElement { }
      ListElement { }
      ListElement { }
    }

    GridView {
      id: view

      anchors.margins: 10
      anchors.fill: parent

      cellHeight: (parent.height - 20) / 3
      cellWidth: (parent.width - 20) / 3

      model: dataModel
      clip: true

      delegate: Item {
        property var view: GridView.view

        signal send()

        height: view.cellHeight
        width: view.cellWidth

        Rectangle {
          anchors.margins: 5
          anchors.fill: parent

          color: "tomato"
          radius: 20

          border {
            color: "black"
            width: 1
          }

          Image {
            anchors.fill: parent;
          }

          MouseArea {
            id: mousearea
            anchors.fill: parent
            onClicked: {
              view.currentIndex = model.index
            }
          }

          Component.onCompleted: {
            mousearea.clicked.connect(send)
          }

          Text {
            anchors.centerIn: parent
            renderType: Text.NativeRendering
          }
        } // Rectangle button
      } // Item of View (button)
    } // GridView
  } // Toolbar Rectangle
} // Rectangle main

Мне надо обрабатывать в С++ коде нажатия кнопок в меню. У элемента модели я описал сигнал send.
Не понятно как соединить этот сигнал со слотом С++.

Вот тут: http://www.prog.org.ru/topic_26510_0.html
я прочитал:
Цитировать
В моем понимании, у программы на QML должно быть одно окно, где-то мы тут это уже обсуждали.
Я понял это так, что вложенных прямоугольников быть не должно. Правильно ли я понял.
С другой стороны, даже если я смотрю на пример со статьи на хабре, то все равно не допираю как соединить.
В С++ коде юзается rootObject(), но он даст указатель на верхний прямоугольник или на вью, но никак не на нужный мне айтем.

Ну или вот сюда я смотрю: http://habrahabr.ru/post/184288/
Цитировать
Код:
GroupBox {
    id: gridBox
    title: "Grid layout"
    Layout.fillWidth: true

    GridLayout {
        id: gridLayout
        anchors.fill: parent
        rows: 3
        flow: GridLayout.TopToBottom

        Label { text: "Line 1" }
        Label { text: "Line 2" }
        Label { text: "Line 3" }
Как автор этого кода собрался получать доступ к этим Label?


Название: Re: Сигналы и слоты в QML, C++
Отправлено: Mikhail от Май 08, 2014, 08:53
В Qt Quick 2.1 есть уже готовый элемент ApplicationWindow.
В нем и меню и тулбар и статусбар без гемороя


Название: Re: Сигналы и слоты в QML, C++
Отправлено: Old от Май 08, 2014, 09:07
Мне кажется (я даже уверен), что лучше не видео смотреть, а документацию читать: :)

http://qt-project.org/doc/qt-5/qtqml-cppintegration-interactqmlfromcpp.html


Название: Re: Сигналы и слоты в QML, C++
Отправлено: r04 от Май 08, 2014, 13:50
Какое еще видео?
Но за ссылку спасибо, нашел я там findChild, попробую.


Название: Re: Сигналы и слоты в QML, C++
Отправлено: r04 от Май 09, 2014, 06:57
Попробовал, не помогло.

У меня есть ListModel с айтемами. Я не хочу давать каждому айтему имя (я же не знаю сколько их будет...), но хочу связать сигнал о нажатии на айтем со слотом С++.

Айтемы лежат в модели. Я дал имя модели, получил ее в С++ коде, но теперь мне надо получить все айтемы модели и в цикле привязаться к их сигналам. Я не нашел способа сделать это.

Если найду - напишу ))


Название: Re: Сигналы и слоты в QML, C++
Отправлено: navrocky от Май 24, 2014, 18:51
Почему бы в самом item, его MouseArea  в обработчике клика не дергать нужный метод C++ объекта?

Второй вариант, объявить свой сигнал у контейнера этих итемов, в плюсах привязываться к нему, а итемы будут по клику испускать этот сигнал с дополнительной информацией о своём индексе.