PyQt4 のアイコンに問題があります:
Qt Designer で UI を作成し、システム テーマのアイコンを含むボタンをいくつか追加し、.ui ファイルを Python プログラムにロードしましたが、アイコンが表示されません (ボタンにテキストが表示されます)。
QIcon.fromTheme を使用すると機能しますが、.ui ファイルで定義されたアイコンをロードしません。
コードから手動でアイコンをロードせずに、これらのアイコンをロードするにはどうすればよいですか?
アップデート
パッケージにバグがあり、使用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