gpt4 book ai didi

python - 从列表条目访问 SQL 数据

转载 作者:行者123 更新时间:2023-12-01 06:24:26 24 4
gpt4 key购买 nike

首先,我将描述并展示我的小程序如何直观地工作,以便我的问题很容易理解

程序描述

以下是我在该程序中使用的 2 个寡妇:

主窗口

输入窗口

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

在输入窗口输入信息

更新主窗口

我的Sqlite表

我的问题

我希望能够在“宏”列表中选择一个条目,按“编辑”按钮,然后显示填充有数据库数据的输入窗口。但是,因为 QListWidget 只允许字符串输入,所以我无法使用它的 PK('id')进行搜索。

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

请告诉我这是否是正确的步骤。如果没有,请描述您将使用什么来实现仅显示标题但允许查询其数据的列表。我是 PyQt/PySide 的初学者,我非常感谢任何指导。

代码

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

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()

最佳答案

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

from PyQt5 import QtCore, QtGui, QtWidgets, QtSql


def create_connection(database):
db = QtSql.QSqlDatabase.addDatabase("QSQLITE")
db.setDatabaseName(database)
if not db.open():
print("Cannot open database")
print(
"Unable to establish a database connection.\n"
"This example needs SQLite support. Please read "
"the Qt SQL driver documentation for information "
"how to build it.\n\n"
"Click Cancel to exit."
)
return False

query = QtSql.QSqlQuery()
if not query.exec_(
"""CREATE TABLE IF NOT EXISTS Macros (
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
"title" TEXT,
"description" TEXT)"""
):
print(query.lastError().text())
return False
return True


class AddMacroDialog(QtWidgets.QDialog):
def __init__(self, parent=None):
super().__init__(parent)

self.title_le = QtWidgets.QLineEdit()
self.description_te = QtWidgets.QPlainTextEdit()

button_box = QtWidgets.QDialogButtonBox(self)
button_box.setOrientation(QtCore.Qt.Horizontal)
button_box.setStandardButtons(
QtWidgets.QDialogButtonBox.Cancel | QtWidgets.QDialogButtonBox.Ok
)

button_box.accepted.connect(self.accept)
button_box.rejected.connect(self.reject)

lay = QtWidgets.QVBoxLayout(self)
lay.addWidget(self.title_le)
lay.addWidget(self.description_te)
lay.addWidget(button_box)

@property
def title(self):
return self.title_le.text()

@property
def description(self):
return self.description_te.toPlainText()


class EditMacroDialog(QtWidgets.QDialog):
def __init__(self, model, index, parent=None):
super().__init__(parent)

self.title_le = QtWidgets.QLineEdit()
self.description_te = QtWidgets.QPlainTextEdit()

mapper = QtWidgets.QDataWidgetMapper(
self, submitPolicy=QtWidgets.QDataWidgetMapper.ManualSubmit
)
mapper.setModel(model)
mapper.addMapping(self.title_le, model.record().indexOf("title"))
mapper.addMapping(self.description_te, model.record().indexOf("description"))
mapper.setCurrentIndex(index)

button_box = QtWidgets.QDialogButtonBox(self)
button_box.setOrientation(QtCore.Qt.Horizontal)
button_box.setStandardButtons(
QtWidgets.QDialogButtonBox.Cancel | QtWidgets.QDialogButtonBox.Ok
)

button_box.accepted.connect(self.accept)
button_box.rejected.connect(self.reject)
button_box.accepted.connect(mapper.submit)

lay = QtWidgets.QVBoxLayout(self)
lay.addWidget(self.title_le)
lay.addWidget(self.description_te)
lay.addWidget(button_box)


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

self._model = QtSql.QSqlTableModel(self)
self.model.setTable("Macros")
self.model.select()

self.sql_list_view = QtWidgets.QListView()
self.sql_list_view.setModel(self.model)
self.sql_list_view.setModelColumn(self.model.record().indexOf("title"))

self.new_button = QtWidgets.QPushButton(self.tr("New"))
self.edit_button = QtWidgets.QPushButton(self.tr("Edit"))
self.remove_button = QtWidgets.QPushButton(self.tr("Remove"))

central_widget = QtWidgets.QWidget()
self.setCentralWidget(central_widget)

grid_layout = QtWidgets.QGridLayout(central_widget)
grid_layout.addWidget(
QtWidgets.QLabel(self.tr("Macros"), alignment=QtCore.Qt.AlignCenter)
)
grid_layout.addWidget(self.sql_list_view, 1, 0)

vlay = QtWidgets.QVBoxLayout()
vlay.addWidget(self.new_button)
vlay.addWidget(self.edit_button)
vlay.addWidget(self.remove_button)
grid_layout.addLayout(vlay, 1, 1)
self.resize(640, 480)

self.new_button.clicked.connect(self.new)
self.edit_button.clicked.connect(self.edit)
self.remove_button.clicked.connect(self.remove)

self.sql_list_view.selectionModel().selectionChanged.connect(
self.onSelectionChanged
)
self.onSelectionChanged()

@property
def model(self):
return self._model

@QtCore.pyqtSlot()
def new(self):
d = AddMacroDialog()
if d.exec_() == QtWidgets.QDialog.Accepted:
r = self.model.record()
r.setValue("title", d.title)
r.setValue("description", d.description)
if self.model.insertRecord(self.model.rowCount(), r):
self.model.select()

@QtCore.pyqtSlot()
def edit(self):
ixs = self.sql_list_view.selectionModel().selectedIndexes()
if ixs:
d = EditMacroDialog(self.model, ixs[0].row())
d.exec_()

@QtCore.pyqtSlot()
def remove(self):
ixs = self.sql_list_view.selectionModel().selectedIndexes()
if ixs:
self.model.removeRow(ixs[0].row())
self.model.select()

@QtCore.pyqtSlot()
def onSelectionChanged(self):
state = bool(self.sql_list_view.selectionModel().selectedIndexes())
self.edit_button.setEnabled(state)
self.remove_button.setEnabled(state)


if __name__ == "__main__":
import sys

database = "entry name" # ":memory:"
app = QtWidgets.QApplication(sys.argv)
if not create_connection(database):
sys.exit(app.exec_())
w = MainWindow()
w.show()
sys.exit(app.exec_())

关于python - 从列表条目访问 SQL 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60234977/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com