Python PyQt:搜索项目QTableWidget并获取它';s坐标?

Python PyQt:搜索项目QTableWidget并获取它';s坐标?,python,search,pyqt,qtablewidget,Python,Search,Pyqt,Qtablewidget,因此,我使用了Python和PyQt,并创建了一个QTableWidget,其中填充了数据 是否有一种方法可以搜索特定的值,如果程序找到了什么,它能否返回该项的协调(索引) 更新: 代码如下: program2.py: # -*- coding: utf-8 -*- #imports: import os import platform import sys from PyQt4 import QtCore, QtGui from PyQt4.QtCore import * from PyQt4

因此,我使用了PythonPyQt,并创建了一个
QTableWidget
,其中填充了数据

是否有一种方法可以搜索特定的值,如果程序找到了什么,它能否返回该项的
协调(索引)

更新:
代码如下:

program2.py:

# -*- coding: utf-8 -*-
#imports:
import os
import platform
import sys
from PyQt4 import QtCore, QtGui
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import newchilddlg
from newchilddlg import *
from PyKDE4.kdeui import KDateComboBox
import xlrd
import xlwt


#version:
__version__ = "1.0.0"


#Main Window Class:
class MainWindow(QMainWindow):


    #__init__ function:
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)


        #Window size:
        self.resize(800,600)
        self.centralwidget = QtGui.QWidget(self)
        self.horizontalLayout = QtGui.QHBoxLayout(self.centralwidget)


        #Table Widget:
        self.tableWidget = QtGui.QTableWidget(self.centralwidget)
        self.vBar = self.tableWidget.verticalScrollBar()
        self._vBar_lastVal = self.vBar.value()
        self.horizontalLayout.addWidget(self.tableWidget)
        self.vBar.valueChanged.connect(self.scrollbarChanged)
        self.tableWidget.setGridStyle(QtCore.Qt.SolidLine)
        self.tableWidget.setRowCount(100)
        self.tableWidget.setColumnCount(28)
        item = QtGui.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(0, item)
        self.tableWidget.horizontalHeader().setDefaultSectionSize(160)
        self.tableWidget.horizontalHeader().setHighlightSections(True)
        self.tableWidget.horizontalHeader().setStretchLastSection(False)
        self.tableWidget.verticalHeader().setDefaultSectionSize(30)
        self.tableWidget.verticalHeader().setStretchLastSection(False)
        self.horizontalLayout.addWidget(self.tableWidget)
        self.setCentralWidget(self.centralwidget)


        #Window Title:
        self.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
        self.tableWidget.setSortingEnabled(False)


        #Collumns'names:
        item = self.tableWidget.horizontalHeaderItem(0)
        item.setText(QtGui.QApplication.translate("MainWindow", "Α.Μ.", None, QtGui.QApplication.UnicodeUTF8))


        #menubar:
        self.menubar = QtGui.QMenuBar(self)
        self.menubar.setEnabled(True)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
        self.menuFile = self.menubar.addMenu("&File")
        self.menuFile.setSizeIncrement(QtCore.QSize(0, 0))
        self.menuEdit = self.menubar.addMenu("&Edit")
        self.setMenuBar(self.menubar)
        self.menuFile.setTitle(QtGui.QApplication.translate("MainWindow", "File", None, QtGui.QApplication.UnicodeUTF8))
        self.menuEdit.setTitle(QtGui.QApplication.translate("MainWindow", "Edit", None, QtGui.QApplication.UnicodeUTF8)) 


        #Creating Action filenewchild:
        self.filenewchild = self.createAction("&Εισαγωγή Ανηλίκου", self.doupdate, "Ctrl+C", "" ,"Εισαγωγή Δεδομέων Ανηλίκου")
        self.menuFile.addAction(self.filenewchild)
        self.filenewchild.setText(QtGui.QApplication.translate("MainWindow", "Εισαγωγή Ανηλίκου", None, QtGui.QApplication.UnicodeUTF8))


        #Creating Action Open File:
        self.fileopen = self.createAction("& Άνοιγμα Αρχείου", self.openfile, "Ctrl+O", "", "Εισαγωγή Δεδομένων από Αρχείο")
        self.menuFile.addAction(self.fileopen)
        self.fileopen.setText(QtGui.QApplication.translate("MainWindow", "Άνοιγμα Αρχείου", None, QtGui.QApplication.UnicodeUTF8))


        #Creating Action Save File
        self.filesave = self.createAction("& Άνοιγμα Αρχείου", self.savefile, "Ctrl+S", "", "Σώσιμο Δεδομένων σε Αρχείο")
        self.menuFile.addAction(self.filesave)
        self.filesave.setText(QtGui.QApplication.translate("MainWindow", "Σώσιμο Αρχείου", None, QtGui.QApplication.UnicodeUTF8)) 


    #Creating a function that opens an .xls file:
    def openfile(self):
            try:
                filename = unicode(QtGui.QFileDialog.getOpenFileName(self, 'Open File', '', ".xls(*.xls)"))
                wb = xlrd.open_workbook(filename)
                wb.sheet_names()
                self.sh = wb.sheet_by_index(0)
                if self.sh.nrows > self.tableWidget.rowCount():
                    self.tableWidget.setRowCount(self.sh.nrows)
                self.r = 0
                self.a = 0
                for i in range(self.sh.ncols):
                    self.new = self.sh.col_values(self.a)
                    self.add(self.a)
                    self.a += 1
                    self.r = 0
            except IOError:
                pass


    #Creating a function that converts float to integers and then to strings when necessary:                                 
    def add(self, c):
        for i in self.new:
             try:
                newItem = QtGui.QTableWidgetItem(str(int(i)))
             except ValueError:
                newItem = QtGui.QTableWidgetItem(unicode(i))    
             self.tableWidget.setItem(self.r, c, newItem)
             self.r += 1


    #Creating a function that saves to an .xls file:
    def savefile(self):
        try:
            filename = unicode(QtGui.QFileDialog.getSaveFileName(self, 'Save File', '', ".xls(*.xls)"))    
            wbk = xlwt.Workbook()
            self.sheet = wbk.add_sheet("sheet", cell_overwrite_ok=True)
            self.add2()
            wbk.save(filename)    
        except IOError:
            pass

    #Creating a function that puts data into place:
    def add2(self):
        row = 0
        col = 0         
        for i in range(self.tableWidget.columnCount()):
            for x in range(self.tableWidget.rowCount()):
                try:             
                    teext = unicode(self.tableWidget.item(row, col).text())
                    self.sheet.write(row, col, teext)
                    row += 1
                except AttributeError:
                    row += 1
            row = 0
            col += 1                                


    # Growing rows while scrolling down....
    def scrollbarChanged(self, val):
        bar = self.vBar
        minVal, maxVal = bar.minimum(), bar.maximum()
        avg = (minVal+maxVal)/2
        rowCount = self.tableWidget.rowCount()
        if val > self._vBar_lastVal and val >= avg:
            self.tableWidget.insertRow(rowCount)
        elif val < self._vBar_lastVal:
            lastRow = rowCount-30
            empty = True
            for col in xrange(self.tableWidget.columnCount()):
                item = self.tableWidget.item(lastRow, col)
                if item and item.text():
                    empty=False
                    break
            if empty:
                self.tableWidget.removeRow(lastRow)
        self._vBar_lastVal = val    


    #A function to help us create Actions faster:
    def createAction(self,text, slot=None, shortcut=None, icon=None,
                     tip=None, checkable=False, signal="triggered()"):
        action = QAction(text, self)
        if icon is not None:
            action.setIcon(QIcon(":/%s.png" % icon))
        if shortcut is not None:
            action.setShortcut(shortcut)
        if tip is not None:
            action.setToolTip(tip)
        if slot is not None:
            self.connect(action, SIGNAL(signal), slot)
        if checkable:
            action.setCheckable(True)
        return action    


    #A function that updates the table:
    def updatetable(self):
        r = self.tableWidget.currentRow()
        c=0
        for i in self.textlist:
            newItem = QtGui.QTableWidgetItem(i)
            self.tableWidget.setItem(r, c, newItem)
            c += 1
        c = 0        


    #Handles NewChildDlg actions:
    def doupdate(self):
        d = NewChildDlg(self)
        if d.exec_():
            text = d.lineEdit.text()
            text2 = d.lineEdit2.text()
            text3 = d.lineEdit3.text()
            text4 = d.lineEdit4.text()
            text5 = d.kdatecombobox.currentText()
            text6 = d.lineEdit5.text()
            text7 = d.combobox.currentText()
            text8 = d.lineEdit6.text()
            text9 = d.lineEdit7.text()
            text10 = d.lineEdit8.text()
            text11 = d.lineEdit9.text()
            text12 = d.lineEdit10.text()
            text13 = d.kdatecombobox2.currentText()
            text14 = d.lineEdit11.text()
            text15 = d.lineEdit12.text()
            text16 = d.kdatecombobox3.currentText()
            text17 = d.lineEdit13.text()
            text18 = d.combobox2.currentText()
            text19 = d.combobox3.currentText()
            text20 = d.textEdit.toPlainText()
            text21 = d.combobox4.currentText()
            text22 = d.combobox5.currentText()
            text23 = d.lineEdit14.text()
            text24 = d.lineEdit15.text()
            text25 = d.kdatecombobox4.currentText()
            text26 = d.combobox6.currentText()
            text27 = d.textEdit2.toPlainText()
            text28 = d.lineEdit16.text()
            self.textlist = [text, text2, text3, text4, text5, text6, text7, text8, text9, text10, text11,
                             text12, text13, text14, text15, text16, text17, text18, text19, text20, text21, text22,
                             text23, text24, text25, text26, text27, text28]
            self.updatetable()


#Main loop:
if __name__ == '__main__':
    app = QApplication(sys.argv)
    myapp = MainWindow()
    myapp.show()
    sys.exit(app.exec_())
你能看到错误吗?很抱歉,但我不确定哪部分错了。。。
我剪了一些不重要的部分

如果您在QTableWidget中使用QTableWidgetItems,则可以使用:

for row in xrange(table.rowCount ()):
   for column in xrange(table.columnCount ()):
       item = table.item (row, column )
       if item and item.data (Qt.DisplayRole) == "my_search_value":
           return table.indexFromItem (item)
 return None
用于获取匹配的
QTableWidgetItems
列表,然后可以查询它们的坐标

下面是一个简单的演示脚本:

from PyQt4 import QtGui, QtCore

class Window(QtGui.QWidget):
    def __init__(self, rows, columns):
        QtGui.QWidget.__init__(self)
        self.table = QtGui.QTableWidget(self)
        self.table.setRowCount(rows)
        self.table.setColumnCount(columns)
        for column in range(columns):
            for row in range(rows):
                item = QtGui.QTableWidgetItem('Text%d' % row)
                self.table.setItem(row, column, item)
        self.edit = QtGui.QLineEdit(self)
        self.button = QtGui.QPushButton('Search', self)
        self.button.clicked.connect(self.handleButton)
        layout = QtGui.QVBoxLayout(self)
        layout.addWidget(self.table)
        layout.addWidget(self.edit)
        layout.addWidget(self.button)

    def handleButton(self):
        items = self.table.findItems(
            self.edit.text(), QtCore.Qt.MatchExactly)
        if items:
            results = '\n'.join(
                'row %d column %d' % (item.row() + 1, item.column() + 1)
                for item in items)
        else:
            results = 'Found Nothing'
        QtGui.QMessageBox.information(self, 'Search Results', results)

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window(6, 3)
    window.resize(350, 300)
    window.show()
    sys.exit(app.exec_())

忘记在table.rowCount()之前写入xrange()。新问题:AttributeError:'NoneType'对象没有属性'data',这是逻辑性的,不是所有单元格都有值…您可以添加检查无对象。item=table.item(行、列)如果item和item.data(…):什么?怎么用?(对不起,我是个新手。)告诉我你是如何将数据放入表中的。仍然没有。。。你能检查一下其余的代码是否有问题吗?@Antoni4040。我已经在我的答案中添加了一个演示脚本,这样你就可以看到应该如何工作。是的,但是我如何在QLineEdit中编写一些东西呢?我认为我发现了真正的问题:我认为在newchildlg.py中,我正在创建一个新的主窗口,而不是使用现有的主窗口。。。我说的对吗?谢谢你们两位的帮助,我现在的问题似乎已经解决了,所以我问了一个新问题:
from PyQt4 import QtGui, QtCore

class Window(QtGui.QWidget):
    def __init__(self, rows, columns):
        QtGui.QWidget.__init__(self)
        self.table = QtGui.QTableWidget(self)
        self.table.setRowCount(rows)
        self.table.setColumnCount(columns)
        for column in range(columns):
            for row in range(rows):
                item = QtGui.QTableWidgetItem('Text%d' % row)
                self.table.setItem(row, column, item)
        self.edit = QtGui.QLineEdit(self)
        self.button = QtGui.QPushButton('Search', self)
        self.button.clicked.connect(self.handleButton)
        layout = QtGui.QVBoxLayout(self)
        layout.addWidget(self.table)
        layout.addWidget(self.edit)
        layout.addWidget(self.button)

    def handleButton(self):
        items = self.table.findItems(
            self.edit.text(), QtCore.Qt.MatchExactly)
        if items:
            results = '\n'.join(
                'row %d column %d' % (item.row() + 1, item.column() + 1)
                for item in items)
        else:
            results = 'Found Nothing'
        QtGui.QMessageBox.information(self, 'Search Results', results)

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window(6, 3)
    window.resize(350, 300)
    window.show()
    sys.exit(app.exec_())