2014-04-09 4 views
1

자바와 QtJambi (Qt 4.6.3) 라이브러리를 사용하여 텍스트 편집기를 개발했습니다. 응용 프로그램에는 아이콘이있는 QAction이있는 QToolBar가 있습니다. 내 텍스트 편집기는 두 가지 테마 (어둡고 가벼운)간에 전환 할 수 있습니다. 검은 색 아이콘을 사용하면 어두운 테마가 끔찍 해 보입니다. 흰색 아이콘을 사용하면 밝은 테마도 끔찍하게 보입니다. 테마 전환 버튼을 누르면 아이콘이 변경됩니다.Qt 애플리케이션이 다른 아이콘 테마

아이콘은 다음과 같이 선언됩니다

private String inir = "classpath:/ico/"; 
private QIcon iconodeshacer = new QIcon(inir+"deshacer.png"); 

그리고 나는 QActions이 방법을 설정합니다

private QToolBar herramientas = new QToolBar(); 
herramientas.addAction(iconodeshacer, "Deshacer", this, "deshacer()"); 

나는 inir 문자열을 변경하고 적용하는 시도했다 :

herramientas.update(); 
herramientas.repaint(); 

QtJambi 또는 일반 Qt (번역 가능)에 대한 해결책을 찾을 수 없습니다.

아이콘 테마를 모두 선언하고 구성 외부의 각 QAction을 선언하지 않고 setIcon()을 사용하여 아이콘을 수동으로 변경하지 않고 적용하고 싶습니다.

답변

0

저에게 아이디어를 주신 Dmitry Sazonov에게 감사드립니다. C++이 아닌 java에서 프로그래밍 할 때 코드는 내 응용 프로그램에 적용하기가 어렵습니다. 그러나 나는 그 생각을 이해했다. 내가 문자열 배열에 아이콘 이름을 저장하고 테마를 전환 할 때마다 요소의 아이콘을 재설정했는지.

private String[] nombreiconoseditar = {"copiar.png", "cortar.png", "pegar.png", "", "deshacer.png", "rehacer.png", "", "buscar.png", "buscareemplazar.png"}; 

는 그리고 아이콘 폴더로 경로를 변경하고, 내가 원하는 요소에 하나의 아이콘 하나를 설정이 예제에서, 나는 QMenu를의 editar의 모든 아이콘을 변경할 수 있습니다.

inir="classpath:/ico/claro/"; 

List ed = editar.actions(); 
    for(int i=0; i<ed.size(); i++) 
    { 
     QAction tmp = (QAction) ed.get(i); 
     tmp.setIcon(new QPixmap(inir+nombreiconoseditar[i])); 
    } 

희망 사항은 동일한 문제를 가진 사람을 도울 수 있기를 바랍니다.

1

switchTheme 함수를 구현하고 테마를 변경할 때마다 호출 할 수 있습니다. 이 fuction에서 필요한 아이콘을로드해야합니다.

class ActionManager : public QObject // Singleton 
{ 
//... 
QMap< QAction *, QString > allActions; 

public: 

    void registerAction(const QString& key, QAction *action) 
    { 
    allActions[action] = key; 
    connect(action, &QObject::destroyed, this, &ActionManager::onActionDelete); 
    } 

    void switchTheme(const QString& themeName) 
    { 
    for (QMap< QAction *, QString >::iterator i = allActions.begin(); i != allActions.end(); i++) 
    { 
     const QString iconPath = QString(":/icons/theme_%1/%2.ico").arg(themeName).arg(i.value()); 
     i.key()->setIcon(iconPath); 
    } 
    } 

private slots: 
    void onActionDelete() 
    { 
    QAction *act = qobject_cast<QAction *>(sender()); 
    allActions.remove(act); 
    } 

}; 

//Usage: 
QAction *saveAction = new QAction(); 
ActionManager::instance()->registerAction(act, "saveicon"); 

//On applying theme: 
ActionManager::instance()->switchTheme("light "); 
// Will load ":/icons/theme_light/saveicon.ico" for saveAction