Как сделать клетчатый lineEdit?

Как можно и можно ли вообще сделать такой lineEdit (как на бланках ОГЭ/ЕГЭ)?

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


Ответы (2 шт):

Автор решения: CameL

Если в лоб, то вот так можно. Правда как считывать это - сами придумывайте

from PyQt5.QtWidgets import *
class Window(QMainWindow):
    def __init__(self):
        super().__init__()

        for i in range(10):
            ln = QLineEdit(self)
            ln.setGeometry(100+i * 20, 100, 15,15)
            ln.setMaxLength(1)

if __name__ == '__main__':
    import sys

    app = QApplication(sys.argv)
    window = Window()
    window.setGeometry(450, 200, 800, 600)
    window.show()
    sys.exit(app.exec_())

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

→ Ссылка
Автор решения: Chorkov
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys


boxPointSize = 15
boxPointSpace = 5


class BoxedLineEdit(QLineEdit):
    def __init__(self, maxWidth,*args):
        assert (maxWidth>0)

        super().__init__(*args)

        font = QFontDatabase.systemFont(QFontDatabase.FixedFont)
        font.setPointSize( boxPointSize - 2 )
        metrics = QFontMetrics(font)
        w=metrics.width("A")
        h=metrics.height()
        font.setLetterSpacing( QFont.AbsoluteSpacing ,  boxPointSize+boxPointSpace - w )
        
        self.setFont(font)
        self.setMaxLength(maxWidth)
        self.setStyleSheet("background-color: transparent; margin:0px; border:0pt solid tranparent; ")
        self.setFixedSize( (boxPointSpace+boxPointSize)*(maxWidth+1) - w  , (boxPointSpace+boxPointSize) )
        
    def paintEvent(self, event):
        super().paintEvent(event)
        painter = QPainter(self)
        for i in range( self.maxLength() ) :
            painter.setPen(QColor(0, 0, 0))
            painter.drawRect( QRect( (boxPointSpace+boxPointSize)*i,  boxPointSpace*0.5 , boxPointSize, boxPointSize ) )


class Window(QMainWindow):
    def __init__(self):
        super().__init__()
        layout = QHBoxLayout()
        ln = BoxedLineEdit(25,self)
        layout.addWidget( ln )
        self.setLayout(layout)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())
→ Ссылка