2017-12-25 12 views
2

Qt5 응용 프로그램에서 "융합"스타일에 어두운 테마를 사용하고 있습니다. 테마를 전환하는 기능을 추가하고 싶습니다. 사용자가 응용 프로그램을 다시 시작해야하는 경우에는 문제가 없지만 응용 프로그램을 시작할 때 팔레트가 올바르게 초기화됩니다. 그러나 다시 시작하지 않고이 런타임을 수행 할 수 있기를 원합니다. 위젯의 대부분은이 가능성을 지원하지만 다른 일부 (예 : QComboBox, QSpinBox, QTreeView)는 지원하지 않습니다. 다음 스 니펫으로이를 증명할 수 있습니다. '스타일 재설정'버튼을 누르면 위젯의 일부분이 올바르게 변경되지만 다른 부분은 올바르게 변경되지 않습니다. Windows 10에서 최신 Qt 5.10을 사용하고 있습니다.이 문제는 Qt 버그로 생각되지만 해결 방법이나 해킹이 있습니까? 응용 프로그램을 다시 시작하지 않고 응용 프로그램 팔레트 런타임을 변경하십시오.

main.cpp입니다 :

#include "widget.h" 
#include <QApplication> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    // apply the dark color scheme 
    qApp->setStyle("fusion"); 
    QPalette darkPalette; 
    darkPalette.setColor(QPalette::Window,QColor(53,53,53)); 
    darkPalette.setColor(QPalette::WindowText,Qt::white); 
    darkPalette.setColor(QPalette::Disabled,QPalette::WindowText,QColor(127,127,127)); 
    darkPalette.setColor(QPalette::Base,QColor(42,42,42)); 
    darkPalette.setColor(QPalette::AlternateBase,QColor(66,66,66)); 
    darkPalette.setColor(QPalette::ToolTipBase,Qt::white); 
    darkPalette.setColor(QPalette::ToolTipText,Qt::white); 
    darkPalette.setColor(QPalette::Text,Qt::white); 
    darkPalette.setColor(QPalette::Disabled,QPalette::Text,QColor(127,127,127)); 
    darkPalette.setColor(QPalette::Dark,QColor(35,35,35)); 
    darkPalette.setColor(QPalette::Shadow,QColor(20,20,20)); 
    darkPalette.setColor(QPalette::Button,QColor(53,53,53)); 
    darkPalette.setColor(QPalette::ButtonText,Qt::white); 
    darkPalette.setColor(QPalette::Disabled,QPalette::ButtonText,QColor(127,127,127)); 
    darkPalette.setColor(QPalette::BrightText,Qt::red); 
    darkPalette.setColor(QPalette::Link,QColor(42,130,218)); 
    darkPalette.setColor(QPalette::Highlight,QColor(42,130,218)); 
    darkPalette.setColor(QPalette::Disabled,QPalette::Highlight,QColor(80,80,80)); 
    darkPalette.setColor(QPalette::HighlightedText,Qt::white); 
    darkPalette.setColor(QPalette::Disabled,QPalette::HighlightedText,QColor(127,127,127)); 
    qApp->setPalette(darkPalette); 

    Widget w; 
    w.show(); 

    return a.exec(); 
} 

widget.h입니다 :

#pragma once 

#include <QWidget> 

class Widget : public QWidget 
{ 
    Q_OBJECT 

public: 
    explicit Widget(QWidget *parent = 0); 

}; 

widget.cpp :

,369 :

#include "widget.h" 

#include <QVBoxLayout> 
#include <QComboBox> 
#include <QSpinBox> 
#include <QTreeWidget> 
#include <QPushButton> 
#include <QApplication> 
#include <QStyleFactory> 

Widget::Widget(QWidget *parent) : 
    QWidget(parent) 
{ 
    auto layout = new QVBoxLayout(this); 
    auto comboBox = new QComboBox(); 
    auto spinBox = new QSpinBox(); 
    auto listWidget = new QTreeWidget(); 
    listWidget->setHeaderLabels(QStringList() << "Column1" << "Column2"); 
    auto button = new QPushButton("Reset style"); 

    // reset the palette to the default 'light' color scheme 
    connect(button, &QPushButton::clicked, 
      [] { qApp->setPalette(QStyleFactory::create("fusion")->standardPalette()); }); 

    layout->addWidget(comboBox); 
    layout->addWidget(spinBox); 
    layout->addWidget(listWidget); 
    layout->addWidget(button); 
} 

이 어둠이다

enter image description here

1,363,210이 스타일을 재설정 한 후 :

enter image description here

+0

버그를 기록한 결과 : https://bugreports.qt.io/browse/QTBUG-65475 –

답변

0

이 버그 보고서의 설명에 따르면 https://bugreports.qt.io/browse/QTBUG-65475 문제는 어떤 스타일에서 수행 픽스맵 캐싱에 관련된 것 같다. 해당 픽스맵은 팔레트를 변경 한 후에 전역 QPixmapCache에서 지워지지 않습니다.

가능한 해결 방법은 수동으로 전체 QPixmapCache을 취소하는 것입니다 : 픽스맵의 많은 재 계산해야 할 경우 명백한 성능에 미치는 영향으로

QPixmapCache::clear(); 

.

+0

나를 위해 일하는 것 같습니다. 버그가 수정 될 때까지이 해결 방법을 사용합니다. 픽스맵의 재 계산은 문제가되지 않습니다.이 작업은 성능에 중요하지 않으며 자주 발생하지 않습니다. –