1

我正在尝试通过 pyside 设置 QGridLayout 小部件的背景图像(与应用程序位于同一文件夹中)但无济于事我查看了有关样式表的所有 tuts、文档和论坛帖子,但我仍然无法弄清楚找出我做错了什么。

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

任何意见,将不胜感激。

4

3 回答 3

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

更新:看起来QPainter需要在每个上创建paintEvent

我找到了一种最简单的方法,无需覆盖paintEvent

palette = QtGui.QPalette()
palette.setBrush(QtGui.QPalette.Background, tile)
self.setPalette(palette)
于 2012-10-10T23:26:23.660 回答
1

检查Qt Stylesheet Reference,它列出了可以使用样式表自定义的小部件。

QGridLayout 继承自 QLayout、QLayoutItem 和 QObject。根据参考资料,这些都不能使用样式表进行样式设置。

无需自定义paintEvent 处理程序,只需尝试将您的布局放在QFrame 中。QFrame 支持 CSS 盒子模型,因此您可以在 QFrame 上使用 background-image 属性。

于 2014-03-12T15:57:18.837 回答
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)

sherpyas 代码没有解释(这实际上帮助我理解了paintEvent)是self.tile 变量包含实际的像素图图像,如果在paint 变量本身中引用该图像。

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

将图像绘制到样式表创建错误的小部件/窗口的背景!

于 2012-10-17T08:50:09.577 回答