млин вы вообще понимаете что пишете? это же бред сивой кобылы.
увидев это
j = 0
for i in names_pole:
self.pole = QtGui.QLineEdit(i)
self.grid.addWidget(self.pole, pos_pole[j][0], pos_pole[j][1])
j = j + 1
self.pole.textChanged.connect(self.on_start) # сигнал изм текста
я впал в ступор минут на 10 пытаясь осознать что вы делаете. Вы вообще понимаете смысл выражения
self.атрибут. Зачем вы в цикле 6 раз перназначаете self.pole? Вы думаете оно будет хранить ссылки на все 6 ЛайнЕдитов что вы создаете? Авотвамхрен, оно будет хранить ссылку только на последний созданый ЛайнЕдит. А про enumerate вы когданибудь слышали?
Если уж у вас заранее неизвестное колличество элементов на форме, можно воспользоваться словарем для хранения ссылок на элементы. Пример:
self._widget ={}
for i in range(3):
for j in range(2):
self._widget[(i,j)] = QtGui.QLineEdit('pole {} ,{}'.format(i,j))
self.grid.addWidget(self._widget[(i,j)],i,j)
names_pole = ['12','7','4']
for i,name in enumerate(names_pole):
self._widget[(i,0)].setText(name)
self._widget[(i,0)].textChanged.connect(self.on_start)
замените этот кусок
for i,name in enumerate(names_pole):
pole = QtGui.QLineEdit(name)
self.grid.addWidget(pole,i,0)
pole.textChanged.connect(self.on_start) # сигнал изм текста
pole = QtGui.QLineEdit()
self.grid.addWidget(pole,i,1)
тогда вы сможете обратиться к виджету просто зная его положение простым
self._widget[(row,column)]
но если уж вам так захотелось извращений, то в принципе можно найти виджет по его позиции в QgridLayout, :
# -*- coding: utf-8 -*-
import sys
from PyQt4 import QtGui
class GridLayout(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.setWindowTitle('Заголовок')
self.grid = QtGui.QGridLayout()
# ПОЛЯ
names_pole = ['12','7','4']
for i,name in enumerate(names_pole):
pole = QtGui.QLineEdit(name)
self.grid.addWidget(pole,i,0)
pole.textChanged.connect(self.on_start) # сигнал изм текста
pole = QtGui.QLineEdit()
self.grid.addWidget(pole,i,1)
# КНОПКИ
names_button = ['Copy', 'Copy', 'Copy']
for i, name in enumerate(names_button):
button = QtGui.QPushButton(name+str(i))
self.grid.addWidget(button, i,2)
button.clicked.connect(self.on_click)
self.setLayout(self.grid)
def on_start(self):
pole = self.sender() #Лайн едид отправитель сигнала
idx = self.grid.indexOf(pole) # индекс отправителя сигнала
location = self.grid.getItemPosition(idx) # положение в гриде
poleX2 = self.grid.itemAtPosition(location[0],location[1]+1).widget() # соседнее поле
poleX2.setText(pole.text()*2)
print('старт', pole.text()*2)
def on_click(self):
button = self.sender()
idx = self.grid.indexOf(button)
location = self.grid.getItemPosition(idx)
pole = self.grid.itemAtPosition(location[0],location[1]-1).widget()
print(pole.text(),'клик')
app = QtGui.QApplication(sys.argv)
qb = GridLayout()
qb.show()
sys.exit(app.exec_())
Но это как рвать гланды через жопу
ЗЫ немного поправил ваш пример.
можно хранить ссылки на обьекты прямо в самих обьектах:
# -*- coding: utf-8 -*-
import sys
from PyQt4 import QtGui
class GridLayout(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.setWindowTitle('Заголовок')
self.grid = QtGui.QGridLayout()
# ПОЛЯ
names_pole = ['12','7','4']
self._widget ={}
for i in range(3):
for j in range(2):
self._widget[(i,j)] = QtGui.QLineEdit('pole {} ,{}'.format(i,j))
self.grid.addWidget(self._widget[(i,j)],i,j)
for i,name in enumerate(names_pole):
self._widget[(i,0)].setText(name)
self._widget[(i,0)].textChanged.connect(self.on_start)
self._widget[(i,0)].x2widget = (i,1)
# КНОПКИ
names_button = ['Copy', 'Copy', 'Copy']
for i, name in enumerate(names_button):
self._widget[(i,2)] = QtGui.QPushButton(name+str(i))
self.grid.addWidget(self._widget[(i,2)], i,2)
self._widget[(i,2)].clicked.connect(self.on_click)
self._widget[(i,2)].source = (i,1)
self.setLayout(self.grid)
def on_start(self):
pole = self.sender() #Лайн едид отправитель сигнала
self._widget[pole.x2widget].setText(pole.text()*2)
print('старт', pole.text()*2)
def on_click(self):
button = self.sender()
print(self._widget[button.source].text(),'клик')
app = QtGui.QApplication(sys.argv)
qb = GridLayout()
qb.show()
sys.exit(app.exec_())
или даже так:
# -*- coding: utf-8 -*-
import sys
from PyQt4 import QtGui
class GridLayout(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.setWindowTitle('Заголовок')
self.grid = QtGui.QGridLayout()
# ПОЛЯ
names_pole = ['12','7','4']
names_button = ['Copy', 'Copy', 'Copy']
for i in range(3):
poleX1 = QtGui.QLineEdit(names_pole[i])
self.grid.addWidget(poleX1,i,0)
poleX2 = QtGui.QLineEdit('pole {} ,{}'.format(i,1))
self.grid.addWidget(poleX2,i,1)
poleX1.textChanged.connect(self.on_start)
poleX1.poleX2 = poleX2
button = QtGui.QPushButton(names_button[i]+str(i))
self.grid.addWidget(button,i,2)
button.clicked.connect(self.on_click)
button.poleX2 = poleX2
self.setLayout(self.grid)
def on_start(self):
pole = self.sender() #Лайн едид отправитель сигнала
pole.poleX2.setText(pole.text()*2)
print('старт', pole.text()*2)
def on_click(self):
button = self.sender()
print(button.poleX2.text(),'клик')
app = QtGui.QApplication(sys.argv)
qb = GridLayout()
qb.show()
sys.exit(app.exec_())
А можно банально давать имена всем обьектам по типу obj.setObjectName('ИмяОбьекта')
а потом искать их по имени через метод родителя parent.findChild('ИмяОбьекта')