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 (всего исправлений: 1)

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

А какой в этом смысл?

Я бы хотел понять, как окно настроить так, чтобы квадратик с координатами 0,0 всегда отображался в левом верхнем углу.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от 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 ★★★★★
() автор топика
Ответ на: комментарий от deep-purple

Ну ты же понимаешь, что QML-это вообще другая технология в Qt. Что толку от этого C++ кода?

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 ★★★★★
() автор топика
Ответ на: комментарий от annulen

Похоже на глюк WM

Кстати да. Попробуй на дефолтном линуксе (Ubuntu 18.04 + GNOME)

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

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

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

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

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

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

Plasma и KWin 5.14.4, Qt 5.11.2, nvidia-driver 415.18

бага нет

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

У меня проблема возникает на Qt 5.9.2 и Qt 5.11.2 (инсталляция с qt.io сайта) в Debian Linux 9 Stable (LXDE).

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

А посмотри мой старый-старый проектик: https://github.com/EXL/BezierClock
Есть там такой баг или нет?

Нет, в нем бага нету. Часики по центру при любом положении окна.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от 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 ★★★★★
()

Ubuntu 1804, Qt 5.9.5, такой проблемы нет. Больше всего похоже на глюк WM.

unC0Rr ★★★★★
()
Ответ на: комментарий от 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

А если xf86-video-intel снести? ;-)

Или это на modesetting так?

ChALkeR ★★★★★
()
Ответ на: комментарий от 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 ★★★★★
()
Ответ на: комментарий от ChALkeR

У меня старый Intel GPU первого или второго поколения, поэтому xf86-video-intel. Насколько я помню, modesetting поддерживается только с 4th generation.

EXL ★★★★★
()

Отписался в багтрекере. Может быстрее двигаться будет.

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