2012-10-10 43 views
1

我試圖通過pyside設置QGridLayout小部件的背景圖像(它位於與應用程序相同的文件夾中)我無法看到所有的內容,文檔和論壇帖子關於樣式表「,但我仍然無法弄清楚我做錯了什麼。pyside設置背景圖像通過樣式表不工作

from PySide.QtCore import * 
from PySide.QtGui import * 
import sys 

class Main(QWidget): 

    def __init__(self, parent=None): 
     super(Main, self).__init__(parent) 

     j = 0 
     pos = [(0, 0), (0, 1), (0, 2), (0, 3), 
       (1, 0), (1, 1), (1, 2), (1, 3), 
       (2, 0), (2, 1), (2, 2), (2, 3), 
       (3, 0), (3, 1), (3, 2), (3, 3), 
       (4, 0), (4, 1), (4, 2), (4, 3), 
       (5, 0), (5, 1), (5, 2), (5, 3)] 

     grid = QGridLayout(self) 
     items = ["one", "Two", 'Three','four','five'] 

     for e in items: 
      picture = ImageLabel("Book.png", self) 
      picture.name = e 
      picture.setFixedSize(128,128) 
      picture.mousepos = str(picture.pos()) 
      picture.imageClicked.connect(self.anotherSlot) 
      grid.addWidget(picture, pos[j][0], pos[j][1]) 
      j = j + 1 
      picture.setToolTip('This is' + str(e) + ' widget') 
      picture.imageHovered.connect(self.Item_Hovered) 

     self.setStyleSheet("QGridLayout {background-image: url(./image.jpg) }"); 


    def anotherSlot(self): 
     sender = self.sender() 
     print "I clicked item " + str(sender.name) 

    def Item_Hovered(self): 
     sender = self.sender() 
     print "I'm Hovering over " + str(sender.name) 

class ImageLabel(QLabel): 

    imageClicked = Signal(str) # can be other types (list, dict, object...) 
    imageHovered = Signal(str) 
    imageLeave = Signal(str) 

    def __init__(self, image, parent=None): 
     super(ImageLabel, self).__init__(parent)   
     self.setPixmap(image) 
     # self.setMouseTracking(True) 

    def mousePressEvent(self, event): 
     print "from ImageLabel.mousePressEvent()" 
     self.imageClicked.emit("Image Clicked") 

    def enterEvent(self, event): 
     print "from ImageLabel.enterEvent()" 
     self.imageHovered.emit("Hovering") 

    def leaveEvent(self, event): 
     print "from ImageLabel.leaveEvent()" 
     self.imageLeave.emit("Hovering No More") 


a = QApplication([]) 
m = Main() 
m.show() 
sys.exit(a.exec_()) 

任何意見,將不勝感激。

回答

1

即使它的作品,你會不會得到預期的結果,只有這樣,我獲得正確的背景油漆覆蓋的paintEvent

tile = QtGui.QPixmap("x.png") 

def paintEvent(self, pe): 
    painter = QtGui.QPainter(self) 
    painter.drawTiledPixmap(self.rect(), tile) 
    super(Console, self).paintEvent(pe) 

控制檯是我class Console(QtGui.QMainWindow):類 的例子適用於整個窗口。

我不知道畫家的構造可以從paintEvent

更新移開:貌似每個paintEvent

要創建QPainter需要我找到了一個最簡單的方法,而不覆蓋paintEvent

palette = QtGui.QPalette() 
palette.setBrush(QtGui.QPalette.Background, tile) 
self.setPalette(palette) 
+0

謝謝sherpya,幫助花了一點時間來包裹我的頭,但我得到它的工作。你的解釋讓我困惑的是self.tile,它的實現是實際的pix-map圖像變量 –

+0

,它肯定會讀得更好!添加到我的片段! –

0

作爲sherpya解釋來實現微件的背景圖像中的最簡單的方法上面/窗口是丘斯托使所討論的特定小部件的paintEvent處理程序變暗,所以這裏是基於上述解釋的代碼,它終於有效。

def paintEvent(self, event): 
    self.tile= QPixmap("bookshelf.png") 
    painter = QPainter(self) 
    painter.drawTiledPixmap(self.rect(), self.tile) 
    super(Main, self).paintEvent(event) 

didnt解釋什麼sherpyas代碼(這實際上幫助我瞭解的paintEvent)是self.tile變量包含了如果油漆變量本身中引用的實際像素映射圖像。

self.tile= QPixmap("bookshelf.png") 

將繪製圖像樣式表創建錯誤的窗口小部件/窗口的背景!

+0

我已經用替代setPalette()方法更新了答案 – sherpya

1

檢查Qt Stylesheet Reference,它列出了可以使用樣式表自定義的小部件。

QGridLayout繼承自QLayout,QLayoutItem和QObject。根據參考資料,這些都不能使用樣式表進行樣式設計。

不是自定義paintEvent處理程序,只是嘗試將您的佈局放在QFrame中。 QFrame支持CSS盒子模型,因此您可以使用QFrame上的background-image屬性。