2017-10-18 77 views
0

我在tableWidget單元格(總是在第1列)中遞歸地添加了一些checkBox。這些複選框的最終數量未定義,取決於用戶輸入。先前添加QCheckBox(es)上的qt signal-slot遞歸添加

QStringList matID; 
for(int i=0; i<matID.size(); i++ 
{ 
    ui->tableWidget->insertRow(ui->tableWidget->rowCount()); 

    QCheckBox *checkBox = new QCheckBox(); 
    ui->tableWidget->setItem(ui->tableWidget->rowCount()-1,0,checkBox) 
} 

我想連接它們中的每一個與信號插槽連接,告訴我哪一個已被檢查。

任何人都可以幫助我嗎?我真的不明白怎麼做了......

感謝 朱塞佩

+1

簡單地把for循環添加:'連接(複選框,&QCheckBox :: stateChanged,[=](INT狀態){qDebug()<< 「複選框點擊」 <<狀態;});' – user3606329

+0

謝謝,但是像你說的我不能說哪一個被檢查過:我總是得到2或者0,無論哪個複選框被點擊 – piepolitb

+0

我最好解釋一下我自己:我想發出一個信號,它給了我i的值行號,點擊複選框) – piepolitb

回答

0

有此問題的四種解決方案。我只會描述最乾淨的可能性。

最好的解決方案是實際使您的物品可檢查。您可以通過使用setFlags()設置項目上的Qt::ItemIsUserCheckable標誌來完成此操作,請記住還要保留默認值。

QStringList matID; 
for(int i=0; i<matID.size(); i++ 
{ 
    ui->tableWidget->insertRow(ui->tableWidget->rowCount()); 

    QTableWidgetItem *item = ui->tableWidget->getItem(ui->tableWidget->rowCount()-1,0); 
    item->setFlags(item->getFlags() | Qt::ItemIsUserCheckable); 
} 

然後,在Qt/C++: Signal for when a QListWidgetItem is checked?解釋(ItemWidgets足夠相似),然後你可以監聽itemChanged並檢查使用checkState()

其他方法是:

  • 爲您的列

  • 的委託創建QSignalMapper到自己QCheckBox指針映射到某個值,它標識您的行

  • 使用QObject::sender()成員函數來確定哪個複選框是負責的,並將其自行解析回行。