Как отрисовать линию в 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_())

введите сюда описание изображения

→ Ссылка