2013-03-17 60 views
3

我有一個QTableWidget,它上面有一些QTableWidgetsItems。有些項目使用複選框。我已經添加使用如下代碼複選框:Catch QTableWidgetItem檢查狀態更改

QTableWidgetsItem->setCheckState(Qt::Checked); 

我現在想調用一些功能時,該複選框狀態變化。例如使用一個信號。

什麼可能是最簡單的方法來實現這一目標?

回答

2

最簡單的方法是捕獲包含QTableWidget的類中包含槽的QTableWidget的信號。儘管看起來QTableWidget::itemActivated可能是我們最好的選擇,但是當Qt::CheckState等於Qt::Checked時,這是否發出是不確定的。此外,即使這是真的,信號也不會爲您提供處理應用程序可能需要執行的項目取消選中的功能。

所以,這裏是我提出的解決方案。捕獲包含QTableWidget的類中定義的插槽的QTableWidget::itemPressedQTableWidget::itemClicked信號。由於itemPressed應該在釋放鼠標按鈕之前被調用,並且在釋放鼠標按鈕之後應該調用itemClicked,所以QTableWidgetItem的Qt :: CheckState應該只設置在這兩個信號發射之間。因此,您可以確定QTableWidgetItem的checkState何時發生更改,並且內存開銷較低。

這裏是什麼這些插槽可能看起來像一個例子:

void tableItemPressed(QTableWidgetItem * item) 
{ 
    // member variable used to keep track of the check state for a 
    // table widget item currently being pressed 
    m_pressedItemState = item->checkState(); 
} 

void tableItemClicked(QTableWidgetItem * item) 
{ 
    // if check box has been clicked 
    if (m_pressedItemState != item->checkState()) 
    { 
     // perform check logic here 
    } 
} 

而且信號/插槽將連接如下:

connect(m_tableWidget,SIGNAL(itemPressed(QTableWidgetItem *)),this,SLOT(tableItemPressed(QTableWidgetItem *))); 
connect(m_tableWidget,SIGNAL(itemClicked(QTableWidgetItem *)),this,SLOT(tableItemClicked(QTableWidgetItem *))); 

哪裏m_tableWidget是你關聯的QTableWidget *您表格小部件。

+0

謝謝你工作得很好,並與低開銷檢查。 ;) – RandomGuy 2013-03-21 17:55:59

+1

該示例沒有考慮按空格鍵檢查/取消選中的可能性。你可以通過使用cellChanged信號來修復它。 – Adam 2016-09-24 09:58:33

+0

@Adam你的解決方案更好,爲我工作。 – 2017-02-19 21:44:19