2017-04-01 104 views
0

我有一個play button的png格式圖像,其中我已將其作爲embedded resource存儲在我的應用程序中。Qt:點擊時QIcon消失; QIcon ::模式不被尊重

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

我創建了一個QIcon有兩個NormalActive模式

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

據我瞭解,未點擊(Normal模式)時,本應顯示的圖標,然後繼續設置相同的源圖像點擊時這樣做(Active模式)

QIcon::Normal:當使用時顯示像素圖r不與圖標交互,但圖標表示的功能可用。

QIcon::Active:當該圖標表示的功能可用並且用戶正在與該圖標進行交互時(例如,將鼠標移動到其上或單擊它),顯示該像素圖。

但是,當我點擊它時,它消失了(而是顯示一個空白框)。

這裏是圖標未點擊

alt text

這裏的圖標點擊

alt text

最小工作示例:

我創建了一個小例子,複製行爲我看到

#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(); 
} 

更新:

我也試圖與行爲沒有變化ModeState每個組合:

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); 

我也試過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); 

這些都不幸地改變了行爲。

+0

什麼對我很好,所以這很奇怪。您是否也嘗試在主動模式下添加像素圖?使用mode = Active的QIcon :: addFile(const QString&fileName,const QSize&size = QSize(),Mode mode = Normal,State state = Off)。像這樣:icon.addFile(「:/ play.png」,QSize(),QIcon :: Active); –

+0

@GabrieldeGrimouard感謝您的評論。我已更新問題以反映您的建議。不幸的是,這個 –

+0

看起來像你需要用一個窗口和一個按鈕創建單獨的項目,所以其他人可以重現你的問題。 – fghj

回答

1

的問題,因爲我在QMenuBar的風格明白, 我修改這樣的方式您的例子:

#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(); 
} 

並按後,我可以見圖標。 請注意,我的默認樣式與您的不同, 因此您可能需要修改樣式表中的顏色。

+0

感謝您的支持!是的,它似乎是Ubuntu中樣式表和默認Unity主題的問題。事實上,通過單獨設置'QMenuBar :: item:pressed'的樣式表,我可以修復它。你知道是否有可能得到應用的樣式表是什麼? –

0

也許你可以在SLOT添加圖標:

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

這是一個問題或答案,如果它是一個問題,這不是一個合適的地方,請刪除您的帖子,因爲這個地方僅供解答。 – eyllanesc