Разный размер иконок для 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>

Разный размер иконок в Qt Designer и после компиляции


Ответы (2 шт):

Автор решения: S. Nick

я не совсем понимаю, что вы сделали с *.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_())

введите сюда описание изображения

и что не так ?

→ Ссылка
Автор решения: pupinho

Проблема решилась заменой участков кода, генерируемых pyuic5, с

icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap("copy.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)

на

icon = QtGui.QIcon("copy.ico")
→ Ссылка