PySide QTableWidget:直接使用行而不是项目?

时间:2015-01-10 21:54:20

标签: python pyside qtablewidget

我有一个包含3列和一些行的表。我想

  • 显示每行的一个工具提示
  • 将用户定义的数据设置为每一行
  • 处理每个角色选择

要通过单击其中的单个单元格来显示完整行的选择,我将QT Designer中的 selectionBehabior 设置为 SelectRows 。工作

问题是,我只设法使用一行中的单个。要在每三个单元格上显示相同的工具提示,我需要将其设置为每个单元格。我的代码:

for entry in entries:
    #col 1
    item = QtGui.QTableWidgetItem(entry['published'])
    item.setToolTip(entry['subtitle'])
    self.tableFeedEntries.setItem(i, 0, item)
    #col 2
    item = QtGui.QTableWidgetItem(entry['author_name'])
    item.setToolTip(entry['subtitle'])
    self.tableFeedEntries.setItem(i, 1, item)
    #col 3
    item = QtGui.QTableWidgetItem(entry['title'])
    item.setToolTip(entry['subtitle'])
    self.tableFeedEntries.setItem(i, 2, item)   

    i += 1

因此臃肿 我宁愿每行使用setToolTip()和setData()一次,但我不知道怎么做。好吧,虽然这两件事情是某种有趣的,但我在处理选择事件时遇到了一个真正的问题:通过检查当前所选行是否与前一行不相等。

#connection
self.tableFeedEntries.currentItemChanged.connect(self.__show_feed_content)

#method
def __show_feed_content(self, current, previous):
    if current is not previous:
        data = current.data(QtCore.Qt.UserRole)
        content = self.__db.get_entry_content(data['id'])
        #etc.

这也会检查,而不是。因此,如果单击已选定行中的另一个单元格,则会再次运行相同的进程。

如何将数据和事件处理程序设置为一行?

1 个答案:

答案 0 :(得分:1)

您可以实施模型的data方法:

def data(self, index, role):
    if role == Qt.ToolTipRole:
        row = index.row()
        return [your tooltip]

文档在这里:

http://pyside.github.io/docs/pyside/PySide/QtCore/QAbstractItemModel.html#PySide.QtCore.PySide.QtCore.QAbstractItemModel.data