Не могу вставить текст в 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 шт):
Пример, который вы предоставили, проверить невозможно, потому что он не воспроизводимый.
Пожалуйста, всегда предоставляйте минимально-воспроизводимый пример, который демонстрирует проблему.Я поменял модель на
QStandardItemModel
, чтобы запустить ваш код и показать ошибки, которые вы сделали.Основная ваша ошибка в строке:
TextInfo().name_project(text_insert)
т.к.
TextInfo()
это совсем другой объект и совсем не тот куда вам надо вставить текст.Наследоваться от
self
может только ОДИН менеджер компоновки.О сигнале:
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())