Открыть новое окно нажав на ячейку в таблице QTableView

Мне понадобилось сделать приложение напоминающее медицинскую картотеку, это по сути мой первый проект и для реализации я выбрал PyQt6, ну и Qt Designer для большей простоты.
И я столкнулся с проблемой. Мне нужно создать как бы стартовое окно, в котором я смогу смотреть на список карточек пациентов, в этом проблемы я не вижу, я уже понял как подключить к объекту "tableView" столбец с базы данных.
Но вот как сделать так, чтобы этот список представлял собой как бы список ссылок (или может добавить кнопки?) и чтобы при нажатии на одну из них открывалось новое окно с шаблоном заполненным данными взятыми из БД, проще говоря карточка пациента.

Я пытался найти решение, но не смог нагуглить что-то, что мне бы помогло.

Вот пример моего кода, это код из основного файла, в нем я практически ничего еще не реализовал, только к кнопке подвязал открытие нового окна для создания новой записи в БД.
Файлов всего четыре, два из них сделаны программой Qt Designer (это те окна которые я сделал в этой программе) и в еще одной я подключил базу данных.

from PyQt6 import QtCore, QtGui, QtWidgets
from data_base import *
from MainForm import Ui_MainWindow
from case_record import Ui_Dialog

import sys

"""Создание екземляра класса QSqlTableModel, установки таблицы patients"""
Patients = QSqlTableModel()
Patients.setTable('patients')
Patients.select()


def otherWindow(): #Карточка пациента
    global Dialog
    Dialog = QtWidgets.QDialog()
    ui = Ui_Dialog()
    ui.setupUi(Dialog)
    Dialog.show()

def katalog(): #Главная страница со списком карточек
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()

    ui.pushButton.clicked.connect(otherWindow) #Подключение к кнопке открытия нового окна

    """Связывание таблици базы данных с обьектом 'tableView' и сортирока по столбцам"""
    ui.tableView.setModel(Patients)
    ui.tableView.setSortingEnabled(True)

    sys.exit(app.exec())

if __name__ == '__main__':
    katalog() #Main_window

И остальной код сгенерированный Qt Designer:

from PyQt6 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(561, 619)
        MainWindow.setAccessibleName("")
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.tableView = QtWidgets.QTableView(self.centralwidget)
        self.tableView.setGeometry(QtCore.QRect(10, 20, 541, 321))
        self.tableView.setObjectName("tableView")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(420, 540, 131, 23))
        self.pushButton.setObjectName("pushButton")
        self.label_4 = QtWidgets.QLabel(self.centralwidget)
        self.label_4.setGeometry(QtCore.QRect(10, 400, 101, 21))
        font = QtGui.QFont()
        font.setPointSize(11)
        self.label_4.setFont(font)
        self.label_4.setObjectName("label_4")
        self.label_5 = QtWidgets.QLabel(self.centralwidget)
        self.label_5.setGeometry(QtCore.QRect(10, 430, 101, 21))
        font = QtGui.QFont()
        font.setPointSize(11)
        self.label_5.setFont(font)
        self.label_5.setObjectName("label_5")
        self.label_6 = QtWidgets.QLabel(self.centralwidget)
        self.label_6.setGeometry(QtCore.QRect(10, 460, 101, 21))
        font = QtGui.QFont()
        font.setPointSize(11)
        self.label_6.setFont(font)
        self.label_6.setObjectName("label_6")
        self.label_7 = QtWidgets.QLabel(self.centralwidget)
        self.label_7.setGeometry(QtCore.QRect(10, 490, 101, 21))
        font = QtGui.QFont()
        font.setPointSize(11)
        self.label_7.setFont(font)
        self.label_7.setObjectName("label_7")
        self.lineEdit_4 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_4.setGeometry(QtCore.QRect(110, 400, 131, 21))
        self.lineEdit_4.setObjectName("lineEdit_4")
        self.lineEdit_5 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_5.setGeometry(QtCore.QRect(110, 430, 131, 21))
        self.lineEdit_5.setObjectName("lineEdit_5")
        self.lineEdit_6 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_6.setGeometry(QtCore.QRect(110, 460, 131, 21))
        self.lineEdit_6.setObjectName("lineEdit_6")
        self.lineEdit_7 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_7.setGeometry(QtCore.QRect(110, 490, 131, 21))
        self.lineEdit_7.setObjectName("lineEdit_7")
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(60, 530, 101, 31))
        font = QtGui.QFont()
        font.setPointSize(11)
        self.pushButton_2.setFont(font)
        self.pushButton_2.setObjectName("pushButton_2")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 561, 21))
        self.menubar.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.DefaultContextMenu)
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Картотека"))
        self.pushButton.setText(_translate("MainWindow", "Cтворити нову картку"))
        self.label_4.setText(_translate("MainWindow", "Назва вулиці"))
        self.label_5.setText(_translate("MainWindow", "Будинок"))
        self.label_6.setText(_translate("MainWindow", "Паціент"))
        self.label_7.setText(_translate("MainWindow", "Керивник"))
        self.pushButton_2.setText(_translate("MainWindow", "Пошук"))
        self.menubar.setAccessibleName(_translate("MainWindow", "fff")) 
#---------------------------------------------------------------------------
from PyQt6 import QtCore, QtGui, QtWidgets


class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(537, 619)
        font = QtGui.QFont()
        font.setPointSize(8)
        Dialog.setFont(font)
        self.label = QtWidgets.QLabel(Dialog)
        self.label.setGeometry(QtCore.QRect(10, 10, 31, 31))
        font = QtGui.QFont()
        font.setPointSize(15)
        self.label.setFont(font)
        self.label.setObjectName("label")
        self.label_2 = QtWidgets.QLabel(Dialog)
        self.label_2.setGeometry(QtCore.QRect(50, 230, 211, 31))
        font = QtGui.QFont()
        font.setPointSize(13)
        self.label_2.setFont(font)
        self.label_2.setStyleSheet("background-color: rgb(234, 255, 205);")
        self.label_2.setObjectName("label_2")
        self.textEdit_2 = QtWidgets.QTextEdit(Dialog)
        self.textEdit_2.setGeometry(QtCore.QRect(50, 270, 441, 161))
        self.textEdit_2.setObjectName("textEdit_2")
        self.comboBox = QtWidgets.QComboBox(Dialog)
        self.comboBox.setGeometry(QtCore.QRect(80, 20, 69, 22))
        self.comboBox.setObjectName("comboBox")
        self.lineEdit = QtWidgets.QLineEdit(Dialog)
        self.lineEdit.setGeometry(QtCore.QRect(150, 20, 221, 21))
        self.lineEdit.setObjectName("lineEdit")
        self.label_3 = QtWidgets.QLabel(Dialog)
        self.label_3.setGeometry(QtCore.QRect(390, 20, 81, 21))
        font = QtGui.QFont()
        font.setPointSize(11)
        self.label_3.setFont(font)
        self.label_3.setObjectName("label_3")
        self.lineEdit_2 = QtWidgets.QLineEdit(Dialog)
        self.lineEdit_2.setGeometry(QtCore.QRect(470, 20, 31, 21))
        self.lineEdit_2.setObjectName("lineEdit_2")
        self.label_4 = QtWidgets.QLabel(Dialog)
        self.label_4.setGeometry(QtCore.QRect(30, 70, 121, 21))
        font = QtGui.QFont()
        font.setPointSize(11)
        self.label_4.setFont(font)
        self.label_4.setObjectName("label_4")
        self.lineEdit_3 = QtWidgets.QLineEdit(Dialog)
        self.lineEdit_3.setGeometry(QtCore.QRect(150, 70, 371, 21))
        self.lineEdit_3.setObjectName("lineEdit_3")
        self.label_5 = QtWidgets.QLabel(Dialog)
        self.label_5.setGeometry(QtCore.QRect(150, 100, 71, 31))
        font = QtGui.QFont()
        font.setPointSize(11)
        self.label_5.setFont(font)
        self.label_5.setObjectName("label_5")
        self.textEdit_3 = QtWidgets.QTextEdit(Dialog)
        self.textEdit_3.setGeometry(QtCore.QRect(220, 110, 301, 41))
        self.textEdit_3.setObjectName("textEdit_3")
        self.label_6 = QtWidgets.QLabel(Dialog)
        self.label_6.setGeometry(QtCore.QRect(130, 160, 41, 20))
        font = QtGui.QFont()
        font.setPointSize(11)
        self.label_6.setFont(font)
        self.label_6.setObjectName("label_6")
        self.lineEdit_4 = QtWidgets.QLineEdit(Dialog)
        self.lineEdit_4.setGeometry(QtCore.QRect(180, 160, 131, 21))
        self.lineEdit_4.setObjectName("lineEdit_4")
        self.lineEdit_5 = QtWidgets.QLineEdit(Dialog)
        self.lineEdit_5.setGeometry(QtCore.QRect(180, 190, 131, 21))
        self.lineEdit_5.setObjectName("lineEdit_5")
        self.label_7 = QtWidgets.QLabel(Dialog)
        self.label_7.setGeometry(QtCore.QRect(330, 160, 41, 20))
        font = QtGui.QFont()
        font.setPointSize(11)
        self.label_7.setFont(font)
        self.label_7.setObjectName("label_7")
        self.label_8 = QtWidgets.QLabel(Dialog)
        self.label_8.setGeometry(QtCore.QRect(330, 190, 41, 20))
        font = QtGui.QFont()
        font.setPointSize(11)
        self.label_8.setFont(font)
        self.label_8.setObjectName("label_8")
        self.lineEdit_6 = QtWidgets.QLineEdit(Dialog)
        self.lineEdit_6.setGeometry(QtCore.QRect(370, 160, 131, 21))
        self.lineEdit_6.setObjectName("lineEdit_6")
        self.lineEdit_7 = QtWidgets.QLineEdit(Dialog)
        self.lineEdit_7.setGeometry(QtCore.QRect(370, 190, 131, 21))
        self.lineEdit_7.setObjectName("lineEdit_7")
        self.pushButton = QtWidgets.QPushButton(Dialog)
        self.pushButton.setGeometry(QtCore.QRect(400, 560, 101, 31))
        font = QtGui.QFont()
        font.setPointSize(11)
        self.pushButton.setFont(font)
        self.pushButton.setObjectName("pushButton")

        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
        self.label.setText(_translate("Dialog", "№"))
        self.label_2.setText(_translate("Dialog", "Загальна характеристика"))
        self.label_3.setText(_translate("Dialog", "Будинок №"))
        self.label_4.setText(_translate("Dialog", "Принадлежність"))
        self.label_5.setText(_translate("Dialog", "Керівник"))
        self.label_6.setText(_translate("Dialog", "моб."))
        self.label_7.setText(_translate("Dialog", "Р.Т."))
        self.label_8.setText(_translate("Dialog", "Д.М."))
        self.pushButton.setText(_translate("Dialog", "Зберегти"))

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

Автор решения: Aleee

Допустим, в таблице БД "Patients" (а значит и в соответствующей модели QSqlTableModel) первый столбец является идентификатором карты пациента. На случай если мы пожелаем скрыть этот столбец, выполним код:

ui.tableView.hideColumn(0)

Привяжем к сигналу doubleClicked функцию-обработчик:

ui.tableView.doubleClicked.connect(load_patientcard)

Имея индекс ячейки, по которой был сделан двойной клик, получаем из первого столбца этой строки идентификатор карты. Далее возможны варианты. Например, мы можем передать этот идентификатор в функцию, вызывающую диалоговое окно, как аргумент, а уже в ней сделать произвольный запрос к нужным таблицам БД.

def load_patientcard(index: QtCore.QModelIndex):
    patientcard_id = index.siblingAtColumn(0).data(QtCore.Qt.ItemDataRole.DisplayRole)
    otherWindow(patientcard_id)

def otherWindow(patientcard_id):
    query = QtSql.QSqlQuery(f"SELECT * FROM Diagnoses WHERE patient_id = {patientcard_id}")
    if query.exec():
        ...
→ Ссылка