1

PyQt4 のアイコンに問題があります:

Qt Designer で UI を作成し、システム テーマのアイコンを含むボタンをいくつか追加し、.ui ファイルを Python プログラムにロードしましたが、アイコンが表示されません (ボタンにテキストが表示されます)。

QIcon.fromTheme を使用すると機能しますが、.ui ファイルで定義されたアイコンをロードしません。

コードから手動でアイコンをロードせずに、これらのアイコンをロードするにはどうすればよいですか?

4

1 に答える 1

0

アップデート

パッケージにバグがあり、使用uic時にテーマ アイコンが読み込まれないようuic.loadUiです。

問題のあるコードは次のPyQt4/uic/icon_cache.pyとおりです (60 行目あたり)。

# Handle a themed icon.
theme = iconset.attrib.get('theme')
if theme is not None:
    return self._object_factory.createQObject("QIcon.fromTheme",
            'icon', (as_string(theme), ), is_attribute=False)

問題は、単にアイコン名の代わりに渡そas_stringうとする関数の使用です。'_fromUtf8("face-smile")'QIcon.fromTheme

これを修正したい場合は、PyQt4 メーリング リストで報告することをお勧めします。

同等の機能が PySide でも機能することに注意してください。

from PySide.QtUiTools import QUiLoader

class Window(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        QUiLoader().load('/tmp/test.ui', self)

pyuic4ここでは、Qt Designer で作成された uiを使用する方法の簡単な内訳を示します。

まず、UI を作成します。以下は、テーマ アイコンを含むボタンを作成する最小限のuiファイルです。

/tmp/test.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Form</class>
 <widget class="QWidget" name="Form">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>400</width>
    <height>300</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Form</string>
  </property>
  <widget class="QPushButton" name="pushButton">
   <property name="geometry">
    <rect>
     <x>110</x>
     <y>100</y>
     <width>92</width>
     <height>25</height>
    </rect>
   </property>
   <property name="text">
    <string>PushButton</string>
   </property>
   <property name="icon">
    <iconset theme="face-smile"/>
   </property>
  </widget>
 </widget>
 <resources/>
 <connections/>
</ui>

次に、ファイルpyuic4から python モジュールをコンパイルするために使用します。ui

pyuic4 -o /tmp/test_ui.py /tmp/test.ui

/tmp/test_ui.py

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file '/tmp/test.ui'
#
# Created: Fri Sep 21 16:45:39 2012
#      by: PyQt4 UI code generator 4.9.4
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    _fromUtf8 = lambda s: s

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName(_fromUtf8("Form"))
        Form.resize(400, 300)
        self.pushButton = QtGui.QPushButton(Form)
        self.pushButton.setGeometry(QtCore.QRect(110, 100, 92, 25))
        icon = QtGui.QIcon.fromTheme(_fromUtf8("face-smile"))
        self.pushButton.setIcon(icon)
        self.pushButton.setObjectName(_fromUtf8("pushButton"))

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        Form.setWindowTitle(QtGui.QApplication.translate("Form", "Form", None, QtGui.QApplication.UnicodeUTF8))
        self.pushButton.setText(QtGui.QApplication.translate("Form", "PushButton", None, QtGui.QApplication.UnicodeUTF8))

コンパイルした ui クラスをアプリケーションにインポートします。

/tmp/test.py

from PyQt4 import QtGui, QtCore
from test_ui import Ui_Form

class Window(QtGui.QWidget, Ui_Form):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.setupUi(self)

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

最後に、アプリケーションを実行します。

python2.7 /tmp/test.py
于 2012-09-21T16:04:44.530 に答える