Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何获得多个QComboxes';来自QTableWidget的文本_Python_Qt_Qt4_Pyqt_Pyqt4 - Fatal编程技术网

Python 如何获得多个QComboxes';来自QTableWidget的文本

Python 如何获得多个QComboxes';来自QTableWidget的文本,python,qt,qt4,pyqt,pyqt4,Python,Qt,Qt4,Pyqt,Pyqt4,我已经用setCellWidget在QTableWidget中插入了很多qcombox(我不知道qcombox的数量,因为它来自MySQL)。但当我想从表中获取它的文本时 self.table.item(0,1).itemText() 或 或 它不起作用。 通常我可以通过combobox.currentText()获取文本,但表中有许多组合框,我不知道行和列(x,y)信息。因此,我应该使用类似于.item(14,1)的东西。text()如果您使用了setCellWidget,那么调用cell

我已经用setCellWidget在QTableWidget中插入了很多qcombox(我不知道qcombox的数量,因为它来自MySQL)。但当我想从表中获取它的文本时

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

它不起作用
通常我可以通过
combobox.currentText()
获取文本,但表中有许多组合框,我不知道行和列(x,y)信息。因此,我应该使用类似于.item(14,1)的东西。text()

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


您可能需要将此QWidget强制转换为QComboBox,但是如果您使用了
setCellWidget
,那么您应该能够调用
currentText()
,然后调用
cellWidget(0,1)
而不是
item(0,1)
将返回一个QWidget,而不是一个QTableWidgetItem

您可能需要将此QWidget强制转换为QComboBox,但是如果您想使用,您应该能够调用
currentText()

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

我不能直接使用项目小部件。我建议您使用item delegate
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
参考

旋转框委托示例(C++,也可以用python实现)


关于,

如果您想使用

self.table.item(0,1).itemText() 
self.nameoftablewidget.cellWidget(row,col).currentText()

我不能直接使用项目小部件。我建议您使用item delegate
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
参考

旋转框委托示例(C++,也可以用python实现)



关于,

你的目标是什么?您正在尝试从特定的QComboBox提取所选字符串吗?所有的线?所有的QCOMBOX?如果“通常不知道行和列”,如何决定选择哪些元素?如果没有进一步的信息和/或一些代码摘录,您的问题太模糊,无法正确回答。好的。看这张图片:我想在不使用combobox.currentText()的情况下获取文本“abc”。我必须使用行和列信息调用它。当调用
self.table.item(行,列).currentText()
时会发生什么?我不明白为什么这不起作用AttributeError:'NoneType'对象没有属性'currentText'您的目标到底是什么?您正在尝试从特定的QComboBox提取所选字符串吗?所有的线?所有的QCOMBOX?如果“通常不知道行和列”,如何决定选择哪些元素?如果没有进一步的信息和/或一些代码摘录,您的问题太模糊,无法正确回答。好的。看这张图片:我想在不使用combobox.currentText()的情况下获取文本“abc”。我必须使用行和列信息调用它。当调用
self.table.item(行,列).currentText()
时会发生什么?我不明白为什么这不起作用AttributeError:'NoneType'对象没有属性'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++我记不起是否需要强制转换。首先尝试调用self.table.cellWidget(0,1).currentText()。哦,天哪,它工作得非常好。我怎么会错过呢?@FlamFace self.table.cellWidget(0,1).currentText()我找到了解决问题的方法------->>>QComboBox*combo=(QComboBox*)webFilterCat->cellWidget(I,2);qDebug()currentText();对于qtc++来说,虽然这个代码片段可以解决这个问题,但它确实有助于提高文章的质量。请记住,您将在将来回答读者的问题,而这些人可能不知道您的代码建议的原因。虽然此代码片段可以解决问题,但确实有助于提高您文章的质量。请记住,您将在将来回答读者的问题,这些人可能不知道您的代码建议的原因。
self.nameoftablewidget.cellWidget(row,col).currentText()
self.nameoftablewidget.cellWidget(row,col).currentText()