我想实现以下非常小的项目,即用户应该输入产品名称,Python应该在数据库中搜索并在pyqt6桌面应用程序中显示查询结果,为此我已经实现了以下基本GUI形式:
这里用户输入产品,然后单击按钮,结果将显示在空白处,即:
QTextEdit()
,最有趣的部分是这个功能:
def return_product_info(self):
input_text =self.inputField.text()
df = pd.read_sql_query('''SELECT * FROM "foreign_products" where "product" = '{}'
'''.format( input_text), con=engine)
print(df.head())
self.output.setText(df)
引擎部分被隐藏(它工作正常),唯一有趣的部分是:
self.output.setText(df)
如何我可以将 df 放入 QTextEdit() 中吗?我做了一些研究,发现我可以基于此链接使用
QTableView
:
QTableView
但是我如何将所有这些连接到一个项目中?这是应用程序的主要代码
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("Database Search")
self.setWindowIcon(QIcon("db.jpg"))
self.resize(500,500)
layout =QVBoxLayout()
self.setLayout(layout)
self.inputField =QLineEdit()
self.button =QPushButton("click me")
self.button.clicked.connect(self.return_product_info)
self.output =QTextEdit()
layout.addWidget(self.inputField)
layout.addWidget(self.button)
layout.addWidget(self.output)
是对的,
QTextEdit
用于显示纯文本,而不是表格数据。要显示
pandas
DataFrame,使用
QTableView
与
QAbstractTableModel
一起是更好的选择。
以下是如何修改代码以使用
QTableView
显示数据的步骤:
-
创建一个自定义模型类,继承自
QAbstractTableModel
:
from PyQt6.QtCore import Qt
from PyQt6.QtGui import QAbstractTableModel
class PandasModel(QAbstractTableModel):
def __init__(self, data):
super().__init__()
self._data = data
def rowCount(self, parent=None):
return self._data.shape[0]
def columnCount(self, parent=None):
return self._data.shape[1]
def data(self, index, role=Qt.ItemDataRole.DisplayRole):
if role == Qt.ItemDataRole.DisplayRole:
value = self._data.iloc[index.row(), index.column()]
return str(value)
def headerData(self, section, orientation, role=Qt.ItemDataRole.DisplayRole):
if role == Qt.ItemDataRole.DisplayRole:
if orientation == Qt.Orientation.Horizontal:
return str(self._data.columns[section])
else:
return str(self._data.index[section])
-
在
MyApp
类中,将QTextEdit
替换为QTableView
并实例化模型:
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("Database Search")
self.setWindowIcon(QIcon("db.jpg"))
self.resize(500,500)
layout =QVBoxLayout()
self.setLayout(layout)
self.inputField = QLineEdit()
self.button = QPushButton("click me")
self.button.clicked.connect(self.return_product_info)
# 使用 QTableView 替代 QTextEdit
self.output = QTableView()
layout.addWidget(self.inputField)
layout.addWidget(self.button)
layout.addWidget(self.output)
def return_product_info(self):
input_text = self.inputField.text()
df = pd.read_sql_query(
"""SELECT * FROM "foreign_products" where "product" = '{}' """.format(
input_text
),
con=engine,
)
# 创建模型并将其设置为 QTableView 的模型
model = PandasModel(df)
self.output.setModel(model)
现在,当你运行代码并输入产品名称后,
QTableView
将会以表格的形式显示查询结果。