如何从QTableWidget获取多个QComboBox的文本

0 投票
3 回答
3705 浏览
提问于 2025-04-18 17:48

我在一个QTableWidget里插入了很多的QComboBox,使用的是setCellWidget这个方法(我不知道有多少个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()的方法。

3 个回答

-1

在编程中,有时候我们会遇到一些问题,尤其是在使用某些工具或库的时候。这些问题可能会让我们感到困惑,不知道该如何解决。比如,有人可能在使用一个特定的功能时,发现它没有按照预期工作,这时候就需要去查找原因。

通常,我们可以通过查看文档、搜索网上的解决方案或者向其他开发者请教来找到答案。很多时候,其他人可能也遇到过类似的问题,他们会在论坛或者社区里分享他们的经验和解决办法。

在这些讨论中,大家会提供一些代码示例,帮助理解问题所在。这些代码示例有时候会用到一些占位符,比如

self.nameoftablewidget.cellWidget(row,col).currentText()
,这些是用来表示代码的地方,具体的代码内容可能会根据不同的情况而变化。

总之,遇到问题时,不要着急,先冷静下来,寻找资源和帮助,通常都能找到解决方案。

0

如果你想使用:

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

旋转框代理示例(C++,你也可以用Python实现) : http://qt-project.org/doc/qt-4.8/itemviews-spinboxdelegate.html


祝好,

7

如果你用过 setCellWidget 这个功能,那么当你调用 cellWidget(0,1) 时,它会返回一个 QWidget,而不是一个 QTableWidgetItem。

你可能需要把这个 QWidget 转换成 QComboBox,但这样你就可以使用 currentText() 这个方法了。

撰写回答