def addVote(self, bookName, bookId, userName, passwd, userType, userBigSmall, recVoteNum, advVoteNum):
        "This slot will be invoked once the 'userDropped' signal is emitted from bookListWidget."

        matchlist = self.findItems(bookName, Qt.MatchExactly, 0)
        exist_userType = None
        exist_userName = None
        if len(matchlist) > 0:
            bookItem = self.findItems(bookName, Qt.MatchExactly, 0)[0]
            exist_userType = bookItem.child(0).text(1)
            exist_userName = bookItem.child(0).text(0)
        result = rule.validationForAddVote(bookName, bookId, userName, userType, exist_userName, exist_userType, recVoteNum, advVoteNum)
        if result:
            QMessageBox.information(self, u'提示:', result, QMessageBox.Ok)
            return

        realRecVoteNum, realAdvVoteNum, remainRecVoteNum, remainAdvVoteNum = rule.getRealRemainVoteNum(userBigSmall, recVoteNum, advVoteNum)

        # emit the remain vote num signal to update userTableWidget
        self.emit(SIGNAL('voteCompleted'), userName, remainRecVoteNum, remainAdvVoteNum)
        
        voteData = self.appdata.getVoteData()
        voteData.addData(bookName, bookId, userName, passwd)
        with open('data', 'w') as file:
            pickle.dump(self.appdata, file)

        self.__addNewRowOnVoteTree(bookName, bookId, userName, passwd, userType, userBigSmall, realRecVoteNum, realAdvVoteNum)
    def updateUserTableByUserName(self, userName):
        # find matched userItem
        userItems = self.findItems(userName, Qt.MatchExactly)
        for userItem in userItems:
            if self.column(userItem) == 0:
                break
        else:
            # (1) match failed, so we skipped to update vote tree widget.
            return None
        row = self.row(userItem)

        # userType, userBigSmall, recVoteNum, advVoteNum
        userType = self.item(row, 1).text()
        userBigSmall = self.item(row, 2).text()
        recVoteNum = self.item(row, 3).text()
        advVoteNum = self.item(row, 4).text()

        # (2) login failed, so we skipped to update vote tree widget.
        if int(recVoteNum) == -1:
            return None
                
        realRecVoteNum, realAdvVoteNum, remainRecVoteNum, remainAdvVoteNum = rule.getRealRemainVoteNum(userBigSmall, recVoteNum, advVoteNum)

        self.item(row, 3).setText(remainRecVoteNum)
        self.item(row, 4).setText(remainAdvVoteNum)
        
        return (userType, userBigSmall, realRecVoteNum, realAdvVoteNum)