2017-04-01 3 views
0

Ich habe ein PNG-Format Bild von play button in dem ich als embedded resource in meiner Anwendung gespeichert habe.Qt: QIcon verschwindet beim Klicken; QIcon :: Mode wird nicht beachtet

<!DOCTYPE RCC><RCC version="1.0"> 
    <qresource prefix="icon"> 
    <file>play.png</file> 
    </qresource> 
</RCC> 

Ich habe ein QIcon mit dem gleichen Quellbild erstellt Satz für beide Normal und Active Modi

QIcon play; 
play.addFile(":icon/play.png", QSize(), QIcon::Normal); 
play.addFile(":icon/play.png", QSize(), QIcon::Active); 

Von dem, was ich verstehe, sollte dies das Symbol angezeigt wird, wenn unclicked (Normal-Modus) und weiter dabei geklickt, wenn (Active Modus)

QIcon::Normal: die pixmap Anzeige bei der Verwendung r interagiert nicht mit dem Symbol, aber die durch das Symbol dargestellte Funktionalität ist verfügbar.

QIcon::Active: Zeigen Sie das Pixmap an, wenn die durch das Symbol dargestellte Funktionalität verfügbar ist und der Benutzer mit dem Symbol interagiert, z. B. indem Sie die Maus darüber bewegen oder darauf klicken.

Wenn ich jedoch darauf klicke verschwindet es (stattdessen wird ein leeres Feld angezeigt). Hier

ist das Symbol unclicked

alt text

Hier ist das Symbol

geklickt

alt text

Minimal Arbeitsbeispiel:

ich ein minimales Beispiel erstellt haben, replizieren die Verhalten sehe ich

#include <QApplication> 
#include <QMainWindow> 
#include <QMenuBar> 

void initIcons() 
{ 
    Q_INIT_RESOURCE(view); 
} 

int main(int argc, char** argv) 
{ 
    QApplication* app = new QApplication(argc, argv); 
    QMainWindow* window = new QMainWindow(); 

    QMenuBar* menu = new QMenuBar(); 
    window->setMenuBar(menu); 

    QIcon play; 
    play.addFile(":icon/play.png", QSize(), QIcon::Normal); 
    play.addFile(":icon/play.png", QSize(), QIcon::Active); 

    QAction* action = new QAction(play, "", nullptr); 
    menu->addAction(action); 

    window->show(); 
    return app->exec(); 
} 

Update:

Ich habe auch jede Kombination von Mode und State ohne Verhaltensänderung versucht:

play.addFile(":icon/play.png", QSize(), QIcon::Normal, QIcon::On); 
play.addFile(":icon/play.png", QSize(), QIcon::Normal, QIcon::Off); 
play.addFile(":icon/play.png", QSize(), QIcon::Selected, QIcon::On); 
play.addFile(":icon/play.png", QSize(), QIcon::Selected, QIcon::Off); 
play.addFile(":icon/play.png", QSize(), QIcon::Active, QIcon::On); 
play.addFile(":icon/play.png", QSize(), QIcon::Active, QIcon::Off); 

Ich habe auch versucht addPixmap

QIcon play; 
play.addPixmap(QPixmap(":icon/play.png"), QIcon::Normal, QIcon::On); 
play.addPixmap(QPixmap(":icon/play.png"), QIcon::Normal, QIcon::Off); 
play.addPixmap(QPixmap(":icon/play.png"), QIcon::Selected, QIcon::On); 
play.addPixmap(QPixmap(":icon/play.png"), QIcon::Selected, QIcon::Off); 
play.addPixmap(QPixmap(":icon/play.png"), QIcon::Active, QIcon::On); 
play.addPixmap(QPixmap(":icon/play.png"), QIcon::Active, QIcon::Off); 

Keiner von diesen ändert das Verhalten leider.

+0

Was funktioniert gut für mich, das ist seltsam. Haben Sie versucht, die Pixmap auch im aktiven Modus hinzuzufügen? mit void QIcon :: addFile (const QString & Dateiname, const QSize & size = QSize(), Modus = Normal, Status = Aus) mit mode = Aktiv. so ähnlich: icon.addFile (":/play.png", QSize(), QIcon :: Aktiv); –

+0

@GabrieldeGrimouard danke für den Kommentar. Ich habe die Frage aktualisiert, um Ihren Vorschlag zu berücksichtigen. Leider haben Sie immer noch keinen Erfolg mit diesem –

+0

sieht aus, als müssten Sie separate Projekte mit einem Fenster und einer Schaltfläche erstellen, damit andere Ihr Problem reproduzieren können. – fghj

Antwort

1

Das Problem, wie ich in der Art von QMenuBar, verstehen modifizierte ich dein Beispiel in einer solchen Art und Weise:

#include <QApplication> 
#include <QMainWindow> 
#include <QMenuBar> 


int main(int argc, char** argv) 
{ 
    QApplication* app = new QApplication(argc, argv); 
    QMainWindow* window = new QMainWindow(); 

    QMenuBar* menu = new QMenuBar(); 
    menu->setStyleSheet(R"style(
QMenuBar { 
    background-color: transparent; 
} 
QMenuBar::item:selected { /* when selected using mouse or keyboard */ 
    background: #a8a8a8; 
} 

QMenuBar::item:pressed { 
    background: #888888; 
} 
)style"); 
    window->setMenuBar(menu); 

    QIcon play; 
    const char path_to_icon[] = "/home/evgeniy/Downloads/icon-play-128.png"; 
    play.addFile(path_to_icon, QSize(), QIcon::Normal); 
    play.addFile(path_to_icon, QSize(), QIcon::Active); 

    QAction* action = new QAction(play, "", nullptr); 
    menu->addAction(action); 

    window->show(); 
    return app->exec(); 
} 

und nach drücken kann ich siehe Symbol. Beachten Sie, dass mein Standardstil anders ist als deins, , so dass Sie möglicherweise die Farben im Stylesheet ändern müssen.

+0

Danke dafür! Ja, es scheint ein Problem mit dem Stylesheet und dem standardmäßigen Unity-Thema in Ubuntu zu sein. Tatsächlich konnte ich das Stylesheet für 'QMenuBar :: item: pressed' alleine einstellen und beheben. Weißt du, ob es möglich ist, das Stylesheet zu erhalten, das angewendet wurde? –

0

vielleicht können Sie Symbol in SCHLITZ hinzufügen:

connect({your_action_name},&QAction::toggled,[=](){ 
your_action_name.setIcon("icon_path_file.ico"); 
}) 
+0

Dies ist eine Frage oder eine Antwort, wenn es eine Frage ist, ist dies kein geeigneter Ort dafür, bitte löschen Sie Ihren Beitrag, da dieser Ort nur für Antworten ist. – eyllanesc

Verwandte Themen