PEHDOMя имею ввиду предложенный Вами код стр.2 пост 4
в смысле? какой “этот метод”
PEHDOMполучилось )))
super().__init__(*args, **kwargs)
PEHDOMя имею ввиду предложенный Вами код стр.2 пост 4
в смысле? какой “этот метод”
PEHDOMполучилось )))
super().__init__(*args, **kwargs)
Kyrymда, пока они храняться в памяти
И эти имена объектов “<PyQt4.QtGui.QLineEdit object at 0x00000000038A0C18>” постоянные?
KyrymПо моему нет, это всего лишь текстовое представление, генерируемое встроеным методом __str__
Можно ли на них ссылаться?
KyrymУ всех виджетов PyQt есть атрибут objectName, устанавливвется методом .setObjectName(name), и возвращаеться .objectName()
Можно ли по названию удалить некоторые поля из общей сетки
Kyrymчтобы удалить а потом вставить на его место другой виджет вам нужно запомнить его местоположение в сетке. Я уже приводил вам несколько вариантов решения ранее http://python.su/forum/topic/32446/?page=1#post-177512, Сходу могу еще пару тройку придумать.
и вставить (вставить, понятное дело, можно) на их позиции другие элементы?
Kyrymреально, в любом табличном процессоре это реализовано.
Или по имени для одной ячейки (из всей сетки) сделать проверку вводимых значений? Вопрос в том, реально ли такое?
Kyrymвсе завивит от того насколько однотипными будут ваши элементы в сетке.
И ещё меня интересует вопрос. Вообще я хочу сделать сетку (30х7, где 30 - это строки), столбцы которой будут лайнэдитами, кнопками, раскрывающимися списками. Отдельные ячейки с проверкой вводимых значений. Как думаете, стоит ли мне пытаться решить такую задачу последней методикой?
Kyrymпри таком колличетсве возможно вам действительно стоит помотреть в сторону TableWidget как советовал MrViktor, или mvc? Например вот тут https://habrahabr.ru/post/139454/ как раз пример паттерна mvc очень похожий на ваш только упрощен до минимума, одна строка три поля.
Может лучше вернуться к начальному варианту с индексами из стр. 1 поста 4, или вообще всё руками прописать? Руками бы я уже сделал, но хотелось сделать правильно - технологично! ))
MrViktorНе понял при чём тут QScrollArea.
QScrollArea
MrViktorОй, описывать я долго буду, да и думаю, это не сильно интересно. Я пока заморозил этот проект. Зато делаю другой, и успешно внедрил метод PEHDOM'a.
Kyrym
Может на словах опишете задачу (общую картину работы). Возможно вы выбрали изначально не правильный путь решения (реализации).
self.edit = QtGui.QLineEdit()
class MyTextEdit ... s = ... GridLayout.self.edit.setText(str(s)) GridLayout.__init__.self.edit.setText(str(s)) ... class GridLayout(QtGui.QWidget): def __init__(self, parent=None, *args, **kwargs): ...
Kyrymчето я нихрена не понял.. словами вы пишеете одно а в коде у вас другое.
В фунции valueChange класса MyTextEdit получили сумму ‘s’, и теперь нужно эту сумму вставить в поле self.edit.
Ни к чему не приводят попытки сделать вот так:
Kyrymа коде у вас
В классе GridLayout создали обычным образом текстовое поле:
class MyTextEdit ... s = ... GridLayout.self.edit.setText(str(s)) GridLayout.__init__.self.edit.setText(str(s))
PEHDOMНадо было мне полный код выложить.
чето я нихрена не понял.. словами вы пишеете одно а в коде у вас другое.
# Python 3. PyQt4 # -*- coding: utf-8 -*- import sys from PyQt4 import QtGui, QtCore sss_vivod = ("background-color: #d0f0c0; font: 10pt 'Arial black'") sss = ("background-color: #edecbe; font: 10pt") class MyTextEdit(QtGui.QLineEdit): # создаем свой класс наследуя QLineEdit def __init__(self, *args, **kwargs): super().__init__() self.poles = [] # пустой список ссылок на поля вычислений def addPole(self, pole): self.poles.append(pole) # добавляем ссылку на поле в список print(self.poles) def valueChange(self,*args): s=0 # по умолчанию результат = 0 for pole in self.poles: text = pole.text() if text: s+=int(text) # прошлый результат + новое значение self.setText(str(s)) print(s) self.textChanged.connect(GridLayout.gl(self,s)) #self.textChanged.connect(GridLayout.gl) return s def valueCopy(self,*args): self.selectAll() # выделяем все self.copy() # копируем в буфер class GridLayout(QtGui.QWidget): def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.setWindowTitle('Заголовок') self.grid = QtGui.QGridLayout() # ПОЛЯ n = 6 # строк m = 2 # столбцов for i in range(n): resultPole = MyTextEdit() # поле результата resultPole.setStyleSheet(sss_vivod) self.grid.addWidget(resultPole,i,m+2) butCopy = QtGui.QPushButton('Copy') butCopy.clicked.connect(resultPole.valueCopy) self.grid.addWidget(butCopy,i,m+1) for j in range(m): sourcePole = QtGui.QLineEdit() # поле данных sourcePole.setStyleSheet(sss) self.grid.addWidget(sourcePole,i,j) resultPole.addPole(sourcePole) # добавляем ссылку на поле в список sourcePole.textChanged.connect(resultPole.valueChange) self.pole_vivod = QtGui.QLineEdit() self.grid.addWidget(self.pole_vivod, n+1,m+2) self.setLayout(self.grid) def gl(self,s): s = MyTextEdit.valueChange(self,s) #s = MyTextEdit.valueChange(s) print('приём s = ',s) self.pole_vivod.setText(str(s)) app = QtGui.QApplication(sys.argv) qb = GridLayout() qb.move(250,250) qb.show() sys.exit(app.exec_())
Kyrymда вы шутите… как вы вообще чтото пишете не понимая таких элементарных вещей?
Я понимаю, что self показывает принадлежность к экземпляру класса, но когда надо прописывать self, а когда не надо, мне не понятно, поэтому стараюсь писать везде, где это относится к конструктивным элементам.
KyrymЧестно говоря нихрена всеравно непонятно, вы просто хотите чтобы когда менялось значение в любом MyTextEdit-е оно передавалось в pole_vivod?
Механика
Когда в sourcePole мы вводим значения, срабатывает функция valueChange. Она считает нам сумму s, запускает сигнал self.textChanged.connect(GridLayout.gl(self,s)), который должен передать аргумент s в функцию gl класса GridLayout, а там значение s должно приниматься s = MyTextEdit.valueChange.
Если я пишу так: s = MyTextEdit.valueChange(self,s), то программа уходит в бесконечный цикл.
# Python 3. PyQt4 # -*- coding: utf-8 -*- import sys from PyQt4 import QtGui, QtCore sss_vivod = ("background-color: #d0f0c0; font: 10pt 'Arial black'") sss = ("background-color: #edecbe; font: 10pt") class MyTextEdit(QtGui.QLineEdit): # создаем свой класс наследуя QLineEdit def __init__(self, *args, **kwargs): super().__init__() self.poles = [] # пустой список ссылок на поля вычислений def addPole(self, pole): self.poles.append(pole) # добавляем ссылку на поле в список print(self.poles) def valueChange(self,*args): s=0 # по умолчанию результат = 0 for pole in self.poles: text = pole.text() if text: s+=int(text) # прошлый результат + новое значение self.setText(str(s)) print(s) return s def valueCopy(self,*args): self.selectAll() # выделяем все self.copy() # копируем в буфер class GridLayout(QtGui.QWidget): def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.setWindowTitle('Заголовок') self.grid = QtGui.QGridLayout() # ПОЛЯ n = 6 # строк m = 2 # столбцов for i in range(n): resultPole = MyTextEdit() # поле результата resultPole.textChanged.connect(self.gl) resultPole.setStyleSheet(sss_vivod) self.grid.addWidget(resultPole,i,m+2) butCopy = QtGui.QPushButton('Copy') butCopy.clicked.connect(resultPole.valueCopy) self.grid.addWidget(butCopy,i,m+1) for j in range(m): sourcePole = QtGui.QLineEdit() # поле данных sourcePole.setStyleSheet(sss) self.grid.addWidget(sourcePole,i,j) resultPole.addPole(sourcePole) # добавляем ссылку на поле в список sourcePole.textChanged.connect(resultPole.valueChange) self.pole_vivod = QtGui.QLineEdit() self.grid.addWidget(self.pole_vivod, n+1,m+2) self.setLayout(self.grid) def gl(self, s): print('приём s = ',s) self.pole_vivod.setText(str(s)) app = QtGui.QApplication(sys.argv) qb = GridLayout() qb.move(250,250) qb.show() sys.exit(app.exec_())
PEHDOMКак оказывается, всё просто.
resultPole.textChanged.connect(self.gl)
PEHDOMИменно так. Суть в том, что pole_vivod не принадлежит классу MyTextEdit, в котором происходят расчёты, а результаты из MyTextEdit получает. Для меня это было важно.
вы просто хотите чтобы когда менялось значение в любом MyTextEdit-е оно передавалось в pole_vivod?
PEHDOMЭто я знаю. Вопрос в том, как это применять на практике. Я читал, про self, но пока так и не понял.
self пишется только когда вы описываете класс, оно означает собственно сам себя
PEHDOMЭтого мало, программа не понимает, что нужно вставить, нет никаких ссылок на ‘s’ как было в функции:
можно вообще обойтись без def gl, а resultPole.textChanged.connect(self.gl) заменить на resultPole.textChanged.connect(self.pole_vivod.setText)
Только self.pole_vivod нужно обьявить до цикла.
def gl(self,s):
# Python 3. PyQt4 # -*- coding: utf-8 -*- # подвариант 2 без доп функции gl import sys from PyQt4 import QtGui, QtCore sss_vivod = ("background-color: #d0f0c0; font: 10pt 'Arial black'") sss = ("background-color: #edecbe; font: 10pt") class MyTextEdit(QtGui.QLineEdit): # создаем свой класс наследуя QLineEdit def __init__(self, *args, **kwargs): super().__init__() self.poles = [] # пустой список ссылок на поля вычислений def addPole(self, pole): self.poles.append(pole) # добавляем ссылку на поле в список print(self.poles) def valueChange(self,*args): s=0 # по умолчанию результат = 0 for pole in self.poles: text = pole.text() if text: s+=int(text) # прошлый результат + новое значение self.setText(str(s)) return s print(s) def valueCopy(self,*args): self.selectAll() # выделяем все self.copy() # копируем в буфер class GridLayout(QtGui.QWidget): def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.setWindowTitle('Заголовок') self.grid = QtGui.QGridLayout() # ПОЛЯ n = 6 # строк m = 2 # столбцов for i in range(n): resultPole = MyTextEdit() # поле результата resultPole.setStyleSheet(sss_vivod) self.grid.addWidget(resultPole,i,m+2) butCopy = QtGui.QPushButton('Copy') butCopy.clicked.connect(resultPole.valueCopy) self.grid.addWidget(butCopy,i,m+1) self.pole_vivod = QtGui.QLineEdit() resultPole.textChanged.connect(self.pole_vivod.setText) self.grid.addWidget(self.pole_vivod, n+1,m+2) for j in range(m): sourcePole = QtGui.QLineEdit() # поле данных sourcePole.setStyleSheet(sss) self.grid.addWidget(sourcePole,i,j) resultPole.addPole(sourcePole) # добавляем ссылку на поле в список sourcePole.textChanged.connect(resultPole.valueChange) self.setLayout(self.grid) app = QtGui.QApplication(sys.argv) qb = GridLayout() qb.move(250,250) qb.show() sys.exit(app.exec_())
Kyrymпереместите self.pole_vivod = QtGui.QLineEdit() и self.grid.addWidget(self.pole_vivod, n+1,m+2) сразу после m = 2 # столбцов и будет вам щастье, а у вас оно создает 6 лайн едитов, и помещает их один над одним, потому у вас ничего и не получаеться.
Вот код, правленный, как Вы сказали - без функции:
class GridLayout(QtGui.QWidget): def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.setWindowTitle('Заголовок') self.grid = QtGui.QGridLayout() self.pole_vivod = QtGui.QLineEdit() # ПОЛЯ n = 6 # строк m = 2 # столбцов self.grid.addWidget(self.pole_vivod, n+1,m+2) for i in range(n): resultPole = MyTextEdit() # поле результата resultPole.setStyleSheet(sss_vivod) self.grid.addWidget(resultPole,i,m+2) butCopy = QtGui.QPushButton('Copy') butCopy.clicked.connect(resultPole.valueCopy) self.grid.addWidget(butCopy,i,m+1) resultPole.textChanged.connect(self.pole_vivod.setText) for j in range(m): sourcePole = QtGui.QLineEdit() # поле данных sourcePole.setStyleSheet(sss) self.grid.addWidget(sourcePole,i,j) resultPole.addPole(sourcePole) # добавляем ссылку на поле в список sourcePole.textChanged.connect(resultPole.valueChange) self.setLayout(self.grid)
Kyrymэтого более чем достаточно, читаем документацию
Этого мало, программа не понимает, что нужно вставить, нет никаких ссылок на ‘s’ как было в функции:
Kyrymчто конкретно непонятно? По помему на тостере по вашей сссылке вполне доступно обьяснено.
Это я знаю. Вопрос в том, как это применять на практике. Я читал, про self, но пока так и не понял.