2012-10-09 40 views
11

Tôi gặp khó khăn khi hiển thị biểu tượng QAction được chọn từ chủ đề biểu tượng hiện tại. Tôi tạo ra ui với nhà thiết kế Qt và xuất nó với pyuic4 sample.ui > sample.py. Sau khi thiết lập các biểu tượng từ chủ đề với self.actionSample.setIcon(QtGui.QIcon.fromTheme(_fromUtf8("document-open"))), tôi nhận được mã nguồn sau đây:QIcon.fromTheme không hiển thị biểu tượng trong PyQt

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_() 

Khi tôi thực hiện điều đó, thanh công cụ không hiển thị biểu tượng 'tài liệu mở'. Nó là một lỗi hay tôi đang làm điều gì đó sai?

Cảm ơn

+0

Bạn đang sử dụng định dạng nào và bạn đang sử dụng phiên bản Qt nào? Ngoài ra, bạn có đặt biểu tượng trong Trình thiết kế hoặc tự thêm biểu tượng theo cách thủ công không? – ekhumoro

+0

@ekhumoro Tôi đang chạy: Gnu/Linux 3.2.0-2-686 - Thử nghiệm Debian/ Python 2.7.3rc2/ python-qt4 4.9.3-4/ Tôi thiết lập biểu tượng theo cách thủ công sau khi tạo ' .py'. Nhưng khi tôi tạo ra nó với qt-designer thì cũng vậy. – Hypergraphe

+0

Hộp thoại Hành động mới trong Trình chỉnh sửa hành động sẽ hiển thị biểu tượng bên cạnh thuộc tính "Chủ đề biểu tượng" nếu có. – ekhumoro

Trả lời

11

Quá trình tra cứu biểu tượng được sử dụng bởi QIcon.fromTheme là hơi phức tạp.

Chủ đề biểu tượng chỉ được hỗ trợ trực tiếp trên nền tảng X11 cho môi trường máy tính để bàn GNOME và KDE. Đối với các nền tảng/máy tính để bàn khác, bạn cần phải cài đặt chủ đề cùng với ứng dụng hoặc tinh chỉnh môi trường của người dùng theo nhiều cách khác nhau.

Để tìm chủ đề hệ thống hiện tại cho GNOME, Qt sẽ truy vấn gconf (nếu có kiểu gtk), và theo mặc định là chủ đề "gnome". Đối với KDE, Qt sẽ kiểm tra (các) tệp cài đặt kdeglobals và nếu không mặc định là "oxy" (hoặc "crystalvg" cho các phiên bản trước của KDE). Ngoài ra, chủ đề "hicolor" luôn có thể được sử dụng làm dự phòng.

Khi tên chủ đề hệ thống đã được xác định, Qt sẽ tìm thư mục chứa các biểu tượng ở các vị trí được xác định trước khác nhau, một lần nữa phụ thuộc vào cả nền tảng và máy tính để bàn đang được sử dụng. Trên X11, điều này bao gồm $HOME/.icons$XDG_DATA_DIRS/icons. Vị trí duy nhất phổ biến cho tất cả các nền tảng/máy tính để bàn là đường dẫn tài nguyên :/icons.

Thư mục chủ đề biểu tượng phải bao gồm tệp index.theme, trong đó (trong số những thứ khác) chỉ định thư mục con có thể chứa biểu tượng. Chỉ các tệp biểu tượng có tiện ích mở rộng png hoặc svg mới được sử dụng.

Lớp QIcon có một số phương pháp tĩnh mà sẽ hiển thị chính xác nơi Qt đang tìm kiếm các biểu tượng theo chủ đề:

>>> 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 

Nếu biểu tượng "tài liệu mở" không được hiển thị, Qt hoặc là tìm kiếm trong địa điểm "sai" hoặc biểu tượng bị thiếu hoàn toàn.

UPDATE:

Như tôi đã nói ở trên: theo mặc định, Qt chỉ hỗ trợ GNOME và KDE trên nền tảng X11. Nó không biết gì về FluxBox WM, và do đó không thể phát hiện chủ đề biểu tượng hiện tại. Điều này có nghĩa là nó sẽ rơi trở lại bằng cách sử dụng một chủ đề "hicolor" tối thiểu, có thể không có tất cả các biểu tượng được yêu cầu.

Một cách để giải quyết vấn đề này, là tạo liên kết tượng trưng "hicolor" trỏ đến chủ đề bạn muốn sử dụng. Lý tưởng nhất, điều này sẽ đi vào vị trí đó là lần đầu tiên trong danh sách Qt của các đường dẫn tìm kiếm:

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

UPDATE 2:

Qt5 vẫn chỉ hỗ trợ KDE và Gnome theo mặc định, nhưng Qt Platform Abstraction layer ít nhất làm cho có thể tạo các plugin chủ đề tùy chỉnh (LXQT là một môi trường máy tính để bàn tận dụng lợi thế này).Ngoài ra còn có một số DE nữa được coi là gtk/gnome: X-CINNAMON, UNITY, MATE, XFCE và LXDE.

+1

Tôi đang chạy FluxBox WM. Khi tôi thực hiện đoạn mã trên, tôi nhận được: '/home/ben/.icons/hicolor /usr/local/share/icons/HiColor /usr/share/icons/HiColor :/biểu tượng/hicolor' Các biểu tượng nằm trong '/ usr/share/icons/hicolor' cùng với index.theme để nó hoạt động đúng không? – Hypergraphe

+1

Ok, tôi đã thay đổi chủ đề bằng phương thức tĩnh 'setThemeName' thành một trong' .icons' của tôi và nó hoạt động tốt. Bất kỳ ý tưởng tại sao PyQt không nhìn vào các đường dẫn tìm kiếm khác? – Hypergraphe

+1

Đó là một ý tưởng hay. Tôi sẽ làm điều đó. Cảm ơn nhiều. – Hypergraphe

Các vấn đề liên quan