Создать PyQt Legend

Я пытаюсь создать себе простой графический калькулятор, чтобы научить себя PyQt. Мне бы хотелось, чтобы в калькуляторе была панель, в которой перечислены все построенные уравнения и показан стиль используемых линий.

Я начал с QListWidget, чтобы достичь этих целей, панель содержит прокручиваемый список уравнений, но не показывает стиль линий, потому что QListWidget допускает только строки или значки.

Поэтому я попытался использовать вместо этого виджет QAbstractScrollArea. Для каждого уравнения я использую QHBoxLayout для создания двух виджетов, метки, содержащей строку уравнения, и QWidget, внутри которого я рисую стиль линии. Затем я складываю все уравнения QHBoxLayouts в ScrollArea, используя QVBoxLayout.

Проблема в том, что QVBoxLayout использует все доступное ему пространство. Поэтому, если у меня есть только три уравнения, они распределены по всей панели и не перечислены в верхней части, как мне бы хотелось, в то время как если у меня слишком много уравнений, чтобы поместиться в панели, они скорее сложены друг на друга чем заставляя область прокручиваться.

Вот так выглядит калькулятор со слишком многими уравнениями...

Мой графический калькулятор со слишком многими уравнениями

И вот как это выглядит со слишком немногими...

Мой графический калькулятор со слишком малым количеством уравнений

Есть ли у кого-нибудь предложения о лучших способах решения этих проблем? Одна идея состоит в том, чтобы программно генерировать значки, чтобы иметь свойства линий и использовать их в списке виджетов, это возможно?

1 ответ

Решение

Звучит так, как будто вам нужен QListWidget с несколькими столбцами - и QTreeWidget может быть адаптирован именно для этого.

Вот простая демонстрация:

from PyQt4 import QtGui, QtCore

class Window(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.list = QtGui.QTreeWidget(self)
        self.list.setRootIsDecorated(False)
        self.list.setUniformRowHeights(True)
        self.list.setAllColumnsShowFocus(True)
        self.list.setItemsExpandable(False)
        self.list.header().hide()
        self.list.setColumnCount(2)
        for label, color in (
            ('v=x**2', 'red'),
            ('v=x/2', 'blue'),
            ('v=2*x', 'green'),
            ('v=3*2', 'orange'),
            ('v=5-x', 'purple'),
            ):
            item = QtGui.QTreeWidgetItem([label, '------------'])
            item.setForeground(1, QtGui.QColor(color))
            self.list.addTopLevelItem(item)
        layout = QtGui.QVBoxLayout(self)
        layout.addWidget(self.list)

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.setGeometry(500, 300, 300, 200)
    window.show()
    sys.exit(app.exec_())
Другие вопросы по тегам