LINUX.ORG.RU

Тупит QML на примитивном коде - что ему еще надо? (С видео)

 , ,


0

1

Сделал вот такой минимальный пример:

import QtQuick 2.6
import QtQuick.Window 2.2

Window {
    visible: true
    width: 500
    height: 500

    Rectangle
    {
        anchors.fill: parent
        color: "blue"
    }

    Rectangle
    {
        x: 0
        y: 0
        width: 100
        height: 100
        color: "red"
    }
}

Это просто окно с синим фоном и красным прямоугольником в левом верхнем углу.

Казалось бы, что тут может глючить? А глюки начинаются, когда меняется размер окна. Скриншоты сделать не могу, потому что в момент создания скриншота, окна, похоже, перерисовываются, и скриншот получается с «правильным» содержимым.

Поэтому выкладываю видео: https://youtu.be/0ewK6jrqWms

Видно, что если два раза нажать «Развернуть», то содержимое окна становится неправильным: синяя заливка начинается не сверху окна, а с каким-то вертикальным отступом. Красный квадрат тоже смещен вниз на этот же отступ.

Если двигать окно, то содержимое окна остается неправильным, но в какой-то момент вдруг перерисовывается, и снова становится правильным.

Вопрос: в чем проблема, и как сделать так, чтобы окно всегда отрисовывалось правильно?

★★★★★

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

Опустил раскраску в цвета. Пишу прямо сюда без конпеляций, возможно что-то забыл, главное тут — иерархия. В куемель сам превратишь, я в нём не разбираюсь:

QVBoxLayout l = new QVBoxLayout(windowWidget);
l->setMargin(0);
l->setSpacing(0);
QWidget blueFiller = new QWidget(windowWidget);
blueFiller->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
QWidget redSquare = new QWidget(blueFiller);
redSquare->setFixedSize(100, 100);
l->addWidget(blueFiller);
Если твое окно это QMainWindow, то лейаут там уже есть и setCentralWidget() помещает виджет уже в лейаут. Значит лейаут из моего примера не нужен.

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

Пока что у меня подозрение, что что-то не то с contentItem главного окна при изменении размеров окна.

Но я удивлен, что такой простой пример не работает как надо.

Может, я что-то не понимаю.

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

Я показал иерархию для достижения желаемого. Как это изобразить в куемеле — думай сам. Знал бы я его, так сразу бы на куемеле нарисовал. Но помочь пытаюсь, да.

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

Но помочь пытаюсь, да.

У меня такое впечатление, что на весь рунет в лучшем случае около сотни человек используют QML в продакшене, и к тому же они друг друга не знают.

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

У меня такое впечатление, что на весь рунет в лучшем случае около сотни человек используют QML в продакшене, и к тому же они друг друга не знают.

Я тебе сразу именно так и сказал. И не только рунет, но и вообще WorldWide. QtQuick/QML никому нафиг не нужен и уже лет 10 в состоянии постоянной альфы/беты.

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

Но QML ведь прекрасен, и Qt его всеми силами продвигают, как минимум на Embending платформах. Его пилят и пилят. Он реально хорош за исключением таких вот косяков.

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

Мне в чат с Qt форума пишут, что у меня дрова на карточку устаревшие. Но я так понимаю что они гонят.

Можешь запустить у себя, и сказать есть баг или нет?

Просто создай стандартное QML-приложение и всунь топиковый код.

Интересует результат и версия Qt, Линукса, DE.

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

Мне в чат с Qt форума пишут, что у меня дрова на карточку устаревшие. Но я так понимаю что они гонят.

Конечно гонят. Запустил у себя (KWin/KDE, Qt 5.11.1, Intel i915 GPU) — баг при максимизировании окна и возвращению к исходному размеру проявляется.

Но QML ведь прекрасен, и Qt его всеми силами продвигают, как минимум на Embending платформах. Его пилят и пилят. Он реально хорош за исключением таких вот косяков.

Этих косяков там море и вся «прекрасность» QML улетучивается после любых шагов в сторону.

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

Я тебе сразу именно так и сказал. И не только рунет, но и вообще WorldWide. QtQuick/QML никому нафиг не нужен и уже лет 10 в состоянии постоянной альфы/беты.

Они пилят Qt Quick семимильными шагами:

http://habrahabr.net/thread/20268
https://habr.com/post/354972/

Не стал бы я говорить что QML нафиг не нужен.

По теме: я пытаюсь вызвать перерисовку окна, чтоб подправить этот баг, в обработчике onWidthChanged. Но пока ничего не получается. Есть какие-нибудь мысли по этому поводу?

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

Но пока ничего не получается. Есть какие-нибудь мысли по этому поводу?

А посмотри мой старый-старый проектик: https://github.com/EXL/BezierClock

Есть там такой баг или нет?

Что у тебя за WM?

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

Единственное что я заметил, что у меня в реальном проекте баг есть только в «первом» экране, который помещен в StackView. На последующих экранах, которые добавляются в стек, такого бага нет.

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

Так, похоже нащупал. Достаточно добавить анимацию, например смещать на 1 пиксель красный квадратик, и все отрисовывается правильно.

Щас подумаю как в реальном проекте невидимо это применить.

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

Ну да, значит это баг, когда при максимизировании окна и возвращении в исходное положение оно не перерисовывается. Видимо WM не отправляет сигнал для перерисовки. Странно, почему у меня на KWin'е такой баг тоже проявляется. У тебя OpenBox, там понятно.

А в моём проекте имеется таймер, который обновляет сцену ~60раз/сек, поэтому и нет этого бага. А была бы сцена статичной, он бы был.

Если ты добавишь в свой код выше что-то вроде:

Timer
{
    interval: 1; running: true; repeat: true
    onTriggered: update()
}

То увидишь, что баг ушёл. Вот только так, конечно, делать нельзя. Попробуй сделать что-то вроде:

onVisibilityChanged: {                  
    if (visibility == Window.Windowed) {
        console.log("windowed")         
        update()                        
    }                                   
}                                       

Х.з, сработает ли это.

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

Конечно гонят. Запустил у себя (KWin/KDE, Qt 5.11.1, Intel i915 GPU) — баг при максимизировании окна и возвращению к исходному размеру проявляется.

Сообщи, пожалусто, какой у тебя дистр.

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

Попробуй сделать что-то вроде:
onVisibilityChanged: {
if (visibility == Window.Windowed) {
console.log(«windowed»)
update()
}
}

Нет, не работает.

Я не пойму, что это за метод такой update(). В списке доступных методов для типа Window (List of All Members for Window) такого метода нет.

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

Сообщи, пожалусто, какой у тебя дистр.

Arch Linux. Но это не играет какой-либо роли. А вот версия KWin: 5.14.0

Я не пойму, что это за метод такой update(). В списке доступных методов для типа Window (List of All Members for Window) такого метода нет.

http://doc.qt.io/qt-5/qquickwindow.html#update

EXL ★★★★★ ()