Как отрисовать линию в Layout, не выходя за размеры виджета?
В HBoxLayout 3 виджета. В центральном необходимо отрисовать линию на всю длину свободного пространства, но не увеличивая размер виджета и не задавая абсолютную длину линию. В идеале, чтобы линия растягивалась на всю длину просто. Если рисовать на Painter'ом, то приходится абсолютно задавать длину и виджет растягивается.
Пример:
import sys
from PyQt5.Qt import *
class Demo(QWidget):
def __init__(self):
super().__init__()
vbox = QHBoxLayout(self)
label = QLabel(f'Привет')
label2 = QLabel(f'Пока')
canvas = QImage(1400, 1, QImage.Format_ARGB32)
canvas.fill(Qt.transparent)
painter = QPainter(canvas)
painter.setRenderHint(QPainter.Antialiasing, True)
painter.setPen(QColor(5, 123, 233))
painter.drawLine(0, 1, 1000, 1) # Задаем длину линии
painter.end()
pixmap = QPixmap.fromImage(canvas)
line = QLabel()
line.setFixedHeight(1)
line.setPixmap(pixmap)
vbox.addWidget(label)
vbox.addWidget(line)
vbox.addWidget(label2)
if __name__ == '__main__':
app = QApplication(sys.argv)
w = Demo()
w.resize(700,540) # Размер виджета меньше длины линии
w.show()
sys.exit(app.exec_())
Ответы (2 шт):
Автор решения: eri
→ Ссылка
class Ui_Form(object):
def setupUi(self, Form):
if not Form.objectName():
Form.setObjectName(u"Form")
Form.resize(400, 300)
self.horizontalLayout = QHBoxLayout(Form)
self.horizontalLayout.setObjectName(u"horizontalLayout")
self.label = QLabel(Form)
self.label.setObjectName(u"label")
self.horizontalLayout.addWidget(self.label)
self.line = QFrame(Form)
self.line.setObjectName(u"line")
self.line.setFrameShape(QFrame.HLine)
self.horizontalLayout.addWidget(self.line)
self.label_2 = QLabel(Form)
self.label_2.setObjectName(u"label_2")
self.horizontalLayout.addWidget(self.label_2)
self.retranslateUi(Form)
QMetaObject.connectSlotsByName(Form)
# setupUi
def retranslateUi(self, Form):
Form.setWindowTitle(QCoreApplication.translate("Form", u"Form", None))
self.label.setText(QCoreApplication.translate("Form", u"TextLabel", None))
self.label_2.setText(QCoreApplication.translate("Form", u"TextLabel", None))
# retranslateUi
Автор решения: S. Nick
→ Ссылка
Просто демонстрация того, что вам подошло:
import sys
from PyQt5.Qt import *
class Demo(QWidget):
def __init__(self):
super().__init__()
label = QLabel(f'Привет')
self.line = QFrame()
self.line.setFrameShape(QFrame.HLine)
label2 = QLabel(f'Пока')
vbox = QHBoxLayout(self)
vbox.addWidget(label)
vbox.addWidget(self.line, stretch=1)
vbox.addWidget(label2)
if __name__ == '__main__':
app = QApplication(sys.argv)
w = Demo()
w.resize(700, 100)
w.show()
sys.exit(app.exec_())
