2017-04-15 4 views
1

OS (플랫폼)별로 qss 스타일 시트의 일부를 활성화/비활성화하는 방법이 있습니까? 그래서 저는 MacOS 용 글꼴 하나와 Windows 용 글꼴 하나를 사용할 수 있습니다.OS별로 qss 스타일 시트를 사용할 수있는 방법이 있습니까?

나는 특정 위젯

this->setProperty("qsysKernelType", QSysInfo::kernelType()); 
this->setProperty("qsysCurrentCpuArchitecture", QSysInfo::currentCpuArchitecture()); 
this->setProperty("qsysBuildCpuArchitecture", QSysInfo::buildCpuArchitecture()); 
this->setProperty("qsysProductType", QSysInfo::productType()); 

동적 속성을 설정할 수 있지만, 단 하나의 위젯이 아닌 전체 계층 구조와 함께 작동합니다.

답변

1

나는 이것을위한 표준 간단한 방법이 있다고 생각하지 않습니다.

하지만 당신은 언제나처럼, 그것을로드, 여러 다른 파일에서 플랫폼 및 사용 ifdefs에 대한 귀하의 CSS 자원을 보유 할 수 있습니다

this->setStyleSheet(QFile(
#ifdef Q_OS_WIN 
":/style/win.css" 
#else // add more, if you need 
":/style/mac.css" 
#endif 
).readAll()); 

또는 단순히 ifdefs 두 개의 하드 코딩 된 문자열을 사용합니다.

+0

내'.qss' 파일로 프리 컴파일러를 직접 사용할 수 있는지 궁금합니다. –

+0

나는 그것이 무엇을 의미하는지에 달려있다. 내 .qss 파일에서 ": /style/win.css"와 같은 뜻으로 생각한다. 간단한 대답 - 아니. ifdefs는 c/C++ 코드 (헤더/소스)에만 넣을 수 있습니다. 또는 플랫폼에 따라 여러 리소스 파일을 만들고 .pro 파일에 하나만 포함 할 수 있습니다. – Youw

+0

그리고 원하는 경우 .qss 파일의 일부만 변경하고 .qss 파일을 여러 파일로 분할하는 것을 고려하십시오. 모든 플랫폼에 공통적 인 부분과 다른 부분. 그리고 나서 당신의 부분을 병합하십시오. 나는 비슷한 필요를 가지고있었습니다. – Youw

0

사실 우리는 이제 Youw의 대답과이 질문에서 언급 된 접근법을 조합하여 사용하고 있습니다.

조건부 qss의 경우 특정 위젯 또는 위젯 트리의 속성을 설정합니다.

void CStyleSheetUtility::setQSysInfoProperties(QWidget *widget, bool withChildWidgets) 
{ 
    Q_ASSERT_X(widget, Q_FUNC_INFO, "Missing widget"); 
    if (!widget->property("qsysKernelType").isValid()) 
    { 
     widget->setProperty("qsysKernelType", QSysInfo::kernelType()); 
     widget->setProperty("qsysCurrentCpuArchitecture", QSysInfo::currentCpuArchitecture()); 
     widget->setProperty("qsysBuildCpuArchitecture", QSysInfo::buildCpuArchitecture()); 
     widget->setProperty("qsysProductType", QSysInfo::productType()); 
    } 

    if (withChildWidgets) 
    { 
     for (QWidget *w : widget->findChildren<QWidget *>(QString(), Qt::FindDirectChildrenOnly)) 
     { 
      CStyleSheetUtility::setQSysInfoProperties(w, true); 
     } 
    } 
} 
관련 문제