1

pyside を介して QGridLayout ウィジェットの背景画像 (アプリケーションと同じフォルダーにある) を設定しようとしていますが、スタイルシートに関するすべてのチュートリアル、ドキュメント、フォーラムの投稿を見てきましたが、まだ理解できません。私が間違っていることを出してください。

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 変数に実際の pixmap イメージが含まれており、それが paint 変数自体内で参照されている場合です。

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

スタイルシートがエラーを作成するウィジェット/ウィンドウの背景に画像を描画します!

于 2012-10-17T08:50:09.577 に答える