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 для разработки, с моей любимой темной темой:

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

И это выглядит при запуске программы под 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" . Если вы предпочитаете темную цветовую схему, вы можете найти одну здесь .