该容器box包含四个小部件:
picture- 使用类获得的圆形图像RoundArt;- 三个小部件
Qlabel:album_title;artist;year.
申请窗口:
小部件Qlabel可以随心所欲地分布在整个容器中。我无法控制它们,真的想通过设置小部件之间的距离来解决这个问题box:
Lpicture是从到每个Qlabel'a的水平距离。保持文本左对齐很重要。必须是常数并且等于 10px
H - 小部件之间的垂直距离Qlabel。必须为常数且等于 20px
请帮我安排box.
from PyQt5 import QtCore, QtWidgets, QtGui
class RoundArt(QtWidgets.QLabel):
clicked = QtCore.pyqtSignal()
def __init__(self, picture, x, *args, **kwargs):
super(RoundArt, self).__init__(*args, **kwargs)
self.setFixedSize(x, x)
self.x = x
self.radius = 10
self.setPicture(picture)
def setPicture(self, picture):
target = QtGui.QPixmap(self.size())
target.fill(QtCore.Qt.transparent)
p = QtGui.QPixmap(picture).scaled(
self.x, self.x, QtCore.Qt.KeepAspectRatioByExpanding,
QtCore.Qt.SmoothTransformation
)
painter = QtGui.QPainter(target)
painter.setRenderHint(QtGui.QPainter.Antialiasing, True)
painter.setRenderHint(QtGui.QPainter.HighQualityAntialiasing, True)
painter.setRenderHint(QtGui.QPainter.SmoothPixmapTransform, True)
path = QtGui.QPainterPath()
path.addRoundedRect(0, 0, self.width(), self.height(), self.radius, self.radius)
painter.setClipPath(path)
painter.drawPixmap(0, 0, p)
self.setPixmap(target)
painter.end()
target = None
def mouseReleaseEvent(self, event):
self.clicked.emit()
class MyWindow(QtWidgets.QWidget):
def __init__(self, parent = None):
super().__init__(parent)
box = QtWidgets.QGridLayout(self)
picture = RoundArt('album.png', 150)
box.addWidget(picture, 0, 0, 3, 1)
album_title = QtWidgets.QLabel('Album Title')
box.addWidget(album_title, 0, 1)
artist = QtWidgets.QLabel('Artist')
box.addWidget(artist, 1, 1)
year = QtWidgets.QLabel('2001')
box.addWidget(year, 2, 1)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
window = MyWindow()
window.setWindowTitle(' ')
window.show()
sys.exit(app.exec_())


使用组合更容易
Layout-ов。试试这样: