12

現在のアイコンテーマから選択したQActionのアイコンを表示するのに問題があります。QtデザイナーでUIを作成し、でエクスポートしましたpyuic4 sample.ui > sample.py。テーマのアイコンをで設定するとself.actionSample.setIcon(QtGui.QIcon.fromTheme(_fromUtf8("document-open")))、次のソースコードが表示されます。

from PyQt4 import QtCore, QtGui
import sys

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

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(800, 600)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtGui.QStatusBar(MainWindow)
        self.statusbar.setObjectName(_fromUtf8("statusbar"))
        MainWindow.setStatusBar(self.statusbar)
        self.toolBar = QtGui.QToolBar(MainWindow)
        self.toolBar.setObjectName(_fromUtf8("toolBar"))
        MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar)
        self.actionSample = QtGui.QAction(MainWindow)
        self.actionSample.setObjectName(_fromUtf8("actionSample"))
        self.actionSample.setIcon(QtGui.QIcon.fromTheme(_fromUtf8("document-open")))
        self.toolBar.addAction(self.actionSample)

        QtCore.QMetaObject.connectSlotsByName(MainWindow)

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    window = QtGui.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(window)
    window.show()
    app.exec_()

実行すると、ツールバーに「ドキュメントを開く」アイコンが表示されません。それはバグですか、それとも私は何か間違ったことをしていますか?

ありがとう

4

2 に答える 2

14

で使用されるアイコン検索プロセスQIcon.fromThemeはやや複雑です。

アイコン テーマは、GNOME および KDE デスクトップ環境の X11 プラットフォームでのみ直接サポートされています。他のプラットフォーム/デスクトップの場合、アプリケーションと共にテーマをインストールするか、さまざまな方法でユーザーの環境を微調整する必要があります。

GNOME の現在のシステム テーマを見つけるために、Qt は gconf を照会し (gtk スタイルが利用可能な場合)、それ以外の場合はデフォルトで "gnome" テーマを使用します。KDE の場合、Qt はkdeglobals設定ファイルを調べます。それ以外の場合は、デフォルトで "oxygen" (以前のバージョンの KDE では "crystalsvg") になります。さらに、「hicolor」テーマはいつでもフォールバックとして使用できます。

システム テーマ名が決定されると、Qt は、使用されているプラ​​ットフォームとデスクトップの両方に依存する、事前に決定されたさまざまな場所にあるアイコンを含むディレクトリを探します。X11 では、これには と が含まれ$HOME/.iconsます$XDG_DATA_DIRS/icons。すべてのプラットフォーム/デスクトップに共通する唯一の場所は、リソース パス:/iconsです。

アイコン テーマ ディレクトリには、index.theme(特に) アイコンを格納できるサブディレクトリを指定するファイルが含まれている必要があります。拡張子がpngまたはのアイコン ファイルのみが使用されます。svg

このQIconクラスには、Qt がテーマ アイコンを探している場所を正確に示す静的メソッドがいくつかあります。

>>> from PyQt4 import QtGui
>>> app = QtGui.QApplication([])
>>> for path in QtGui.QIcon.themeSearchPaths():
...     print "%s/%s" % (path, QtGui.QIcon.themeName())
... 
/home/ekhumoro/.icons/hicolor
/usr/local/share/icons/hicolor
/usr/share/icons/hicolor
:/icons/hicolor

「ドキュメントを開く」アイコンが表示されない場合、Qt が「間違った」場所を探しているか、アイコンがまったく表示されていません。

アップデート:

上で述べたように、デフォルトでは、Qt は X11 プラットフォームで GNOME と KDE のみをサポートしています。FluxBox WM について何も知らないため、現在のアイコン テーマを検出できません。これは、必要なアイコンがすべて含まれていない可能性がある、最小限の「hicolor」テーマを使用するようにフォールバックすることを意味します。

この問題を解決する 1 つの方法は、使用するテーマを指す「hicolor」シンボリック リンクを作成することです。理想的には、これは Qt の検索パスのリストの最初の場所にある必要があります。

$ ln -s icon/theme/directory $HOME/.icons/hicolor

更新 2 :

Qt5 はまだデフォルトで kde と gnome のみをサポートしていますが、Qt プラットフォーム抽象化レイヤーにより、少なくともカスタム テーマ プラグインを作成できます ( LXQTは、これを利用するデスクトップ環境の 1 つです)。X-CINNAMON、UNITY、MATE、XFCE、LXDE など、gtk/gnome として扱われるようになった DE もいくつかあります。

于 2012-10-10T18:21:13.823 に答える
0

この醜いハックを使用できるようなものをself指している場合:QWidget

openIcon = self.style().standardIcon(QStyle.StandardPixmap.SP_FileDialogStart)
openAction(openIcon, 'Open', self)

または、インスタンスにアクセス.style()することもできます。QApplicationicon = app.style().standardIcon(...)

于 2021-09-19T21:32:34.573 に答える