QT Dialog имеет неправильный стиль - PullRequest
1 голос
/ 14 февраля 2020

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

Я создал дизайнерскую форму, ничего особенного в ней, и разместил на ней несколько стандартных виджетов. Как только я наконец запустил его из основного приложения, я заметил, что у виджетов нет стилей. Кнопки не имеют границ или тиснения, весь текст белый, а цвет фона кнопок и объекта LineEdit - серый. Код, используемый для запуска диалога, выглядит следующим образом:

    UpdateDialog dialog(NULL);
    dialog.setModal(true);
    dialog.exec();

Я подумал, что, возможно, он наследуется от родительского виджета, поэтому я передал NULL в качестве родителя в конструкторе для объекта диалога, и это все же произошло .

Я нашел один ответ на аналогичный вопрос в Интернете, предлагая переопределить унаследованные таблицы стилей от родительского, установив таблицу стилей для диалога, который в основном выглядит так:

    #objectName {}

Но это не имеет никакого эффекта.

Стили, примененные к виджету после создания, похоже, работают, как будто я использую следующую строку, цвет текста на кнопках становится черным:

    dialog->setStyleSheet("color: rgb(0,0,0)");

Кто-нибудь знает что может быть причиной такого поведения? Если это имеет значение, мы используем Qt 5.6.1 в Scientifi c Linux (RHEL 6).

РЕДАКТИРОВАТЬ: Вот изображение диалога.

Dialog without Styling

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

РЕДАКТИРОВАТЬ : Похоже, этот стиль применяется и к диалоговому окну файла, который я создал из диалогового окна обновления, показанного выше.

1 Ответ

2 голосов
/ 20 февраля 2020

Qt не имеет собственной сильной визуальной идентичности. Вместо этого он пытается обеспечить естественный внешний вид на всех своих целевых платформах. Все операционные системы включают в себя некоторые возможности настройки внешнего вида, но в этой области Linux является особенным, потому что нет ни одного уникального пользовательского интерфейса, как в Windows и macOS, но их несколько. Два известных рабочих стола для Linux (и других Unix -подобных операционных систем) - это Gnome и KDE. Некоторые дистрибутивы устанавливают Gnome по умолчанию, а некоторые устанавливают другой. Большинство из них позволяют установить оба, и пользователь может выбрать один из них на экране входа в систему или в настройках конфигурации рабочего стола.

Я никогда раньше не пробовал Scientifi c Linux, но я знаю Fedora, так что не было большой проблемой установить SL6 в виртуальной машине VirtualBox, чтобы посмотреть, смогу ли я воспроизвести вашу проблему (я не смог!). Я заметил, что SL6 по умолчанию использует рабочий стол Gnome (например, RH и Fedora, кстати). Он не включает Qt5, и было бы трудно установить на него среду разработки Qt5, потому что он поставляется с устаревшим компилятором G CC. Однако на нем можно развернуть приложения и библиотеки Qt 5.6. Я также установил KDE в виртуальной машине с помощью этой команды:

    sudo yum -y groupinstall "KDE Desktop"

SL6, конечно, не включает KDE Plasma, поскольку для него требуется Qt5. Это KDE4.3 вместо этого, основанный на Qt4.6. Итак, в этой версии, исправляя мой предыдущий комментарий, команда конфигурации для изменения / проверки стилей KDE:

    kcmshell4 style

Стиль по умолчанию для KDE4 - это Oxygen, как я понял из вашей картинки. Цветовая схема для программ KDE может быть настроена с помощью этой команды:

    kcmshell4 colors

Чтобы попробовать ваш сценарий, я создал простую программу виджетов Qt5, которую я мог бы развернуть на ВМ вместе с зависимыми библиотеками Qt5 , Я использовал linuxdeployqt , чтобы развернуть библиотеку и плагины, необходимые для программы, и создать автономный каталог для удобной передачи и установки. В любом случае, я хочу показать вам, как программа выглядит на моей машине Linux для разработки, с моей любимой темной темой:

dark-breeze theme

После развертывания каталога программы на SL6 ВМ, работающая под рабочим столом Gnome по умолчанию, выглядит следующим образом:

gtk+ theme in Gnome

И это выглядит при запуске программы под KDE:

fusion theme in KDE

Помните, что мы смотрим на одну и ту же сборку одной и той же программы, просто меняя рабочую среду. Просто для вашего сведения, я немного проинструктировал свою программу, в том числе в функции main() этот оператор отладки:

     qDebug() << QStyleFactory::keys();

, который печатает этот вывод на Linux:

("Windows", "GTK +", "Fusion")

А также включил этот оператор отладки в конструктор главного окна:

    qDebug() << this->style();

Вывод это утверждение зависит от среды рабочего стола. Под Gnome (который основан на gtk + toolkit) он выводит что-то вроде этого:

QGtkStyle (0x11b39f0, name = "gtk +")

Находясь под рабочим столом KDE он выводит:

QFusionStyle (0x1428990, name = "fusion")

Я надеюсь, что на этом этапе вы, как и я, можете сделать вывод, что источником вашей проблемы должно быть цветовая конфигурация под KDE в вашем SL6. Чтобы доказать эту теорию, пожалуйста, запустите некоторые другие программы Qt и посмотрите, имеют ли они те же неподходящие цвета. В этом случае мой совет - исправить эту конфигурацию (запустив kcmshell4 colors) вместо изменения программы, чтобы принудительно установить некоторую фиксированную цветовую схему, потому что хорошая интеграция с рабочим столом является ценным активом для большинства Linux пользователей.

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

static QPalette qt_fusionPalette()
{
    QColor backGround(239, 239, 239);
    QColor light = backGround.lighter(150);
    QColor mid(backGround.darker(130));
    QColor midLight = mid.lighter(110);
    QColor base = Qt::white;
    QColor disabledBase(backGround);
    QColor dark = backGround.darker(150);
    QColor darkDisabled = QColor(209, 209, 209).darker(110);
    QColor text = Qt::black;
    QColor hightlightedText = Qt::white;
    QColor disabledText = QColor(190, 190, 190);
    QColor button = backGround;
    QColor shadow = dark.darker(135);
    QColor disabledShadow = shadow.lighter(150);

    QPalette fusionPalette(Qt::black,backGround,light,dark,mid,text,base);
    fusionPalette.setBrush(QPalette::Midlight, midLight);
    fusionPalette.setBrush(QPalette::Button, button);
    fusionPalette.setBrush(QPalette::Shadow, shadow);
    fusionPalette.setBrush(QPalette::HighlightedText, hightlightedText);

    fusionPalette.setBrush(QPalette::Disabled, QPalette::Text, disabledText);
    fusionPalette.setBrush(QPalette::Disabled, QPalette::WindowText, disabledText);
    fusionPalette.setBrush(QPalette::Disabled, QPalette::ButtonText, disabledText);
    fusionPalette.setBrush(QPalette::Disabled, QPalette::Base, disabledBase);
    fusionPalette.setBrush(QPalette::Disabled, QPalette::Dark, darkDisabled);
    fusionPalette.setBrush(QPalette::Disabled, QPalette::Shadow, disabledShadow);

    fusionPalette.setBrush(QPalette::Active, QPalette::Highlight, QColor(48, 140, 198));
    fusionPalette.setBrush(QPalette::Inactive, QPalette::Highlight, QColor(48, 140, 198));
    fusionPalette.setBrush(QPalette::Disabled, QPalette::Highlight, QColor(145, 145, 145));
    return fusionPalette;
}

int main(int argc, char *argv[])
{
    QApplication::setPalette(qt_fusionPalette());
    QApplication a(argc, argv);
    qDebug() << QStyleFactory::keys();

    MainWindow w;
    w.show();
    return a.exec();
}

Эта светлая цветовая палитра аналогична стандартной палитре Qt "Fusion" . Если вы предпочитаете темную цветовую схему, вы можете найти одну здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...