我有一个play button的png格式图片,我已将embedded resource存储在我的应用程序中。
<!DOCTYPE RCC><RCC version="1.0">
<qresource prefix="icon">
<file>play.png</file>
</qresource>
</RCC>
我为QIcon
和Normal
模式设置了相同的源图像集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
:当图标所代表的功能可用且用户正在与图标交互时显示像素图,例如,将鼠标移到它上面或点击它。
但是,当我点击它时它会消失(显示一个空白框)。
这是未点击的图标
这是点击的图标
最小工作示例:
我创建了一个复制我看到的行为的最小例子
#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();
}
更新
我还尝试了Mode
和State
的每个组合,但行为没有变化:
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 :(得分: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");
})