Python 如何根据条件正确取消选中Qtablewiget中的项
我创建了一个包含三列的表小部件。该表位于QQ向导中。它通过读取一个文件并将该文件的行放入其第一列来填充。它看起来像下面的图片。基本上,我希望程序的行为方式如下:Python 如何根据条件正确取消选中Qtablewiget中的项,python,python-2.7,pyqt,pyqt4,Python,Python 2.7,Pyqt,Pyqt4,我创建了一个包含三列的表小部件。该表位于QQ向导中。它通过读取一个文件并将该文件的行放入其第一列来填充。它看起来像下面的图片。基本上,我希望程序的行为方式如下: 如果选中了删除项目的一半和删除所有项目,则取消选中删除项目的一半,只保留行的删除所有项目。然后将行添加到文件中 按OK按钮执行 否则,如果只选中了删除一半项目或删除所有项目。将该行添加到文件中 按OK按钮执行 问题是,只有在我多次按Ok键时,它才会得到我想要的输出。 处理该行为的函数是def print\u checked(self):
删除项目的一半
和删除所有项目
,则取消选中删除项目的一半
,只保留行的删除所有项目
。然后将行添加到文件中
按OK按钮执行删除一半项目
或删除所有项目
。将该行添加到文件中
按OK按钮执行def print\u checked(self):
和def setChoice(self,item):
在您的代码中,取消选中时重复操作,以使改进代码成为可能的输出:如果标记为第一个添加1=2**0,如果标记为第二个添加2=2**1,则每行只有4个案例:[0,2**0,2**1,2**0+2**1]=[0,1,2,3] 更改:
def print_checked(self):
path = '/home/test1/items-to-mod.txt'
mode = 'a' if self.isWrittenTo else 'w'
user = self.table
d = dict([(x, 0) for x in range(self.table.rowCount())])
for item in self.choice:
d[item.row()] += 2 ** (item.column() - 1)
text = ""
for row, value in d.iteritems():
if value == 3: # They are both checked
print("fully remove %s" % user.item(row, 0).text())
user.item(row, 1).setCheckState(QtCore.Qt.Unchecked)
text += 'fully remove %s' % user.item(row, 0).text()
elif value == 2: # only second is checked
print('fully remove of %s' % user.item(row, 0).text())
text += 'fully remove %s' % user.item(row, 0).text()
elif value == 1: # only first is checked
print("remove half of %s" % user.item(row, 0).text())
text += 'remove half of %s' % user.item(row, 0).text()
with open(path, mode) as f:
f.write(text)
输出:
单击“确定”后:
在您的代码中,取消选中时重复操作,以使改进代码成为可能的输出:如果标记为第一个添加1=2**0,如果标记为第二个添加2=2**1,则每行只有4个案例:[0,2**0,2**1,2**0+2**1]=[0,1,2,3] 更改:
def print_checked(self):
path = '/home/test1/items-to-mod.txt'
mode = 'a' if self.isWrittenTo else 'w'
user = self.table
d = dict([(x, 0) for x in range(self.table.rowCount())])
for item in self.choice:
d[item.row()] += 2 ** (item.column() - 1)
text = ""
for row, value in d.iteritems():
if value == 3: # They are both checked
print("fully remove %s" % user.item(row, 0).text())
user.item(row, 1).setCheckState(QtCore.Qt.Unchecked)
text += 'fully remove %s' % user.item(row, 0).text()
elif value == 2: # only second is checked
print('fully remove of %s' % user.item(row, 0).text())
text += 'fully remove %s' % user.item(row, 0).text()
elif value == 1: # only first is checked
print("remove half of %s" % user.item(row, 0).text())
text += 'remove half of %s' % user.item(row, 0).text()
with open(path, mode) as f:
f.write(text)
输出:
单击“确定”后:
我要更改的第一件事是setChoice:它应该更清楚地反映状态,为至少有一个支票的每一行存储状态:半(1)、全(2)或两者(1+2=3): 这需要对选中的打印进行一些更改。有很多方法可以做到这一点,但我喜欢让代码反映意图:您需要“修复”或“调整”一个有2个复选标记的行;然后像往常一样处理。我还简化了一些格式字符串。结果是:
with open(path, mode) as f:
for item_row, checked in self.choice.items():
item_text = user.item(item_row, 0).text()
if checked == 3: # delete == "remove all of item" and user.item(item.row(), 1).checkState() == QtCore.Qt.Checked:
# need to fix it!
item_half = user.item(item_row, 1)
item_half.setCheckState(QtCore.Qt.Unchecked)
checked = 2
f.write('fixing %s\n' % item_text)
delete = user.horizontalHeaderItem(checked).text()
if checked == 1: # delete == "remove half of item":
f.write ('%s is marked for %s\n' % (item_text, delete))
f.write('remove half of %s\n' % item_text)
elif checked == 2: # delete == "remove all of item":
f.write ('%s is marked for %s\n' % (item_text, delete))
f.write('fully remove %s\n' % item_text)
else:
f.write('%s\n' % item_text)
f.write(item_row, checked)
我要更改的第一件事是setChoice:它应该更清楚地反映状态,为至少有一个支票的每一行存储状态:半(1)、全(2)或两者(1+2=3): 这需要对选中的打印进行一些更改。有很多方法可以做到这一点,但我喜欢让代码反映意图:您需要“修复”或“调整”一个有2个复选标记的行;然后像往常一样处理。我还简化了一些格式字符串。结果是:
with open(path, mode) as f:
for item_row, checked in self.choice.items():
item_text = user.item(item_row, 0).text()
if checked == 3: # delete == "remove all of item" and user.item(item.row(), 1).checkState() == QtCore.Qt.Checked:
# need to fix it!
item_half = user.item(item_row, 1)
item_half.setCheckState(QtCore.Qt.Unchecked)
checked = 2
f.write('fixing %s\n' % item_text)
delete = user.horizontalHeaderItem(checked).text()
if checked == 1: # delete == "remove half of item":
f.write ('%s is marked for %s\n' % (item_text, delete))
f.write('remove half of %s\n' % item_text)
elif checked == 2: # delete == "remove all of item":
f.write ('%s is marked for %s\n' % (item_text, delete))
f.write('fully remove %s\n' % item_text)
else:
f.write('%s\n' % item_text)
f.write(item_row, checked)
我不能理解你的要求。在这两种情况下,行是否添加到文件中?在第一种情况下:是否仅在删除项目的一半时删除复选框?是的,该行被添加到文件中,但我必须一直按Ok按钮,以便它在文件中显示正确的输出。还有一件事,如果您知道将复选框置于表格单元格中心的方法,我无法理解您的要求。在这两种情况下,行是否添加到文件中?在第一种情况下:复选框是否仅在删除项目的一半时被删除?是的,行被添加到文件中,但我必须一直按Ok按钮,以便它在文件中显示正确的输出另一件事,如果您知道将复选框置于表格单元格中心的方法,这将是一种令人惊叹的方法,您应该解释OP的错误,并且最好是这样(如果可能的话,也就是只更改了几个代码块)只发布需要更改的代码,因为它不支持并行差异。它完全按照我喜欢的方式工作,但您能否解释这行代码是如何工作的?我有一个想法,但不完全确定
d=dict([(x,0)表示范围内的x(self.table.rowCount()))对于self.choice中的项:d[item.row()]+=2**(item.column()-1)
A**k={A*A*A*…*A}K-TimeSeldWrad,但我认为列表理解和幂公式使这个方法难以理解。@ Sulclii我只编码1和0,例如,如果两者都被标记:11,如果我只设置第一个,01,如果我设置第二个,10个,如果没有,00,如果我们认为它们是二进制的数字。理想情况下(如果可能的话,也就是只更改了几个代码块)只发布需要更改的代码,因为它不支持并行差异。它完全按照我喜欢的方式工作,但您能否解释这行代码是如何工作的?我有一个想法,但不完全确定d=dict([(x,0)表示范围内的x(self.table.rowCount()))对于self.choice中的项:d[item.row()]+=2**(item.column()-1)
A**k={A*A*A*…*A}K TimeSeLo做了,但我认为列表理解和幂公式使方法难以理解。@ Sulclii我只编码1和0,例如,如果两者都被标记:11,如果我只设置第一个,01,如果我设置第二个,10个,如果没有,00,如果我们认为它们是二进制的数字。
with open(path, mode) as f:
for item_row, checked in self.choice.items():
item_text = user.item(item_row, 0).text()
if checked == 3: # delete == "remove all of item" and user.item(item.row(), 1).checkState() == QtCore.Qt.Checked:
# need to fix it!
item_half = user.item(item_row, 1)
item_half.setCheckState(QtCore.Qt.Unchecked)
checked = 2
f.write('fixing %s\n' % item_text)
delete = user.horizontalHeaderItem(checked).text()
if checked == 1: # delete == "remove half of item":
f.write ('%s is marked for %s\n' % (item_text, delete))
f.write('remove half of %s\n' % item_text)
elif checked == 2: # delete == "remove all of item":
f.write ('%s is marked for %s\n' % (item_text, delete))
f.write('fully remove %s\n' % item_text)
else:
f.write('%s\n' % item_text)
f.write(item_row, checked)