正确取消选中Qtablewiget中的项目我创建了一个包含三列的表格窗口小部件。该表位于qwizard内部。它通过读取文件并将该文件的行放入第一列来填充。它看起来像下面的图片。基本上,我想程序的行为是这样的:如何根据条件
如果两个
remove half of item
和remove all of item
进行检查,取消remove half of item
只留下remove all of item
为row.Then行添加到文件中。按OK按钮
否则,如果只
remove half of item
或remove all of item
检查执行它。将该行添加到文件中。按OK按钮
的问题是,它与我的期望输出结束了,但只有当我按OK多次 处理该行为的功能执行它是def print_checked(self):
和def setChoice(self, item):
from PyQt4 import QtCore, QtGui
import sys
class TablePage(QtGui.QWizardPage):
def __init__(self, parent=None):
super(TablePage, self).__init__(parent)
self.isWrittenTo = False
self.table = QtGui.QTableWidget()
self.table.setGeometry(200, 200, 200, 200)
self.configureTable(self.table)
self.table.verticalHeader().hide()
self.buttonBox = QtGui.QDialogButtonBox(self)
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Ok)
self.horizontalLayout = QtGui.QHBoxLayout()
self.verticalLayout = QtGui.QVBoxLayout(self)
self.horizontalLayout.addWidget(self.table)
self.verticalLayout.addLayout(self.horizontalLayout)
self.verticalLayout.addWidget(self.buttonBox)
self.buttonBox.accepted.connect(self.print_checked)
self.buttonBox.rejected.connect(self.close)
self.choice = []
self.table.itemChanged.connect(self.setChoice)
def configureTable(self, table):
rowf = 0
rowx = 0
table.setColumnCount(3)
table.setHorizontalHeaderItem(0, QtGui.QTableWidgetItem("Whole items"))
table.setHorizontalHeaderItem(1, QtGui.QTableWidgetItem("remove half of item"))
table.setHorizontalHeaderItem(2, QtGui.QTableWidgetItem("remove all of item"))
header = table.horizontalHeader()
header.setResizeMode(0, QtGui.QHeaderView.ResizeToContents)
header.setResizeMode(1, QtGui.QHeaderView.ResizeToContents)
table.horizontalHeader().setStretchLastSection(True)
item_list = []
with open("/home/test1/items.txt") as in_file:
if in_file is not None:
xvar = in_file.readlines()
for line in xvar:
item_list.append(line)
rowf += 1
table.setRowCount(rowf)
for linex in item_list:
x = QtGui.QTableWidgetItem()
table.setItem(rowx, 0, x)
rowx += 1
x.setText(linex)
for column in range(3):
for row in range(rowf):
if column % 3:
self.item = QtGui.QTableWidgetItem(column)
self.item.setFlags(QtCore.Qt.ItemIsUserCheckable |
QtCore.Qt.ItemIsEnabled)
self.item.setCheckState(QtCore.Qt.Unchecked)
self.item.setTextAlignment(QtCore.Qt.AlignHCenter)
table.setItem(row, column, self.item)
def setChoice(self, item):
if item.checkState() == QtCore.Qt.Checked:
self.choice.append(item)
if item.checkState() == QtCore.Qt.Unchecked:
self.choice.remove(item)
def print_checked(self):
path = '/home/test1/items-to-mod.txt'
mode = 'a' if self.isWrittenTo else 'w'
user = self.table
if len(self.choice) > 0:
with open(path, mode) as f:
for item in self.choice:
delete = user.horizontalHeaderItem(item.column()).text()
if delete == "remove all of item" and user.item(item.row(), 1).checkState() == QtCore.Qt.Checked:
user.item(item.row(), 1).setCheckState(QtCore.Qt.Unchecked)
print ('%s' % user.item(item.row(), 0).text() + 'is marked for %s' % delete)
f.write('fully remove %s' % user.item(item.row(), 0).text())
elif delete == "remove half of item":
print ('%s' % user.item(item.row(), 0).text() + 'is marked for %s' % delete)
f.write('remove half of %s' % user.item(item.row(), 0).text())
elif delete == "remove all of item":
print ('%s' % user.item(item.row(), 0).text() + 'is marked for %s' % delete)
f.write('fully remove %s' % user.item(item.row(), 0).text())
else:
print('%s' % item.text())
print (item.row(), item.column())
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
wizard = QtGui.QWizard()
tablepage = TablePage()
wizard.addPage(tablepage)
wizard.button(QtGui.QWizard.NextButton).clicked.connect(tablepage.print_checked)
wizard.show()
sys.exit(app.exec_())
我无法理解您的要求。在这两种情况下是添加到文件的行?在第一种情况下:是否仅在删除一半项目时才移除支票? – eyllanesc
是的,该行被添加到文件中,但我必须一直按Ok按钮才能在文件中显示正确的输出 – answerSeeker
另一件事是,如果您知道一种将表格单元格中的复选框居中的方法太棒了 – answerSeeker