- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我是 python 的新手,正在使用 WinPython-32bit-2.7.10.3
(包括 QTDesigner 4.8.7
)。我正在尝试使用 QtableViews 编写一个接口(interface),以便在两个独立的项目上使用 sqlite 数据库。
算法大致是这样的:
- 连接到数据库并将数据转换为 pandas.DataFrame
- 将 DataFrame 转换为 QAbstractTableModel
- 将 QAbstractTableModel 应用于 tableview.model
- 加载对话框
我没有得到相同的结果,这取决于用于创建数据框的 sql:给定一个 SQL 表“参数”,其中包含 3 个字段(LIBELLE 作为 varchar,VALEUR 作为 varchar,TEST 作为 bool 值),尝试的 sql 是:
根据第一个请求,我可以在 tableview 中编辑数据。对于第二个请求,我可以选择一个“单元格”,对其进行编辑,但是当我提交版本(按回车键)时,数据将设置回它的第一个值。
在搜索时,我发现无论“任何”值是什么,这行 setData 代码都不起作用:
self._data.values[index.row()][index.column()] = "anything"
可以通过删除主代码中第27行开头的#字符来测试sql源的发生率。
我已将代码截断到最低限度(非常接近我第一个项目的原始工作代码),我感到非常困惑。如果有人有想法,那就太好了!
谢谢
PS : 我后来把代码贴出来了,但是我还没有找到加入sqlite.db
的方法...如果有人能指导我,我会很乐意添加它;与此同时,我在我的 google.drive 上加入了很多东西
编辑#2:
仍然不明白那里出了什么问题,但我刚刚发现一旦加载数据,我就无法将数据提交给模型。我很确定这是我问题的核心,随后更新了问题和标题。
主要代码:
#*coding: utf8 *
from PyQt4 import QtCore, QtGui
import os,sys
from parametrage import Ui_WinParam
from PANDAS_TO_PYQT import PandasModel
import pandas as pd
import sqlite3
class window_parametreur(QtGui.QDialog, Ui_WinParam):
def __init__(self, dataframemodel, parent=None):
QtGui.QDialog.__init__(self, parent)
# Set up the user interface from Designer.
self.ui = Ui_WinParam()
self.ui.setupUi(self)
self.setModal(True)
self.ui.tableView.setModel(dataframemodel)
self.ui.tableView.resizeColumnsToContents()
def OpenParametreur(self, db_path):
#connecting to database and getting datas as pandas.dataframe
con = sqlite3.connect(db_path)
strSQL = u'SELECT LIBELLE AS "Paramètre", VALEUR AS "Valeur" FROM parametres'.encode("utf-8")
#strSQL = u'SELECT * FROM parametres'.encode("utf-8")
data = pd.read_sql_query(strSQL, con)
con.close()
#converting to QtCore.QAbstractTableModel
model = PandasModel(data)
#loading dialog
self.f=window_parametreur(model)
self.f.exec_()
if __name__=="__main__":
a=QtGui.QApplication(sys.argv)
f=QtGui.QMainWindow()
print OpenParametreur(f, ".\SQLiteDataBase.db")
“PANDAS_TO_PYQT.py”的代码,被调用以将 pandas.dataframe 转换为 QtCore.QAbstractTableModel
#*coding: utf8 *
from PyQt4 import QtCore, QtGui
class PandasModel(QtCore.QAbstractTableModel):
def __init__(self, data, parent=None):
QtCore.QAbstractTableModel.__init__(self, parent)
self._data = data
def rowCount(self, parent=None):
return len(self._data.values)
def columnCount(self, parent=None):
return self._data.columns.size
def data(self, index, role=QtCore.Qt.DisplayRole):
if index.isValid():
if role == QtCore.Qt.DisplayRole or role == QtCore.Qt.EditRole:
return QtCore.QVariant(unicode(
self._data.values[index.row()][index.column()]))
return QtCore.QVariant()
def headerData(self, section, orientation, role=QtCore.Qt.DisplayRole):
if role != QtCore.Qt.DisplayRole:
return None
if orientation == QtCore.Qt.Horizontal:
try:
return '%s' % unicode(self._data.columns.tolist()[section], encoding="utf-8")
except (IndexError, ):
return QtCore.QVariant()
elif orientation == QtCore.Qt.Vertical:
try:
return '%s' % self._data.index.tolist()[section]
except (IndexError, ):
return QtCore.QVariant()
def flags(self, index):
return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEditable
def setData(self, index, value, role=QtCore.Qt.EditRole):
if index.isValid():
print "data set with keyboard : " + value.toByteArray().data().decode("latin1")
self._data.values[index.row()][index.column()] = "anything"
print "data committed : " +self._data.values[index.row()][index.column()]
self.dataChanged.emit(index, index)
return True
return QtCore.QVariant()
parametrage.py 代码,由 QtDesigner 创建,包含对话框源代码:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'parametrage.ui'
#
# Created by: PyQt4 UI code generator 4.11.4
#
# WARNING! All changes made in this file will be lost!
from PyQt4 import QtCore, QtGui
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)
class Ui_WinParam(object):
def setupUi(self, WinParam):
WinParam.setObjectName(_fromUtf8("WinParam"))
WinParam.resize(608, 279)
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap(_fromUtf8("../../pictures/EAUX.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
WinParam.setWindowIcon(icon)
self.gridLayout = QtGui.QGridLayout(WinParam)
self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
self.ButtonBox = QtGui.QDialogButtonBox(WinParam)
self.ButtonBox.setOrientation(QtCore.Qt.Horizontal)
self.ButtonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
self.ButtonBox.setCenterButtons(True)
self.ButtonBox.setObjectName(_fromUtf8("ButtonBox"))
self.gridLayout.addWidget(self.ButtonBox, 1, 0, 1, 1)
self.tableView = QtGui.QTableView(WinParam)
self.tableView.setEditTriggers(QtGui.QAbstractItemView.DoubleClicked)
self.tableView.setSortingEnabled(False)
self.tableView.setObjectName(_fromUtf8("tableView"))
self.gridLayout.addWidget(self.tableView, 0, 0, 1, 1)
self.retranslateUi(WinParam)
QtCore.QObject.connect(self.ButtonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), WinParam.accept)
QtCore.QObject.connect(self.ButtonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), WinParam.reject)
QtCore.QMetaObject.connectSlotsByName(WinParam)
def retranslateUi(self, WinParam):
WinParam.setWindowTitle(_translate("WinParam", "Paramétrage", None))
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
WinParam = QtGui.QDialog()
ui = Ui_WinParam()
ui.setupUi(WinParam)
WinParam.show()
sys.exit(app.exec_())
最佳答案
我终于想通了...但我仍然不知道为什么 pandas 仅通过更改 SQL 请求(一定是 read_sql_query 进程中的某些东西...)就不同地工作
为了让类(class)正常运行,我不得不更改“PANDAS_TO_PYQT.py”的代码,替换
self._data.values[index.row()][index.column()]
由
self._data.iloc[index.row(),index.column()]
在 setData 和数据函数中。
不知何故,pandas 似乎在此过程中生成了数据帧的副本(对于那些寻找解释的人,请转到 the doc)。
因此,将数据框转换为 QAbstractTableModel 的正确类代码是:
#*coding: utf8 *
from PyQt4 import QtCore, QtGui
class PandasModel(QtCore.QAbstractTableModel):
def __init__(self, data, parent=None):
QtCore.QAbstractTableModel.__init__(self, parent)
self._data = data
def rowCount(self, parent=None):
return len(self._data.values)
def columnCount(self, parent=None):
return self._data.columns.size
def data(self, index, role=QtCore.Qt.DisplayRole):
if index.isValid():
if role == QtCore.Qt.DisplayRole or role == QtCore.Qt.EditRole:
return QtCore.QVariant(unicode(
self._data.iloc[index.row(),index.column()]))
return QtCore.QVariant()
def headerData(self, section, orientation, role=QtCore.Qt.DisplayRole):
if role != QtCore.Qt.DisplayRole:
return None
if orientation == QtCore.Qt.Horizontal:
try:
return '%s' % unicode(self._data.columns.tolist()[section], encoding="utf-8")
except (IndexError, ):
return QtCore.QVariant()
elif orientation == QtCore.Qt.Vertical:
try:
return '%s' % self._data.index.tolist()[section]
except (IndexError, ):
return QtCore.QVariant()
def flags(self, index):
return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEditable
def setData(self, index, value, role=QtCore.Qt.EditRole):
if index.isValid():
self._data.iloc[index.row(),index.column()] = value.toByteArray().data().decode("latin1")
if self.data(index,QtCore.Qt.DisplayRole) == value.toByteArray().data().decode("latin1"):
self.dataChanged.emit(index, index)
return True
return QtCore.QVariant()
关于python - PyQt - 使用 pandas DataFrame 在 QAbstractTableModel (QTableView) 中加载 SQL - 在 GUI 中编辑数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39914926/
我正在使用 Qtableview与 QsqlTableModel用于填充表数据。我想根据用户对列标题的选择对列进行排序。 我尝试了QTableView sorting signal?中提到的方法用于获
我试图在 python 中找到一个示例,在其中我可以循环 QTableView 的模型元素并打印整行。我已经找到了如何循环选定的行,但在未选择行时什么也没有。 有人可以帮助我吗?无需告诉我如何创建模型
我正在尝试将 QTableView 中的水平和垂直标题设置为自动换行,但没有任何成功。 我想将所有列设置为相同的宽度(包括垂直标题),以及那些多行文本要自动换行的列。如果单词比列宽,它应该向右省略。
我使用 QTableView 和 QAbstractTableModel 的子类作为它的模型。 我看到(默认情况下)当用户输入内容时,QTableView 开始搜索第一列中输入的文本并将 View 滚
实际上我是 Qt 新手,无法匹配 QMouseEvent与 QTableview 请帮助解决这个问题。 最佳答案 以下是单击表格单元格文本时如何获取表格单元格文本的示例。 假设一个 QTableVie
我有一个 QTableView我需要从中获取 selectionChanged 事件。我似乎无法连接工作。我有: MyWidget.h ... protected slots: void slotL
当用户在 QTableView 中选择一行时是否会发出信号?通过鼠标(单选模型)? 最佳答案 每个 View 都有一个选择模型: QItemSelectionModel * QAbstractItem
我正在使用 QTableView与 QAbstractTableModel和 QSortFilterProxyModel这样我就可以通过单击表格标题对项目进行排序。我想为用户添加选项,通过拖动它们来手
是否可以对 QTableView 的标题进行排序? 我想对水平和垂直标题进行排序。 QTableView 仅提供对列内容进行排序的功能。有没有办法对 View 进行排序,或者我是否必须对底层数据结构进
我对 QT 还很陌生,无法理解 QTableView选择改变信号被处理。我已经设置了一个带有 openGL 小部件和 QTableView 的窗口.我有一个正确填充表格 View 的数据模型类,因此我
我是 qt 的新手,我在 QTtableview 中使用 QStandardItemModel。 请建议, 如何更改行和列标题名称。目前它显示 1,2,3,4 如何让 QStandardItemMod
使用 QTableView和 QAbstractTableModel - 当模型发出 dataChanged对于正在编辑的单元格的事件,用户在单元格中键入的字符串(但未按 Enter 以“提交”编辑)
我有一个带有数据的 QTableView。添加行的最简单方法是什么? 谢谢! 最佳答案 当您使用 som YourModel 在 YourTableView (QTableView) 中显示它时,应该
我正在尝试创建一个可以像在 Excel 中一样放大和缩小的 QTableView。 此处提出了类似的问题:Zooming function on a QWidget 但是,我在 PyQt 而不是 C
我正在尝试在 QTableView 中实现类似于 Excel 的行为,其中在整个当前选择周围绘制了一个边框。我已经尝试过这种感觉就像一百种不同的方法并且不断遇到问题。我可以很容易地绘制边框,但是只要选
我正在写一个简单的 TableView根据 http://harmattan-dev.nokia.com/docs/library/html/qt4/itemviews-addressbook.htm
我有一个基于 QStandardItemModel 的 QTableView。我想将第一列设置为“只读”,将所有其他列设置为可编辑。 我不是 QT 和 OOP 的专家,我在网上和 QT 文档中进行了搜
我有两个相同的 QTableView,其中一个是可排序的。这两个表的最后四列的调整模式设置为 QHeaderView::ResizeToContents。 不可排序的表格列宽看起来是正确的,列标题的左
我在 Sqlite 数据库中有一个表,我使用 QTableview 和 QSqlQueryModel 显示它。第一列需要有一个标题,它是一个复选框,列中的所有项目也需要是复选框。我已将第一列标题实现为
我想在 QTableView 中实现用户可编辑复选框这是使用 QAbstractModel 创建的。我可以分配选中和未选中的复选框,但无法使其可编辑。 标志设置为 QItemIsUserCheckab
我是一名优秀的程序员,十分优秀!