Разный размер иконок для QMenuBar и QToolBar
Хочу сделать, чтобы в QMenuBar иконки QAction были 16х16, а в QToolBar - 24х24.
Сделал *.ico файл с несколькими слоями соответствующих размеров. В Qt Designer всё отображается как надо, но после компиляции в .py получается, что и меню, и тулбар используют только первый слой ICO-файла.
Прошу помощи с правильным решением данной задачки. Нагуглил одну ссылку 2005 года, в которой говорилось, что на тот момент решения не было, может быть сейчас что-то изменилось?
Текст *.ui файла
<?xml version="1.0" encoding="UTF-8" ?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>600</height>
</rect>
</property>
<property name="font">
<font>
<family>Roboto Light</family>
<pointsize>10</pointsize>
</font>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<widget class="QTableView" name="tav_main">
<property name="geometry">
<rect>
<x>60</x>
<y>40</y>
<width>591</width>
<height>361</height>
</rect>
</property>
</widget>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>21</height>
</rect>
</property>
<widget class="QMenu" name="menu">
<property name="font">
<font>
<family>Roboto Light</family>
<pointsize>10</pointsize>
</font>
</property>
<property name="title">
<string>Файл</string>
</property>
</widget>
<widget class="QMenu" name="menu_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>Roboto Light</family>
<pointsize>10</pointsize>
</font>
</property>
<property name="title">
<string>Редактировать</string>
</property>
<addaction name="a_copy" />
</widget>
<addaction name="menu" />
<addaction name="menu_2" />
</widget>
<widget class="QToolBar" name="toolBar">
<property name="windowTitle">
<string>toolBar</string>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="iconSize">
<size>
<width>24</width>
<height>24</height>
</size>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonIconOnly</enum>
</property>
<property name="floatable">
<bool>true</bool>
</property>
<attribute name="toolBarArea">
<enum>TopToolBarArea</enum>
</attribute>
<attribute name="toolBarBreak">
<bool>false</bool>
</attribute>
<addaction name="a_copy" />
</widget>
<action name="a_copy">
<property name="icon">
<iconset>
<normaloff>../icons/copy2.ico</normaloff>
../icons/copy2.ico
</iconset>
</property>
<property name="text">
<string>Копировать</string>
</property>
<property name="shortcut">
<string>Ctrl+C</string>
</property>
<property name="menuRole">
<enum>QAction::ApplicationSpecificRole</enum>
</property>
<property name="iconVisibleInMenu">
<bool>true</bool>
</property>
</action>
</widget>
<resources />
<connections />
</ui>
Ответы (2 шт):
я не совсем понимаю, что вы сделали с *.ico и
о каких слоях вы говорите.
Вот беру какое-то изображение cascade.ico 24х24
q13092862.ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>600</height>
</rect>
</property>
<property name="font">
<font>
<family>Roboto Light</family>
<pointsize>10</pointsize>
</font>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<widget class="QTableView" name="tav_main">
<property name="geometry">
<rect>
<x>60</x>
<y>40</y>
<width>591</width>
<height>361</height>
</rect>
</property>
</widget>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>21</height>
</rect>
</property>
<widget class="QMenu" name="menu">
<property name="font">
<font>
<family>Roboto Light</family>
<pointsize>10</pointsize>
</font>
</property>
<property name="title">
<string>Файл</string>
</property>
</widget>
<widget class="QMenu" name="menu_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>Roboto Light</family>
<pointsize>10</pointsize>
</font>
</property>
<property name="title">
<string>Редактировать</string>
</property>
<addaction name="a_copy"/>
</widget>
<addaction name="menu"/>
<addaction name="menu_2"/>
</widget>
<widget class="QToolBar" name="toolBar">
<property name="windowTitle">
<string>toolBar</string>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="iconSize">
<size>
<width>24</width>
<height>24</height>
</size>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonIconOnly</enum>
</property>
<property name="floatable">
<bool>true</bool>
</property>
<attribute name="toolBarArea">
<enum>TopToolBarArea</enum>
</attribute>
<attribute name="toolBarBreak">
<bool>false</bool>
</attribute>
<addaction name="a_copy"/>
</widget>
<action name="a_copy">
<property name="icon">
<iconset>
<normaloff>cascade.ico</normaloff>cascade.ico</iconset>
</property>
<property name="text">
<string>Копировать</string>
</property>
<property name="shortcut">
<string>Ctrl+C</string>
</property>
<property name="menuRole">
<enum>QAction::ApplicationSpecificRole</enum>
</property>
<property name="iconVisibleInMenu">
<bool>true</bool>
</property>
</action>
</widget>
<resources/>
<connections/>
</ui>
Делаем pyuic5 q13092862.ui -o q13092862_ui.py -x
q13092862_ui.py
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'q13092862.ui'
# Created by: PyQt5 UI code generator 5.12.1
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 600)
font = QtGui.QFont()
font.setFamily("Roboto Light")
font.setPointSize(10)
MainWindow.setFont(font)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.tav_main = QtWidgets.QTableView(self.centralwidget)
self.tav_main.setGeometry(QtCore.QRect(60, 40, 591, 361))
self.tav_main.setObjectName("tav_main")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
self.menubar.setObjectName("menubar")
self.menu = QtWidgets.QMenu(self.menubar)
font = QtGui.QFont()
font.setFamily("Roboto Light")
font.setPointSize(10)
self.menu.setFont(font)
self.menu.setObjectName("menu")
self.menu_2 = QtWidgets.QMenu(self.menubar)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.menu_2.sizePolicy().hasHeightForWidth())
self.menu_2.setSizePolicy(sizePolicy)
font = QtGui.QFont()
font.setFamily("Roboto Light")
font.setPointSize(10)
self.menu_2.setFont(font)
self.menu_2.setObjectName("menu_2")
MainWindow.setMenuBar(self.menubar)
self.toolBar = QtWidgets.QToolBar(MainWindow)
self.toolBar.setOrientation(QtCore.Qt.Horizontal)
self.toolBar.setIconSize(QtCore.QSize(24, 24))
self.toolBar.setToolButtonStyle(QtCore.Qt.ToolButtonIconOnly)
self.toolBar.setFloatable(True)
self.toolBar.setObjectName("toolBar")
MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar)
self.a_copy = QtWidgets.QAction(MainWindow)
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap("cascade.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.a_copy.setIcon(icon)
self.a_copy.setMenuRole(QtWidgets.QAction.ApplicationSpecificRole)
self.a_copy.setIconVisibleInMenu(True)
self.a_copy.setObjectName("a_copy")
self.menu_2.addAction(self.a_copy)
self.menubar.addAction(self.menu.menuAction())
self.menubar.addAction(self.menu_2.menuAction())
self.toolBar.addAction(self.a_copy)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.menu.setTitle(_translate("MainWindow", "Файл"))
self.menu_2.setTitle(_translate("MainWindow", "Редактировать"))
self.toolBar.setWindowTitle(_translate("MainWindow", "toolBar"))
self.a_copy.setText(_translate("MainWindow", "Копировать"))
self.a_copy.setShortcut(_translate("MainWindow", "Ctrl+C"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
и что не так ?
Проблема решилась заменой участков кода, генерируемых pyuic5, с
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap("copy.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
на
icon = QtGui.QIcon("copy.ico")



