我的代码包含相当多的容器。我将尝试谈论它们。我想简化设计,但如实践所示,最好更详细地解释情况并在示例中保留更多细节
- 主容器 -
main_box. 包括:color_box- 彩色容器;scroll_box- 与滚动区域关联的容器。包括:- 三个彩色容器
little_box; box_h- 水平容器。包括:box_v1- 垂直容器;box_v2- 垂直容器。
- 三个彩色容器
In box_v1is picture- 具有圆形边缘的图像。我使用类得到它RoundArt。
里面有box_v2两个铭文——label1和label2。
label2需要保存布局表单,不需要以任何方式使用。
但我label1想完全重做。label1如果应用程序窗口太小,我需要里面的文本换行。有几个条件:
- 如果可能,文本位于一行。
- 如果空间太小,文本将根据需要部分爬到第二行。
- 文本可以定位
максимум на двух строках。他不应该去第三个。 - 如果两行不够,应用程序应该用三个点修剪文本:
它是 - looooong 文本 >>> 它变成了 - looo...
^^^文本变得无法接受,应用程序将其截断
老实说,现在我不知道如何组织它。
这对我来说非常困难,但我不知道这真的是一项艰巨的任务。也许它是在数百行代码中手动完成的,或者可能有一个特殊的小部件?因此,我什至不知道这个问题有多正确。也许我现在想要的太多了。
有两个原因可以解释我为什么需要这个。
第一个原因很明显——我希望文本更明显。
第二个原因是随着文字一起,容器中的铭文变得不可见little_box。我特地把这些铭文压在了右边。我认为当label1标签空间太小时,整个容器停止缩放scroll_box,尽管容器little_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)
self.resize(900, 600)
main_box = QtWidgets.QGridLayout(self)
scrollArea = QtWidgets.QScrollArea()
container = QtWidgets.QWidget()
scrollArea.setWidget(container)
scrollArea.setWidgetResizable(True)
scrollArea.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
scroll_box = QtWidgets.QVBoxLayout(container)
main_box.addWidget(scrollArea, 0, 0)
container = QtWidgets.QWidget()
container.setFixedHeight(220)
scroll_box.addWidget(container)
box_h = QtWidgets.QHBoxLayout(container)
picture = RoundArt('Fc414959288ga866.png', 200)
box_v1 = QtWidgets.QVBoxLayout()
box_v1.addWidget(picture)
box_h.addLayout(box_v1)
box_h.addSpacing(10)
box_v2 = QtWidgets.QVBoxLayout()
box_v2.addSpacing(10)
label1 = QtWidgets.QLabel('very looooooooooooooong label')
label1.setStyleSheet(qss_lb)
label1.setFixedHeight(30)
box_v2.addWidget(label1)
box_v2.addSpacing(20)
label2 = QtWidgets.QLabel('label')
label2.setStyleSheet(qss_lb)
label2.setFixedHeight(30)
box_v2.addWidget(label2)
box_v2.addSpacing(10)
box_h.addLayout(box_v2)
container = QtWidgets.QWidget()
container.setStyleSheet('background: #3A4256;')
container.setFixedWidth(200)
main_box.addWidget(container, 0, 1)
color_box = QtWidgets.QVBoxLayout(container)
label = QtWidgets.QLabel('color box')
label.setStyleSheet(qss_lb)
color_box.addWidget(label, alignment = QtCore.Qt.AlignCenter)
for i in range(0, 3):
container = QtWidgets.QWidget()
container.setStyleSheet('background: #3A4256;')
container.setFixedHeight(50)
little_box = QtWidgets.QHBoxLayout(container)
label = QtWidgets.QLabel('label')
little_box.addWidget(label, alignment = QtCore.Qt.AlignRight)
scroll_box.addWidget(container)
qss_lb = '''QLabel {
font: bold 25px;
}'''
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
window = MyWindow()
window.setWindowTitle(' ')
window.show()
sys.exit(app.exec_())



一般来说,你需要学习:
QFontMetricsF Class-> https://doc.qt.io/qt-5/qfontmetricsf.html更新
代替:
像这样: