Создать 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_())