Добавление дополнительных параметров в подкласс QWidget с использованием PySide

Я добавляю параметр цвета в подкласс LineBand QWidget. Я нашел несколько примеров того, как добавить дополнительные параметры в подкласс в Python 3, и считаю, что я следовал совету. Тем не менее, когда я вызываю новую версию класса с помощью box = LineBand(self.widget2, color)Я получаю ошибку File "C:/Users/...", line 63, in showBoxes ... box = LineBand(viewport, color) ... TypeError: __init__() takes 2 positional arguments but 3 were given, Но я вызываю LineBand только с двумя аргументами, верно? Ниже приведен полный код. Я прокомментировал все разделы, которые я изменил. Я также прокомментировал код, который меняет цвет фона текста, чтобы более четко видеть цветные линии (когда они на самом деле нарисованы). Код цвета фона работает нормально.

import sys
from PySide.QtCore import *
from PySide.QtGui import *

db = ((5,8,'A',Qt.darkMagenta),(20,35,'B',Qt.darkYellow),(45,60,'C',Qt.darkCyan)) # added color to db

class TextEditor(QTextEdit):
    def __init__(self, parent=None):
        super().__init__(parent)
        text="This is example text that is several lines\nlong and also\nstrangely broken up and can be\nwrapped."
        self.setText(text)
        cursor = self.textCursor()
        for n in range(0,len(db)):
            row = db[n]
            startChar = row[0]
            endChar = row[1]
            id = row[2]
            color = row[3]  # assign color from db to variable
            cursor.setPosition(startChar)
            cursor.movePosition(QTextCursor.NextCharacter, QTextCursor.KeepAnchor, endChar-startChar)
            #charfmt = cursor.charFormat()
            #charfmt.setBackground(QColor(color)) # assign color to highlight (background)
            #cursor.setCharFormat(charfmt)
        cursor.clearSelection()
        self.setTextCursor(cursor)

    def getBoundingRect(self, start, end):
        cursor = self.textCursor()
        cursor.setPosition(end)
        last_rect = end_rect = self.cursorRect(cursor)
        cursor.setPosition(start)
        first_rect = start_rect = self.cursorRect(cursor)
        if start_rect.y() != end_rect.y():
            cursor.movePosition(QTextCursor.StartOfLine)
            first_rect = last_rect = self.cursorRect(cursor)
            while True:
                cursor.movePosition(QTextCursor.EndOfLine)
                rect = self.cursorRect(cursor)
                if rect.y() < end_rect.y() and rect.x() > last_rect.x():
                    last_rect = rect
                moved = cursor.movePosition(QTextCursor.NextCharacter)
                if not moved or rect.y() > end_rect.y():
                    break
            last_rect = last_rect.united(end_rect)
        return first_rect.united(last_rect)



class Window(QWidget):
    def __init__(self):
        super(Window, self).__init__()
        self.edit = TextEditor(self)
        layout = QVBoxLayout(self)
        layout.addWidget(self.edit)
        self.boxes = []

    def showBoxes(self):
        while self.boxes:
            self.boxes.pop().deleteLater()
        viewport = self.edit.viewport()
        for start, end, id, color in db:  # get color too
            rect = self.edit.getBoundingRect(start, end)
            box = LineBand(viewport, color) # call LineBand with color as argument
            box.setGeometry(rect)
            box.show()
            self.boxes.append(box)

    def resizeEvent(self, event):
        self.showBoxes()
        super().resizeEvent(event)

class LineBand(QWidget):
    def __init__(self, color):  # define color within __init__
        super().__init__(self)
        self.color = color


    def  paintEvent(self, event):
        painter = QPainter(self)
        painter.setRenderHint(QPainter.Antialiasing)
        painter.setPen(QPen(color, 1.8)) # call setPen with color
        painter.drawLine(self.rect().topLeft(), self.rect().bottomRight())

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    window.showBoxes()
    app.exec_()
    sys.exit(app.exec_())

1 ответ

Решение

Когда метод не перезаписывается, он будет таким же, как реализованный метод родительского элемента, поэтому, если вы хотите, чтобы он работал, вы должны добавить эти параметры, так как они много раз зависят от родительского элемента. Простой способ - это использовать *args а также **kwargs и передайте новый параметр в качестве первого параметра. Кроме того, вы должны использовать self.color вместо цвета, так как цвет существует только в конструкторе.

class Window(QWidget):
    [...]
    def showBoxes(self):
        while self.boxes:
            self.boxes.pop().deleteLater()
        viewport = self.edit.viewport()
        for start, end, id, color in db:  # get color too
            rect = self.edit.getBoundingRect(start, end)
            box = LineBand(color, viewport) # call LineBand with color as argument
            box.setGeometry(rect)
            box.show()
            self.boxes.append(box)
    [...]

class LineBand(QWidget):
    def __init__(self, color, *args, **kwargs):
        QWidget.__init__(self, *args, **kwargs)
        self.color = color


    def  paintEvent(self, event):
        painter = QPainter(self)
        painter.setRenderHint(QPainter.Antialiasing)
        painter.setPen(QPen(self.color, 1.8)) # call setPen with color
        painter.drawLine(self.rect().topLeft(), self.rect().bottomRight())

Выход:

Другие вопросы по тегам