Qt:点击时QIcon消失; QIcon ::模式未得到尊重

时间:2017-04-01 06:43:41

标签: c++ qt

我有一个play button的png格式图片,我已将embedded resource存储在我的应用程序中。

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

我为QIconNormal模式设置了相同的源图像集Active

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

根据我的理解,这应该在未被点击时显示图标(Normal模式),并在点击时继续这样做(Active模式)

  

QIcon::Normal:当用户未与图标交互时显示像素图,但图标所代表的功能可用。

     

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

不幸的是,这些都不会改变行为。

2 个答案:

答案 0 :(得分: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();
}

按下后我可以看到图标。 请注意,我的默认样式与您的不同, 所以你可能需要在样式表中修改颜色。

答案 1 :(得分:0)

也许你可以在SLOT中添加图标:

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