Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何将所选行数据从QSqlTableModel tableview复制到所需的Qlineedit输入小部件中?_Python 3.x_Pyqt5_Qtableview_Qsqltablemodel - Fatal编程技术网

Python 3.x 如何将所选行数据从QSqlTableModel tableview复制到所需的Qlineedit输入小部件中?

Python 3.x 如何将所选行数据从QSqlTableModel tableview复制到所需的Qlineedit输入小部件中?,python-3.x,pyqt5,qtableview,qsqltablemodel,Python 3.x,Pyqt5,Qtableview,Qsqltablemodel,示例图像: 下面是我的示例代码: from PyQt5 import QtCore, QtGui, QtWidgets, QtSql from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtSql import * from PyQt5 import uic import sys import sqlite3 class UI(QMainWindow):

示例图像:

下面是我的示例代码:

from PyQt5 import QtCore, QtGui, QtWidgets, QtSql
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtSql import *
from PyQt5 import uic
import sys
import sqlite3


class UI(QMainWindow):
    def __init__(self):
        super(UI, self).__init__()
        uic.loadUi("tableview.ui", self)
        self.show()

        db = QSqlDatabase.addDatabase('QSQLITE')
        db.setDatabaseName('book.db')
        db.open()

        self.model = QtSql.QSqlTableModel(self)
        self.model.setTable("card")
        self.model.select()
        self.tableView.setModel(self.model)

        #self.view_msa()

        self.pushButton.clicked.connect(self.edit_items)

    def edit_view(self):

        self.editWindow = QtWidgets.QWidget()
        self.editWindow.resize(300, 300)
        self.editWindow.setWindowTitle("Edit Window")
        self.editWindow.setWindowModality(Qt.ApplicationModal)
        
        self.update = QtWidgets.QPushButton(self.editWindow)
        self.update.setGeometry(QtCore.QRect(60, 150, 75, 23))
        self.update.setObjectName("update")
        self.widget = QtWidgets.QWidget(self.editWindow)
        self.widget.setGeometry(QtCore.QRect(60, 60, 201, 74))
        self.widget.setObjectName("widget")
        self.formLayout = QtWidgets.QFormLayout(self.widget)
        self.formLayout.setContentsMargins(0, 0, 0, 0)
        self.formLayout.setObjectName("formLayout")
        self.label = QtWidgets.QLabel(self.widget)
        self.label.setObjectName("label")
        self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label)
        self.name_line = QtWidgets.QLineEdit(self.widget)
        self.name_line.setObjectName("name_line")
        self.formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.name_line)
        self.label_2 = QtWidgets.QLabel(self.widget)
        self.label_2.setObjectName("label_2")
        self.formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.label_2)
        self.age_line = QtWidgets.QLineEdit(self.widget)
        self.age_line.setObjectName("age_line")
        self.formLayout.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.age_line)
        self.label_3 = QtWidgets.QLabel(self.widget)
        self.label_3.setObjectName("label_3")
        self.formLayout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.label_3)
        self.address_line = QtWidgets.QLineEdit(self.widget)
        self.address_line.setObjectName("address_line")
        self.formLayout.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.address_line)

        self.update.setText("Update")
        self.label.setText("Name")
        self.label_2.setText("Age")
        self.label_3.setText("Address")

        self.name_line.setReadOnly(True)
        
        self.editWindow.show()

    def edit_items(self):
        index = (self.tableView.selectionModel().currentIndex())
        id_us = (self.tableView.model().data(index))
        print(str(id_us))
        self.edit_view()
        
app = QApplication(sys.argv)
window = UI()
app.exec_()
我使用的是:self.model=QtSql.QSqlTableModel、Qtableview、3个Lineedit输入小部件和2个qpushbutton。我的SQLite3数据库有3列,分别是“姓名、年龄(int值)和性别” 我的问题是:
如果我从tableview中选择一行,将3个项目作为名称、年龄和地址复制到各自的lineedit输入小部件中,怎么可能做到这一点呢。名称Editline是只读的,如果再次按下更新按钮,则应使用名称lineedit(名称lineedit是只读的)来更新QSqlTableModel。

您需要访问感兴趣的每一列的单独索引。这可以通过调用或通过简单的
model.index(行、列)
来完成,只要您知道当前行

然后,您可以使用QDialog,这比设置了窗口模态的QWidget要好,因为您可以使用它的方法“阻止”函数,直到对话框关闭

在下面的示例中,我将更新按钮连接到插槽,以便仅在单击按钮时更新数据,否则,如果取消对话框(通过按Esc键或关闭对话框),则不会应用任何更改

如您所见,我没有设置任何实例属性(就像您在
self.editWindow
等中所做的那样),因为它们的引用仅在函数范围内重要,而且由于每次都要重新创建对话框,因此将它们设置为属性没有任何用处

class UI(QMainWindow):
    def __init__(self):
        # ...
        self.pushButton.clicked.connect(self.edit_items)

    def edit_items(self):
        if not self.model.rowCount():
            return
        index = self.tableView.currentIndex()
        if index.isValid():
            row = index.row()
        else:
            row = 0

        dialog = QtWidgets.QDialog()
        dialog.setWindowTitle("Edit Window")
        layout = QtWidgets.QVBoxLayout(dialog)

        formLayout = QtWidgets.QFormLayout()
        layout.addLayout(formLayout)

        name_line = QtWidgets.QLineEdit(self.model.index(row, 0).data())
        formLayout.addRow('Name', name_line)
        name_line.setReadOnly(True)

        age_edit = QtWidgets.QSpinBox()
        formLayout.addRow('Age', age_edit)
        age_edit.setFocus()
        age_edit.setValue(self.model.index(row, 1).data())

        genders = 'M', 'F'
        gender_combo = QtWidgets.QComboBox()
        formLayout.addRow('Gender', gender_combo)
        gender_combo.addItems(genders)
        gender = self.model.index(row, 2).data()
        if gender and gender.upper() in genders:
            gender_combo.setCurrentIndex(genders.index(gender.upper()))
        else:
            gender_combo.setCurrentIndex(-1)

        updateButton = QtWidgets.QPushButton('Update')
        layout.addWidget(updateButton)
        updateButton.clicked.connect(dialog.accept)

        if not dialog.exec_():
            return

        self.model.setData(self.model.index(row, 1), age_edit.value(), 
            QtCore.Qt.EditRole)
        if gender_combo.currentIndex() >= 0:
            self.model.setData(self.model.index(row, 2), 
                gender_combo.currentText(), QtCore.Qt.EditRole)
        # submit all changes to the database
        self.model.submitAll()

注意:避免覆盖现有的类属性,就像您在
self.update

中所做的那样。您希望更新地址,但表中没有这样的列。你能澄清一下吗?@musicamante.对不起,这是我的错。这就是性别。我改变了我的法师。