从tableView模型打印单击行的数据

时间:2016-10-26 02:52:50

标签: python pyqt tableview pyqt5

有对话框:

class classsearchresult(QDialog, Ui_Dialog):
def __init__(self, parent=None):
    QDialog.__init__(self, parent)
    self.setupUi(self)
    self.tableView.setShowGrid(False)
    self.tableView.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
    vh = self.tableView.verticalHeader()
    vh.setVisible(False)
    hh = self.tableView.horizontalHeader()
    hh.setVisible(False)
    hh.setStretchLastSection(True)
    self.pushButton_2.clicked.connect(self.close)
    db = QtSql.QSqlDatabase.addDatabase('QSQLITE')
    db.setDatabaseName('formuladatabase')
    db.open()
    self.projectModel = QtSql.QSqlQueryModel(self)
    self.projectModel.setQuery("select rowid, Name, Surname from search",db)
    self.tableView.setModel(self.projectModel)
    self.tableView.clicked.connect(self.handlebutton)

tableview非常适合打印单击的行

def handlebutton(self):
    rows = self.tableView.selectionModel().selectedIndexes()
    print(self.projectModel.record(rows[0].row()).value("rowid").toInt())
    self.newwindow = classformularesult(self)
    self.newwindow.show()

已经尝试了一段时间,但却无法想出这个。

2 个答案:

答案 0 :(得分:1)

只是注意:我注意到你标记了PyQt5,但文档在那里并不那么好,而且我非常有信心所有我在这里说的仍然适用(来自PyQt4)。

似乎您假设rows将包含查询中的数据,而不是。 selectedRows(),selectedColumns,selectedIndexes()(此处记录:http://pyqt.sourceforge.net/Docs/PyQt4/qitemselectionmodel.html#selectedRows)所有返回类型list-of-QModelIndex,它们基本上都是索引而不是数据。

  

list-of-QModelIndex QItemSelectionModel.selectedRows(self,int column   = 0)

     

返回给定列中所有列的行的索引   被选中。

我认为使用selectedIndexes

更容易
  

list-of-QModelIndex QItemSelectionModel.selectedIndexes(self)

     

返回所有选定模型项索引的列表。该清单包含   没有重复,也没有排序。

要获取数据,model.record.value()返回一个QVariant,您必须将其强制转换为适合打印的类型。所以,在你的情况下:

rows = self.tableView.selectionModel().selectedIndexes()
print self.projectModel.record(rows[0].row()).value("rowid").toInt()
print self.projectModel.record(rows[0].row()).value("Name").toString()
print self.projectModel.record(rows[0].row()).value("Surname").toString()

rows [0] .row()正在访问返回的“list-of-QModelIndex”类型的元素0,而QModelIndex(http://pyqt.sourceforge.net/Docs/PyQt4/qmodelindex.html#details)有一个row()方法,它返回索引行。根据你设置它的方式,“list-of-QModelIndex”列表应该始终是一个单独的元素列表(你用“点击”信号连接它),所以row [0]应该返回正确的元素。

有关其他信息,请参阅此处: http://ftp.ics.uci.edu/pub/centos0/ics-custom-build/BUILD/PyQt-x11-gpl-4.7.2/doc/html/qtsql.html 大约一半的时间里有一个“使用SQL模型类”标题和一些很好的例子。

答案 1 :(得分:0)

对于记录和其他情况我的答案是

def handlebutton(self):
    rows = self.tableView.selectionModel().selectedIndexes()
    print(self.projectModel.record(rows[0].row()).value("rowid"))
    self.newwindow = classformularesult(self)
    self.newwindow.show()

谢谢SEGFAULTCODER