捕捉 QTableWidgetItem 检查状态变化

Ran*_*Guy 6 c++ qt qt4

我有一个带有一些 QTableWidgetsItems 的 QTableWidget。有些项目使用复选框。我使用以下代码添加了复选框:

QTableWidgetsItem->setCheckState(Qt::Checked);
Run Code Online (Sandbox Code Playgroud)

我现在想在这个复选框状态改变时调用一些函数。例如使用信号。

实现这一目标的最简单方法是什么?

Sir*_*sar 5

最简单的方法是在包含 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
    }
}
Run Code Online (Sandbox Code Playgroud)

信号/插槽将按如下方式连接:

connect(m_tableWidget,SIGNAL(itemPressed(QTableWidgetItem *)),this,SLOT(tableItemPressed(QTableWidgetItem *)));
connect(m_tableWidget,SIGNAL(itemClicked(QTableWidgetItem *)),this,SLOT(tableItemClicked(QTableWidgetItem *)));
Run Code Online (Sandbox Code Playgroud)

哪里m_tableWidgetQTableWidget *你与你的表格部件关联。