LINUX.ORG.RU

QML: Почему нельзя обратиться к типу Window по id?

 , ,


0

1

Есть у меня вот такой пример с прямоугольником:

    Rectangle {
         id: page
         width: 640
         height: 480
         color: "lightgray"

         Text {
             text: "Hello world!"
             anchors.horizontalCenter: page.horizontalCenter
         }
     }

Здесь видно, что внутри Text происходит обращение к вышестоящему Rectangle по id page. И происходит центрирование текста относительно прямоугольника. Все работает правильно.

Теперь делаем то же самое с Window:
Window {
    id: content
    visible: true
    width: 640
    height: 480

    Text {
        text: "Hello world!"
        anchors.horizontalCenter: content.horizontalCenter
    }
}

И видим, что обращение по id content не работает. Центрирования не происходит.

А если вместо id написать parent, то центрирование работает:
Window {
    id: content
    visible: true
    width: 640
    height: 480

    Text {
        text: "Hello world!"
        anchors.horizontalCenter: parent.horizontalCenter
    }
}

То есть, по каким-то причинам для типа Window невозможно обращение через id.

Это что за ограничение такое?

★★★★★

Последнее исправление: Xintrea (всего исправлений: 1)

Ответ на: комментарий от fluorite

Подытожим:

Типы ApplicationWindow и Window не наследуются от типа Item, и не имеют anchors-свойств.

Более того, когда в ApplicationWindow и Window вставляются элементы, то система вначале создает промежуточный элемент, который имеет тип contentItem. Его как бы не видно, о нем в коде QML не говорится, но он есть. И он уже имеет anchors-свойства, а все его прочие свойства устанавливаются равными свойствам окна.

В примере ТС:

Когда происходит обращение к окну по id content, то обращение на самом деле происходит, но так как окно не имеет anchors-свойств, центрирования не производится.

Если же пишется обращение через parent, то обращение идет не к окну, которое видно по иерархии qml-исходника, а к невидимому объекту contentItem. У него есть anchors-свойство и поэтому центрирование работает.

Я правильно понял?

Xintrea ★★★★★
() автор топика
Последнее исправление: Xintrea (всего исправлений: 1)
Ответ на: комментарий от redgremlin

Вообще ТС стоит прочитать базовую документацию по QML: http://doc.qt.io/qt-5/qtqml-syntax-objectattributes.html#default-properties

Теперь идём сюда: http://doc.qt.io/qt-5/qml-qtquick-window-window.html#data-prop

data : list<Object> [default]

If you assign an Item to the data list, it becomes a child of the Window's contentItem, so that it appears inside the window. The item's parent will be the window's contentItem, which is the root of the Item ownership tree within that Window.

Dendy ★★★★★
()
Ответ на: комментарий от Xintrea

Когда происходит обращение к окну по id content, то обращение на самом деле происходит, но так как окно не имеет anchors-свойств, центрирования не производится.

Здесь ты попался на ахилесову пяту JS, которая лечит и калечит одновременно. page.horizontalCenter возвращает значение undefined, когда оно присваивается к anchors.horizontalCenter, то вызывается reset-метод для этого параметра Q_PROPERTY(... RESET resetSomething). Поэтому за ошибку это не считается и в логах пусто. То же самое будет, если просто опечатаешься, скажем: anchors.horizontalCenter: parent.horizontolCenter.

Dendy ★★★★★
()
Ответ на: комментарий от redgremlin

Я вообще пока еще не понял структуру документации на QML, да и как QML вообще работает. Пока только понял, что классы QML вроде как являются инстантами C++-шных Qt-шных классов, но глубже понять пока не могу. Например, не могу понять как связаны свойства QML объектов и плюсовых классов, как вообще это происходит, ведь у нас JavaScript.

Информации слишком много, и понять одну строчку «The invisible root item of the scene» - это просто отметить себе что есть что-то невидимое, да и хрен с ним, тут и так черт ногу сломит.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от annulen

Да, ведь ЛОР - русскоязычный ресурс, а документация на англицком, и воспринимается с трудом.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

А ты все равно пыьайся, переводи со словарем. Если смысл каких-то фраз не понятен, лучше об этом спроси. Потом со временем научишься, это все-таки не худ. литература

annulen ★★★★★
()
Ответ на: комментарий от Xintrea

И еще: читай код, которым пользуешься. В случае с Qt это может быть нужно не так часто, документация никогда не врет в открытую, но она не всегда содержит все подробности

annulen ★★★★★
()
Последнее исправление: annulen (всего исправлений: 1)
Ответ на: комментарий от annulen

А ты все равно пыьайся, переводи со словарем. Если смысл каких-то фраз не понятен, лучше об этом спроси.

Ты что, думаешь что я документацию не читаю? Читаю, только медленно и даже со словарем половины не понимая. Дело нужно сделать вчера, а я только третий параграф в одном разделе доки разгребаю. Не даются мне иностранные языки, я и на курсы ходил, и с репетитором в Evrovision занимался - не мое это. Грамматика - это что-то запредельное, все эти правила, времена забываю как строятся. Слова кроме базовых запоминаю с трудом. Кстати, я для того MyTetra и писал, потому что с памятью у меня туго. Но и она не всегда помогает, уже несколько раз было что я ленился заглянуть свои записульки и забывал что сам уже разбирался в вопросе. Ну правда между этим «а я разобрался» и «забыл что уже разобрался» по времени годы лежат, что радует, не совсем в маразм впал.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Может стоит попробовать ноотропы?

Грамматика - это что-то запредельное, все эти правила, времена забываю как строятся. Слова кроме базовых запоминаю с трудом.

Читать документацию можно и без знания времен, а слова - это в основном термины, которые все равно придется запомнить.

Если все равно проблема, то можно сразу переходить к чтению кода вызываемой функции. В коде мало слов и все формализовано

annulen ★★★★★
()
Ответ на: комментарий от annulen

Фенотропил уже.

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

Xintrea ★★★★★
() автор топика

Друзья , подскажите как поставить Qt5 на Ubuntu 16.04. Короче скачал .run установщик , поставил в /usr/local и при сборке программ постоянно какой-то геморрой , то path не найден. Там вроде нужно еще ставить qtchooser и делать в нем настройки .conf и прописывать пути ?

NetSurf
()
Ответ на: комментарий от Xintrea

У (практически) любого встроенного QML-объекта есть C++-класс QQuick*, например QQuickWindow. Найти его довольно легко, find src -name qquickwindow.h в модуле qtdeclarative (или даже в include/QtQuick в проинсталлированной копии). С первых строк видно, что это не QQuickItem.

annulen ★★★★★
()
Ответ на: комментарий от Xintrea

Я смотрел эти методички, там аля https://tutorialforlinux.com/2016/06/04/how-to-install-qt5-qt-creator-on-ubun...

http://sourcedigit.com/19858-how-to-install-qt-5-6-1-on-ubuntu-16-04/

Думаю люди, которые пишут эти мануалы, как-то по волшебному делалуют установку, что им просто достаточно поставить Qt в /home/user. И при этом не прописать различные PATH и подобное

NetSurf
()
Ответ на: комментарий от NetSurf

Товарищ, я тебе могу дать ссылки на собственные записульки:

Установка Qt Creator под Windows и Ubuntu (особенности, решения проблем)

Как установить среду разработки Qt 5.2 под Android в Linux и как скомпилировать первую программу

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

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Спасибо, но тож как-то беспонтово))) чтобы установить старомодную версию программы из центра приложений убунты, много ума не нужна, тоже самое относится и к команде sudo apt install qt5-default , которая установит не ту версию, которая нужна. Нужно именно .run установщиком. Я не понимаю, почему креатор не ищет библиотеки для линковки, пробовал и всякие пути типо QT_DIR прописывать в ./.profile

NetSurf
()
Ответ на: комментарий от NetSurf

В криэйторе можно настроить профиль кутей указав ему директорию с кумейком. Ищи в Tools->Options->Build&Run вкладка QtVersions Профиль создать, потом у проекта добавишь его и всё будет нормально линковаться (но это не точно)

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.