Python PyQt:搜索项目QTableWidget并获取它';s坐标?
因此,我使用了Python和PyQt,并创建了一个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
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_())