LINUX.ORG.RU

Баг в QColorDialog на Qt 5.15.8 ?

 , , , ,


0

2

Имеется следующий код, который вызывает окно диалога выбора цвета:

QColor selectedColor;
QColor currentColor(Qt::white);

selectedColor = QColorDialog::getColor(currentColor,
                                       this,
                                       tr("Select color"),
                                       QColorDialog::ShowAlphaChannel );

Проблема в том, что нормально выбрать цвет невозможно: в окне, где нарисована градиентная цветовая «радуга», клик мышкой не приводит к выбору цвета.

Крестик выбора цвета, который перемещается вместе с курсором мышки, по-хорошему должен остаться на том месте, где кликнули мышкой. Но этого не происходит: он все время привязан к мышке. И поэтому когда пользователь кликает на нужный цвет, потом двигает мышку к кнопке Ok, то выбранный цвет меняется вместе с движением мышки.

Что за дичь? Это у меня одного так?

Система: Debian GNU/Linux 12.12, Qt 5.15.8.

UPD1: Минимально работающий пример (14 дней на хранение): https://dropmefiles.com/HDZaX

UPD2: Минимально работающий пример с CSS-стилем, который вызывает баг: https://dropmefiles.com/EiFba

★★★★★

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

Archlinux current, Qt 5.15.{18,19}

Такой проблемы нет, но я проверял в своём проекте.

QColorDialog::getColor вызывается из другого QDialog отображаемого через exec(). Разницы между указанием QColorDialog parent = nullptr или this нет.

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

Такс, похоже что-то начало выясняться...

Чистый пример кода и у меня на Qt 5.15.8 работает правильно.

Глючит QColorDialog именно внутри моего большого проекта.

Есть файл: https://github.com/xintrea/mytetra_dev/blob/experimental/app/src/libraries/wy...

В нем в двух местах одинаковая проблема с этим QColorDialog в методах:

- onFontcolorClicked()
- onBackgroundcolorClicked()

Но я ничего не вижу предосудительного, что могло бы повлиять на динамически создаваемый на стеке объект модального диалога QColorDialog, который существует только в функции:

// Слот, срабатыващий при нажатии на кнопки выбора цвета текста
// Параметр n - это номер выбранного пункта в выпадающей кнопке выбора цвета,
// счет кнопок с нуля.
void TypefaceFormatter::onFontcolorClicked(int n)
{
    // TRACELOG

    QColor selectedColor;

    if (n==0)
    {
        // Текущий цвет шрифта возле курсора
        QColor currentColor = textArea->textColor();

        // Формат символов под курсором
        QTextCharFormat textAreaCharFormat = textArea->currentCharFormat();

        // Есть ли ForegroundBrush под курсором в тексте
        bool hasForegroundBrush = textAreaCharFormat.hasProperty(QTextFormat::ForegroundBrush);

        // Если нет ForegroundBrush в тексте под курсором, то
        // за цвет кнопки берется цвет foreground редактора textArea (QTextEdit)
        // (это позволяет учитывать также цвет шрифта, заданный в файле stylesheet.css)
        if(!hasForegroundBrush)
            currentColor = textArea->palette().windowText().color();

        // Диалог запроса цвета текста
        selectedColor = QColorDialog::getColor(currentColor,
                                               editor,
                                               tr("Select text color"),
                                               QColorDialog::ShowAlphaChannel);

        // Если цвет выбран, и он правильный
        if(selectedColor.isValid())
        {
            // Меняется цвет кнопки и устанавливается цвет текста
            this->doChangeFontcolor( selectedColor );
        }
    }

    if (n==1)
    {
        selectedColor = QApplication::style()->standardPalette().color(QPalette::WindowText);

        // Меняется цвет кнопки и устанавливается цвет текста
        this->doChangeFontcolor( selectedColor );
    }
}

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

Хм, я заменил код на тот, что используется в чистом примере, и баг есть!

void TypefaceFormatter::onFontcolorClicked(int n)
{
    QColor selectedColor;
    QColor currentColor(Qt::white);

    selectedColor = QColorDialog::getColor(currentColor,
                                           nullptr,
                                           tr("Select color"),
                                           QColorDialog::ShowAlphaChannel );
}

То есть:

  • На Qt 5.15.8, если вызывать QColorDialog::getColor() минимальным кодом в моем большом проекте, то он не может выбрать цвет!
  • А если на том же Qt 5.15.8 вызывать QColorDialog::getColor() минимальным кодом в минимальном проекте, то работает правильно.

Факинщит, что же может влиять на динамически создаваемый QColorDialog::getColor() ?

Загадка природы!

Кастую dhampire и hateyoufeel, я один такое понять не могу.

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

Ага, нашел в чем дело, но как исправить - вообще не знаю.

Значит, проблема возникает в случае, если к интерфейсу применяется CSS-тема:

// Загруженный стиль оформления применяется
qApp->setStyleSheet(styleText);

Сам файл темы находится здесь:

https://github.com/xintrea/mytetra_dev/blob/selectThemeSupport/app/bin/resour...

Если его применить, то перестает нормально работать этот color picker.

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

Вот похожий баг обсуждают:

Had the exact same thing with any style that has a override of «:hover». In my case «QWidget *::item:hover { }», even empty, breaks the QColorDialog.

https://github.com/ColinDuquesnoy/QDarkStyleSheet/issues/319#issuecomment-3056672423

Ja-Ja-Hey-Ho ★★★★★
()
Ответ на: комментарий от Ja-Ja-Hey-Ho

Благодарю. Пока не вкурил как предлагают решить.

Вот доработанный минимально работающий пример с CSS-стилем, который демонстрирует баг:

https://dropmefiles.com/EiFba

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

Вот же по второй ссылке расписали возможные варианты решения:

This leaves us three options:

  1. Downgrade to Qt 5.15.2

  2. Upgrade to Qt 6.2.10

  3. Fix our stylesheet, removing these lines

QWidget:item:hover 
{ 
    background-color: #18465d; 
    color: #eff0f1; 
}
Ja-Ja-Hey-Ho ★★★★★
()
Последнее исправление: Ja-Ja-Hey-Ho (всего исправлений: 1)

Ещё у них отмечено в доке:

QDialog Supports only the background, background-clip and background-origin properties.

Warning: Make sure you define the Q_OBJECT macro for your custom widget.

Со стилями надо вообще осторожней, они могут вызывать проблемы с самописными виджетами, у меня например так случайным образом ломалось отображение в моём самописном редакторе кода и я потратил кучу времени на поиски проблемы.

Ещё было дело у меня в плавающих виджетах ломалось поведение курсора, но то был баг в темах оформления KDE.

Dr64h ★★★★
()
Ответ на: комментарий от Ja-Ja-Hey-Ho

Ага, мне несказанно повезло, что в моем стиле только один элемент использует этот селектор:

QWidget::item:hover:!selected {
   background-color: #1A72BB;
 }

И этот селектор можно и не использовать, на виджеты не особо повлияет. А вот если кто-то активно использовал бы «item:hover», тогда бы стоял выбор: или используй неполноценный стиль, или беги по цепочке:

Хочешь чтоб в программе был визуальный выбор цвета -> Не хочешь чтобы выбор цвета глючил -> Отказывайся от поддержки стилей -> И значит у тебя не будет темной темы в приложении -> Парам-парам-па.

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

Вроде бы стиль можно персонально окну задать, тогда выход в использовании для этого конкретного диалога отдельного стиля. Ну и фиг с ним, что у него не будет item:hover.

Loki13 ★★★★★
()

Вопрос можно?, надо было как то(всмысле ссылку): https://doc.qt.io/qt-6.9/stylesheet-reference.html. Оно что теперь в ауте(vpn)?, что то не работает, у всех так что ли?.

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

У меня QMake version 3.1 Using Qt version 5.15.16 и всё прекрасно. Вероятно 5.15.8 это очень старая версия

4 января 2022 года — дата выпуска версии Qt 5.15.8

17 ноября 2023 года — дата выпуска версии Qt 5.15.16

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

А советуют upgrade to Qt 6.2.10, но вот, 5.15.16 нормуль

I-Love-Microsoft ★★★★★
()
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)