簡體   English   中英

PyQt對單擊項的奇怪行為

[英]PyQt strange behavior on clicked items

我有一個包含多行的表,在第0列上放了一個復選框,定義如下:

for char in accounts:
    for columnNumber in range(numberColumns):
        pWidget = QWidget()
        pCheckbox = QCheckBox()
        pLayout = QVBoxLayout(pWidget)
        pLayout.addWidget(pCheckbox)
        pLayout.setAlignment(Qt.AlignCenter)
        pLayout.setContentsMargins(0, 0 ,0, 0)
        pCheckbox.setCheckState(False)
        pCheckbox.clicked.connect(self.handleItemClicked)
        pWidget.setLayout(pLayout)
        self.mainAccountTable.insertRow(currentRowCount)
        self.mainAccountTable.setCellWidget(currentRowCount, 0, pWidget)
        self.mainAccountTable.setItem(currentRowCount, 1, QTableWidgetItem(char[1]))

我有一個連接的方法來處理點擊:

def handleItemClicked(self):
    try:
        #self.accountsSelected = []
        for account in range(self.mainAccountTable.rowCount()):
            if self.mainAccountTable.cellWidget(account, 0).findChild(type(QCheckBox())).isChecked():
                self.accountsSelected.add(self.mainAccountTable.item(account, 1).text())
                print ("yes:",self.accountsSelected)
            else:
                self.accountsSelected.remove(self.mainAccountTable.item(account, 1).text())
                print ("no:",self.accountsSelected)
    except Exception as e:
        print ("Error",e)

令我困擾的是,它工作得很好,但是只有當我選中或取消選中第一個復選框(第0行,第0列)時,它才會刷新結果。 我也嘗試過將信號與已toggled ...連接相同。 因此,當我檢查或取消選中除第一行以外的其他行時,如何使它更新結果? 提前致謝。

以后的編輯:我更新它的代碼,輸出是這樣的:如果我選中除第一個復選框以外的其他復選框,則輸出為: 'Account1' ,如果我選擇了,假設有5個帳戶,並且我也選中了第一個復選框這是輸出:

    yes: {'Account2', 'Account1'}
    yes: {'Account2', 'Account1'}
    yes: {'Account2', 'Account1', 'Account3'}
    yes: {'Account2', 'Account1', 'Account3', 'Account4'}
    yes: {'Account2', 'Account1', 'Account3', 'Account4', 'Account5'}
    Error: 'Account 6' #is not selected which is true, BUT WHY is checking also for that?!?!

有n = rowCount() pCheckBoxes。 但只有1個pCheckBox的clicked()信號連接到self.handleItemClicked() 在代碼的第一部分中使用connect() ,以連接每個pCheckBox。 由於存在n個pCheckbox,pWidgets,pLayouts刪除“自身”:

            pWidget = QWidget()
            pCheckbox = QCheckBox()
            pLayout = QVBoxLayout(pWidget)
            pLayout.addWidget(pCheckbox)
            pLayout.setAlignment(Qt.AlignCenter)
            pLayout.setContentsMargins(0, 0 ,0, 0)
            pCheckbox.setCheckState(False)
            pCheckBox.clicked.connect(self.handleItemClicked)
            pWidget.setLayout(pLayout)
            self.mainAccountTable.insertRow(currentRowCount)
            self.mainAccountTable.setCellWidget(currentRowCount, 0, pWidget)

該錯誤在“ else”分支中,並且解決方法是為每個檢查設置兩個for循環:

def handleItemClicked(self, account):
    try:
        accountsSelected = set()

        for account in range(self.mainAccountTable.rowCount()):
            if self.mainAccountTable.cellWidget(account, 0).findChild(type(QCheckBox())).isChecked():
                accountsSelected.add(self.mainAccountTable.item(account, 1).text())                    
                print ("selected:",accountsSelected)
        for account in range(self.mainAccountTable.rowCount()):
            if not self.mainAccountTable.cellWidget(account, 0).findChild(type(QCheckBox())).isChecked():
                accountsSelected.remove(self.mainAccountTable.item(account, 1).text())
                print ("not selected:",accountsSelected)  

        print ("main:", accountsSelected)
        return accountsSelected
    except Exception as e:
        print ("error:",e)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM