【问题标题】:How to Get Many QComboBoxes' Text from QTableWidget如何从 QTableWidget 获取许多 QComboBoxes 的文本
【发布时间】:2014-08-19 14:13:32
【问题描述】:

我已经使用 setCellWidget 将 很多 QComboBox 插入到 QTableWidget 中(我不知道 qcombobox 的数量,因为它来自 MySQL)。但是当我想用

从表格中获取它的文本时
self.table.item(0,1).itemText() 

self.table.item(0,1).text() 

self.table.item(0,1).currentText() 

它不起作用。 通常我可以使用combobox.currentText() 获取文本,但表格有很多组合框,我不知道行和列(x,y)信息。所以我应该使用类似 .item(14,1).text()

【问题讨论】:

  • 您的目标到底是什么?您是否尝试从特定的 QComboBox 中提取选定的字符串?所有字符串?所有 QComboBox 吗?如果您“通常不知道行和列”,您如何决定选择哪些元素?如果没有更多信息和/或一些代码摘录,您的问题太模糊而无法正确回答。
  • 好的。看这张图:i.imgur.com/1aiMNF6.png我想在不使用combobox.currentText()的情况下获取文本“abc”。我必须用行和列信息来调用它。
  • 拨打self.table.item(row,col).currentText()会发生什么?我不明白为什么这不起作用
  • AttributeError: 'NoneType' 对象没有属性 'currentText'

标签: python qt qt4 pyqt pyqt4


【解决方案1】:

如果您使用过setCellWidget,那么调用cellWidget(0,1) 而不是item(0,1) 将返回一个QWidget 而不是QTableWidgetItem。

您可能需要将此 QWidget 转换为 QComboBox,但随后您应该可以调用 currentText()

【讨论】:

  • 我不记得你是否需要投射。首先尝试调用 self.table.cellWidget(0,1).currentText()。
  • 天哪,它工作得很好。我怎么错过了?
  • @FlamFace self.table.cellWidget(0,1).currentText()
  • 我找到了解决问题的方法-------->>> QComboBox* combo=(QComboBox*) webFilterCat -> cellWidget(i, 2); qDebug() currentText();对于qt c++
【解决方案2】:

如果你想使用;

self.table.item(0,1).itemText() 

self.table.item(0,1).currentText() 

self.table.item(0,1).text() 

我不能直接使用项目小部件。我建议你使用项目委托QtGui.QItemDelegate,更多信息你可以在qt示例中搜索来实现这个委托,我有一个小例子,希望对你有所帮助;

import sys
from PyQt4 import QtGui, QtCore

class QCustomDelegate (QtGui.QItemDelegate):
    def __init__(self, *args, **kwargs):
        QtGui.QItemDelegate.__init__(self, *args, **kwargs)
        self.listsData = ['Data 1', 'Data 2', 'Data 3']

    def createEditor (self, parentQWidget, optionQStyleOptionViewItem, indexQModelIndex):
        column = indexQModelIndex.column()
        if column == 0:
            editorQWidget = QtGui.QComboBox(parentQWidget)
            editorQWidget.clear()
            for data in self.listsData:
                editorQWidget.addItem(data)
            return editorQWidget
        else:
            return QtGui.QItemDelegate.createEditor(self, parentQWidget, optionQStyleOptionViewItem, indexQModelIndex)

    def setEditorData (self, editorQWidget, indexQModelIndex):
        column = indexQModelIndex.column()
        if column == 0:
            index, _ = indexQModelIndex.model().data(indexQModelIndex, QtCore.Qt.EditRole).toInt()
            editorQWidget.setCurrentIndex(index)
        else:
            QtGui.QItemDelegate.setEditorData(self, editorQWidget, indexQModelIndex)

    def setModelData (self, editorQWidget, modelQAbstractItemModel, indexQModelIndex):
        column = indexQModelIndex.column()
        if column == 0:
            index = editorQWidget.currentIndex()
            modelQAbstractItemModel.setData(indexQModelIndex, index, QtCore.Qt.EditRole)
        else:
            QtGui.QItemDelegate.setModelData(self, editorQWidget, modelQAbstractItemModel, indexQModelIndex)

    def updateEditorGeometry(self, editorQWidget, optionQStyleOptionViewItem, indexQModelIndex):
        column = indexQModelIndex.column()
        if column == 0:
            editorQWidget.setGeometry(optionQStyleOptionViewItem.rect)
        else:
            QtGui.QItemDelegate.updateEditorGeometry(self, editorQWidget, optionQStyleOptionViewItem, indexQModelIndex)

    def paint (self, painterQPainter, optionQStyleOptionViewItem, indexQModelIndex):
        column = indexQModelIndex.column()
        if column == 0:
            value, _ = indexQModelIndex.model().data(indexQModelIndex, QtCore.Qt.EditRole).toInt()
            self.drawDisplay(painterQPainter, optionQStyleOptionViewItem, optionQStyleOptionViewItem.rect, QtCore.QString(self.listsData[value]));
        else:
            QtGui.QItemDelegate.paint(self, painterQPainter, optionQStyleOptionViewItem, indexQModelIndex)

class QCustomTableWidget (QtGui.QTableWidget):
    def __init__ (self, parent = None):
        super(QCustomTableWidget, self).__init__(parent)
        # Setup row & column data
        listsVerticalHeaderItem = ['Device 1', 'Device 2', 'Device 3', 'Device 4', 'Device 5']
        self.setRowCount(len(listsVerticalHeaderItem))
        for index in range(self.rowCount()):
            self.setVerticalHeaderItem(index, QtGui.QTableWidgetItem(listsVerticalHeaderItem[index]))
        self.setColumnCount(5)
        listsHorizontalHeaderItem = ['Option 1', 'Option 2']
        self.setColumnCount(len(listsHorizontalHeaderItem))
        for index in range(self.columnCount()):
            self.setHorizontalHeaderItem(index, QtGui.QTableWidgetItem(listsHorizontalHeaderItem[index]))
        self.myQCustomDelegate = QCustomDelegate()
        self.setItemDelegate(self.myQCustomDelegate)
        # Test insert data
        index = 2
        self.setItem(0, 0, QtGui.QTableWidgetItem(str(index)))
        # Test read data
        index = int(self.item(0, 0).text())
        print self.myQCustomDelegate.listsData[index]


if __name__ == '__main__':
    myQApplication = QtGui.QApplication(sys.argv)
    myQCustomTableWidget = QCustomTableWidget()
    myQCustomTableWidget.show()
    sys.exit(myQApplication.exec_())

QtGui.QItemDelegate参考http://pyqt.sourceforge.net/Docs/PyQt4/qitemdelegate.html

Spin Box 委托示例(C++,也可以在 python 中实现)http://qt-project.org/doc/qt-4.8/itemviews-spinboxdelegate.html


问候,

【讨论】:

    【解决方案3】:
    self.nameoftablewidget.cellWidget(row,col).currentText()
    

    【讨论】:

    • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-05
    • 1970-01-01
    • 2023-03-06
    • 2013-10-12
    • 2016-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多