Python 如何根据条件正确取消选中Qtablewiget中的项

Python 如何根据条件正确取消选中Qtablewiget中的项,python,python-2.7,pyqt,pyqt4,Python,Python 2.7,Pyqt,Pyqt4,我创建了一个包含三列的表小部件。该表位于QQ向导中。它通过读取一个文件并将该文件的行放入其第一列来填充。它看起来像下面的图片。基本上,我希望程序的行为方式如下: 如果选中了删除项目的一半和删除所有项目,则取消选中删除项目的一半,只保留行的删除所有项目。然后将行添加到文件中 按OK按钮执行 否则,如果只选中了删除一半项目或删除所有项目。将该行添加到文件中 按OK按钮执行 问题是,只有在我多次按Ok键时,它才会得到我想要的输出。 处理该行为的函数是def print\u checked(self):

我创建了一个包含三列的表小部件。该表位于QQ向导中。它通过读取一个文件并将该文件的行放入其第一列来填充。它看起来像下面的图片。基本上,我希望程序的行为方式如下:

  • 如果选中了
    删除项目的一半
    删除所有项目
    ,则取消选中
    删除项目的一半
    ,只保留行的
    删除所有项目
    。然后将行添加到文件中

    按OK按钮执行

  • 否则,如果只选中了
    删除一半项目
    删除所有项目
    。将该行添加到文件中

    按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)