Russian Qt Forum
Ноябрь 10, 2024, 22:48 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Сигналы и слоты в QML, C++  (Прочитано 8065 раз)
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?
Записан
Mikhail
Программист
*****
Offline Offline

Сообщений: 587


Просмотр профиля
« Ответ #1 : Май 08, 2014, 08:53 »

В Qt Quick 2.1 есть уже готовый элемент ApplicationWindow.
В нем и меню и тулбар и статусбар без гемороя
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #2 : Май 08, 2014, 09:07 »

Мне кажется (я даже уверен), что лучше не видео смотреть, а документацию читать: Улыбающийся

http://qt-project.org/doc/qt-5/qtqml-cppintegration-interactqmlfromcpp.html
Записан
r04
Гость
« Ответ #3 : Май 08, 2014, 13:50 »

Какое еще видео?
Но за ссылку спасибо, нашел я там findChild, попробую.
Записан
r04
Гость
« Ответ #4 : Май 09, 2014, 06:57 »

Попробовал, не помогло.

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

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

Если найду - напишу ))
Записан
navrocky
Moderator
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #5 : Май 24, 2014, 18:51 »

Почему бы в самом item, его MouseArea  в обработчике клика не дергать нужный метод C++ объекта?

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

Гугль в помощь
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.137 секунд. Запросов: 23.