2012-10-10 1 views
1

QSD를 통해 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

를 오버라이드 (override)되어 달성
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

업데이트에서 멀리 이동할 수 있습니다 확실하지 않다가 : QPainter 요구는 각 paintEvent

에 생성 할 수처럼 내가 무시하지 않고 쉬운 방법을 발견했습니다 보인다 sherpya는 위젯의 배경 이미지를 달성하는 가장 쉬운 방법은 위의 설명과 같이 paintEvent

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

감사합니다 sherpya 내 머리를 감싸는 데 조금 시간이 걸렸지 만 제대로 작동하도록했습니다. 귀하의 설명과 함께 나를 혼란스럽게 self.tile 실현에 실제로 더 나은 읽을 수있는 실제 pix - map 이미지 변수 –

+0

했습니다! 내 발췌 문장에 추가! –

0

/창이 고객 사양이다 문제의 특정 위젯의 paintEvent 핸들러를 없애고 마침내 위의 설명에 기반한 코드가 완성되었습니다. (실제로 나를 paintEvent을 이해하는 데 도움) 설명 didnt는 무엇 sherpyas 코드

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

는 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 속성을 사용할 수 있습니다.

관련 문제