Не могу вставить текст в QLineEdit, если функция вставки текста в другом классе

Подскажите, пожалуйста, в чём проблема? Пытаюсь при двойном клике на строку таблицы вставить значение в QLineEdit.
Если вызываю функцию вставки из класса, в котором QLineEdit, то всё ок, а если из другого класса, то просто ничего не происходит.

class Model(QSqlQueryModel):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.start_query()

    def start_query(self):
        sql = 'select id_project, name_project, type_project, id_text, title_text, text, labels_text, spans_text, link_text from import ;'
        self.setQuery(sql)



    class View(QTableView):

    def __init__(self, parent=None):
        super().__init__(parent)

        model = Model(parent=self)
        self.setModel(model)

        self.setSelectionBehavior(self.SelectRows)
        self.setSortingEnabled(True)
        self.hideColumn(0)
        self.hideColumn(1)
        self.hideColumn(2)
        self.hideColumn(3)
        self.hideColumn(5)
        self.hideColumn(6)
        self.hideColumn(7)
        self.hideColumn(8)

        vh = self.verticalHeader()
        vh.setSectionResizeMode(vh.ResizeToContents)

        hh = self.horizontalHeader()
        hh.setSectionResizeMode(hh.ResizeToContents)
        hh.setSectionResizeMode(2, hh.Stretch)

        self.doubleClicked.connect(self.insert)

    @pyqtSlot()
    def insert(self):
        row = self.currentIndex().row()
        text_insert = self.model().record(row).value(2)
        TextInfo().name_project(text_insert)



class TextInfo(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)

        lay_dw = QVBoxLayout(self)

        lay1 = QVBoxLayout(self)

        lay_project_info = QHBoxLayout(self)
        name_project_lbl = QLabel('Name project:', parent=self)
        self.__name_project_edt = QLineEdit(parent=self)
        type_project_lbl = QLabel('Type project:', parent=self)
        self.__type_project_edt = QLineEdit(parent=self)
        lay_project_info.addWidget(name_project_lbl)
        lay_project_info.addWidget(self.name_project_edt)
        lay_project_info.addWidget(type_project_lbl)
        lay_project_info.addWidget(self.__type_project_edt)

        lay_text_info = QHBoxLayout(self)
        id_lbl = QLabel('ID text:', parent=self)
        self.__id_edt = QLineEdit(parent=self)
        title_lbl = QLabel('Title text:', parent=self)
        self.__title_edt = QLineEdit(parent=self)
        label_lbl = QLabel('Label text:', parent=self)
        self.__label_edt = QLineEdit(parent=self)
        lay_text_info.addWidget(id_lbl)
        lay_text_info.addWidget(self.__id_edt)
        lay_text_info.addWidget(title_lbl)
        lay_text_info.addWidget(self.__title_edt)
        lay_text_info.addWidget(label_lbl)
        lay_text_info.addWidget(self.__label_edt)

        lay_text = QVBoxLayout(self)
        text_lbl = QLabel('Text', parent=self)
        self.__text_edt = QTextEdit(parent=self)
        lay_text.addWidget(text_lbl)
        lay_text.addWidget(self.__text_edt)

        lay1.addLayout(lay_project_info)
        lay1.addLayout(lay_text_info)
        lay1.addLayout(lay_text)

        lay2 = QHBoxLayout(self)

        left_btn = QPushButton()
        left_btn.setIcon(QtGui.QIcon('left.png'))
        central_btn = QPushButton()
        central_btn.setIcon((QtGui.QIcon('web.png')))
        right_btn = QPushButton()
        right_btn.setIcon(QtGui.QIcon('right.png'))

        lay2.addWidget(left_btn)
        lay2.addWidget(central_btn)
        lay2.addWidget(right_btn)

        lay_dw.addLayout(lay1)
        lay_dw.addLayout(lay2)

    @property
    def name_project(self):
        result = self.__name_project_edt.text().strip()
        return result

    @name_project.setter
    def name_project(self, value):
        print(value)
        self.__name_project_edt.setText(value)

Получается, при двойном клике по таблице должен вставляться текст в поле self.__name_project_edt, но ничего не происходит.

Ниже приложил код MainMenu. Чтобы красиво отображалось главное окно, создал виджет, в который поместил таблицу из View и layout'ы из TextInfo. Для тестов назначал функцию добавления текста в поле на одну из кнопок из TextInfo и всё работает!

class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)

        main_menu = MainMenu(parent=self)

        self.widget = QWidget(self)
        lay = QHBoxLayout(self.widget)
        v = Table.View(parent=self.widget)
        t = Table.TextInfo(parent=self.widget)
        lay.addWidget(v)
        lay.addWidget(t)
        self.setCentralWidget(self.widget)

Ответы (1 шт):

Автор решения: S. Nick
  1. Пример, который вы предоставили, проверить невозможно, потому что он не воспроизводимый.
    Пожалуйста, всегда предоставляйте минимально-воспроизводимый пример, который демонстрирует проблему.

  2. Я поменял модель на QStandardItemModel, чтобы запустить ваш код и показать ошибки, которые вы сделали.

  3. Основная ваша ошибка в строке:

    TextInfo().name_project(text_insert)

    т.к. TextInfo() это совсем другой объект и совсем не тот куда вам надо вставить текст.

  4. Наследоваться от self может только ОДИН менеджер компоновки.

  5. О сигнале:
    void QAbstractItemView::doubleClicked(const QModelIndex &index)


main.py

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *


class TextInfo(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)

        lay_dw = QVBoxLayout(self)

#        lay1 = QVBoxLayout(self)                                    # ? (self) 
        lay1 = QVBoxLayout()

#        lay_project_info = QHBoxLayout(self)                        # ? (self) 
        lay_project_info = QHBoxLayout()
        
        name_project_lbl = QLabel('Name project:', parent=self)
        self.__name_project_edt = QLineEdit(parent=self)
        type_project_lbl = QLabel('Type project:', parent=self)
        self.__type_project_edt = QLineEdit(parent=self)
        lay_project_info.addWidget(name_project_lbl)

# ?     lay_project_info.addWidget(self.name_project_edt)
        lay_project_info.addWidget(self.__name_project_edt)          # +++
        
        lay_project_info.addWidget(type_project_lbl)
        lay_project_info.addWidget(self.__type_project_edt)

#        lay_text_info = QHBoxLayout(self)                           # ? (self)
        lay_text_info = QHBoxLayout()
        
        id_lbl = QLabel('ID text:', parent=self)
        self.__id_edt = QLineEdit(parent=self)
        
        title_lbl = QLabel('Title text:', parent=self)
        self.__title_edt = QLineEdit(parent=self)
        label_lbl = QLabel('Label text:', parent=self)
        self.__label_edt = QLineEdit(parent=self)
        lay_text_info.addWidget(id_lbl)
        lay_text_info.addWidget(self.__id_edt)
        lay_text_info.addWidget(title_lbl)
        lay_text_info.addWidget(self.__title_edt)
        lay_text_info.addWidget(label_lbl)
        lay_text_info.addWidget(self.__label_edt)

#        lay_text = QVBoxLayout(self)                                # ? (self)
        lay_text = QVBoxLayout()
        
        text_lbl = QLabel('Text', parent=self)
        self.__text_edt = QTextEdit(parent=self)
        lay_text.addWidget(text_lbl)
        lay_text.addWidget(self.__text_edt)

        lay1.addLayout(lay_project_info)
        lay1.addLayout(lay_text_info)
        lay1.addLayout(lay_text)

#        lay2 = QHBoxLayout(self)                                    # ? (self)
        lay2 = QHBoxLayout()

        left_btn = QPushButton('left')
        left_btn.setIcon(QtGui.QIcon('left.png'))
        central_btn = QPushButton('central')
        central_btn.setIcon((QtGui.QIcon('Ok.png')))                 # 'web.png'
        right_btn = QPushButton('right')
        right_btn.setIcon(QtGui.QIcon('right.png'))

        lay2.addWidget(left_btn)
        lay2.addWidget(central_btn)
        lay2.addWidget(right_btn)

        lay_dw.addLayout(lay1)
        lay_dw.addLayout(lay2)


# ? @property
# ? def name_project(self):
# ?     result = self.__name_project_edt.text().strip()
# ?     return result
    
# ? @name_project.setter
    def name_project(self, value):
        # print(value)
        self.__name_project_edt.setText(value)


''' # ???
class Model(QSqlQueryModel):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.start_query()

    def start_query(self):
        sql = 'select id_project, name_project, type_project, id_text, title_text, text, labels_text, spans_text, link_text from import ;'
        self.setQuery(sql)
''' # ???
    

class View(QTableView):
    def __init__(self, parent=None):
        super().__init__(parent)
# +++        
        self.parent = parent                                         # !!! +++

# Свою модель и данные добавите самостоятельно
# ?        model = Model(parent=self)
# ?        self.setModel(model)

# Для демонстрации и тестирования
        self.model = QStandardItemModel(self)                        # +
        self.model.setColumnCount(8)                                 # +
        self.model.setRowCount(2)                                    # +

        self.setModel(self.model)

# Это ваше добавите все что вам надо
        '''
        self.setSelectionBehavior(self.SelectRows)
        self.setSortingEnabled(True)
        self.hideColumn(0)
        self.hideColumn(1)
        self.hideColumn(2)
        self.hideColumn(3)
        self.hideColumn(5)
        self.hideColumn(6)
        self.hideColumn(7)
        self.hideColumn(8)
        
        vh = self.verticalHeader()
        vh.setSectionResizeMode(vh.ResizeToContents)

        hh = self.horizontalHeader()
        hh.setSectionResizeMode(hh.ResizeToContents)
        hh.setSectionResizeMode(2, hh.Stretch)
        '''
        
#        self.doubleClicked.connect(self.insert)
        self.doubleClicked.connect(self.onDoubleClick)           
        
#    @pyqtSlot()
#    def insert(self):
# ------------------------> vvvvv <---------------------------------------------
    def onDoubleClick(self, index):    
        #print(f"onDoubleClick: row =`{index.row()}`, column =`{index.column()}`")

# Данные из своей модели получите самостоятельно        
#        row = self.currentIndex().row()
#        text_insert = self.model().record(row).value(2)

#        TextInfo().name_project(text_insert)    
        print(f'222 {TextInfo()} <------- объект, в который вы хотите вставить значение в QLineEdit\n') #
        
        item = self.model.item(index.row(), index.column())                        # +
        text_insert = item.text() if item else 'Тут должно быть название проекта?' # + 
# ----> vvvvvvvvvvvvv <---------------------------------------------------------------        
        self.parent.t.name_project(text_insert)                              # !!! +++ 
        
    
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

# ?      main_menu = MainMenu(parent=self)

        self.widget = QWidget(self)
        self.setCentralWidget(self.widget)

#       v = Table.View(parent=self.widget)
# -------------> vvvv <----------------------------------------------------        
        v = View(self)
#       t = Table.TextInfo(parent=self.widget)
# ----- vvvv -----------> vvvv <------------------------------------------- !!! +++ 
        self.t = TextInfo(self)
        print(f'\n111 {self.t} <------- объект, который вы показываете в окне')       
        
        lay = QHBoxLayout(self.widget)        
        lay.addWidget(v)
        lay.addWidget(self.t)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = MainWindow()
    w.resize(840, 480)
    w.show()
    sys.exit(app.exec())

введите сюда описание изображения

введите сюда описание изображения

→ Ссылка