Python 从列表项访问SQL数据

Python 从列表项访问SQL数据,python,qt,pyqt,pyqt5,Python,Qt,Pyqt,Pyqt5,首先,我将描述并展示我的迷你程序是如何可视化工作的,这样我的问题就容易理解了 程序描述 以下是我在该计划中使用的两个寡妇: 主窗口 输入窗口 主窗口显示在程序的开头。我在“宏”列表中使用了QListWidget,它显示从Sqlite数据库(DB)读取的每个条目的标题。按下主窗口中的“新建”按钮时,将显示一个新的输入窗口。输入窗口中的“保存”按钮将标题和说明输入保存到数据库,并更新主窗口中的“宏”列表。这将看起来像这样: 在输入窗口中输入信息 更新的主窗口 我的Sqlite表 我的问题

首先,我将描述并展示我的迷你程序是如何可视化工作的,这样我的问题就容易理解了

程序描述 以下是我在该计划中使用的两个寡妇:

主窗口

输入窗口

主窗口显示在程序的开头。我在“宏”列表中使用了QListWidget,它显示从Sqlite数据库(DB)读取的每个条目的标题。按下主窗口中的“新建”按钮时,将显示一个新的输入窗口。输入窗口中的“保存”按钮将标题和说明输入保存到数据库,并更新主窗口中的“宏”列表。这将看起来像这样:

在输入窗口中输入信息

更新的主窗口

我的Sqlite表

我的问题 我希望能够在“宏”列表中选择一个条目,按下“编辑”按钮,并显示输入窗口,其中充满了数据库中的数据。然而,因为QListWidget只允许字符串输入,所以我不能使用它的PK('id')进行搜索

我正在考虑使用QTableWidget而不是QListWidget。我将加载整个表,但隐藏除标题列以外的所有列,以便只有标题将显示在主窗口的“宏”列表中。对于查询,我将通过访问所选条目的第0个索引来使用条目的PK

请让我知道这是否是正确的步骤。如果没有,请描述您将如何实现一个只显示标题但允许查询其数据的列表。我是PyQt/PySide的初学者,非常感谢您的指导

代码 下面是按下“保存”按钮时执行的代码(及其辅助功能)


不要重新发明轮子,Qt提供了与数据库交互的类,例如,要处理表的信息,可以使用QSqlQueryModel、QSqlTableModel等。要添加行,必须创建QSqlRecord并将其添加到模型中,对于版本,可以使用QDataWidgetMapper映射和编辑行的信息,若要删除,必须删除该行并重新加载整个表。要指示QListView中应显示的字段,请使用setModelColumn()方法,该方法应为“title”字段的列

从PyQt5导入QtCore、QtGui、qtwidget、QtSql
def创建_连接(数据库):
db=QtSql.QSqlDatabase.addDatabase(“QSQLITE”)
db.setDatabaseName(数据库)
如果不是db.open():
打印(“无法打开数据库”)
印刷品(
“无法建立数据库连接。\n”
“此示例需要SQLite支持。请阅读”
“有关详细信息,请参阅Qt SQL驱动程序文档”
“如何构建它。\n\n”
“单击“取消”退出。”
)
返回错误
query=QtSql.QSqlQuery()
如果不是query.exec_(
“”“如果不存在宏,则创建表”(
“id”整数主键自动递增,
“标题”文本,
“说明”文本“
):
打印(query.lastError().text())
返回错误
返回真值
类AddMacroDialog(QtWidgets.QDialog):
def uuu init uuu(self,parent=None):
super()。\uuuu init\uuuu(父级)
self.title_le=QtWidgets.QLineEdit()
self.description_te=qtwidts.QPlainTextEdit()
按钮盒=QtWidgets.QDialogButtonBox(自身)
按钮盒设置方向(QtCore.Qt.水平)
按钮盒。设置标准按钮(
qtwidts.QDialogButtonBox.Cancel | qtwidts.QDialogButtonBox.Ok
)
按钮盒。已接受。连接(self.accept)
按钮盒。拒绝。连接(自拒绝)
lay=qtwidts.QVBoxLayout(self)
lay.addWidget(self.title_le)
lay.addWidget(自我描述)
lay.addWidget(按钮盒)
@财产
def标题(自我):
返回self.title_le.text()
@财产
def说明(自我):
返回self.description\u te.toPlainText()
类EditMacroDialog(QtWidgets.QDialog):
def uuu init uuuu(self、model、index、parent=None):
super()。\uuuu init\uuuu(父级)
self.title_le=QtWidgets.QLineEdit()
self.description_te=qtwidts.QPlainTextEdit()
mapper=qtwidts.QDataWidgetMapper(
self,submitPolicy=qtwidts.QDataWidgetMapper.ManualSubmit
)
mapper.setModel(模型)
mapper.addMapping(self.title_le,model.record().indexOf(“title”))
mapper.addMapping(self.description\u te,model.record().indexOf(“description”))
mapper.setCurrentIndex(索引)
按钮盒=QtWidgets.QDialogButtonBox(自身)
按钮盒设置方向(QtCore.Qt.水平)
按钮盒。设置标准按钮(
qtwidts.QDialogButtonBox.Cancel | qtwidts.QDialogButtonBox.Ok
)
按钮盒。已接受。连接(self.accept)
按钮盒。拒绝。连接(自拒绝)
按钮盒。接受。连接(映射器。提交)
lay=qtwidts.QVBoxLayout(self)
lay.addWidget(self.title_le)
lay.addWidget(自我描述)
lay.addWidget(按钮盒)
类MainWindow(QtWidgets.QMainWindow):
def uuu init uuu(self,parent=None):
super()。\uuuu init\uuuu(父级)
self.\u model=QtSql.QSqlTableModel(self)
self.model.setable(“宏”)
self.model.select()
self.sql\u list\u view=qtwidts.QListView()
self.sql\u list\u view.setModel(self.model)
self.sql\u list\u view.setModelColumn(self.model.record().indexOf(“title”))
self.new_button=qtwidts.QPushButton(self.tr(“new”))
self.edit_button=qtwidts.QPushButton(self.tr(“编辑”))
self.remove_button=qtwidts.QPushButton(self.tr(“remove”))
central_widget=qtwidts.QWidget()
self.setCentralWidget(中心窗口小部件)
grid_layout=qtwidts.QGridLayout(中心_小部件)
grid_layout.addWidget(
qtwidts.QLabel(self.tr(“宏”),alignment=QtCore.Qt.AlignCenter)
)
grid\u layout.addWidget(self.sql\u list\u视图,1,0)
弗拉伊=
def save_macro(self):

    title = self.lineedit.text()
    description = self.textedit.toPlainText()

    add_sql_query = ''' INSERT INTO Macros (title,description)
                  VALUES(?,?) '''

    # Helper func that creates connection to db
    sqlhelper = SqliteHelper("entry name")

    if sqlhelper is not None:  # If db is connected:
        macro_data = (title, description)
        sqlhelper.insert(add_sql_query, macro_data)  

    self.close()


class SqliteHelper:

    def __init__(self, name=None):
        self.conn = None
        self.cursor = None

        if name:
            self._create_connection(name)

    def _create_connection(self, name):
        try:
            self.conn = sqlite3.connect(name)
            self.cursor = self.conn.cursor()
            print(sqlite3.version)
        except sqlite3.Error as e:
            print(e)

    def insert(self, query, inserts):  # Insert
        c = self.cursor
        c.execute(query, inserts)
        self.conn.commit()